【问题标题】:Forked allegro unit tests crash when run分叉的快板单元测试在运行时崩溃
【发布时间】:2022-01-26 04:04:09
【问题描述】:

我正在为 c 使用自定义单元测试系统,它将每个测试分叉到一个新进程中,这样如果一个测试崩溃,其他测试仍然可以不间断地执行。现在我正在尝试使用它来测试使用 Allegro 的代码。当我在main 中运行al_init()(如下所示)时,我的测试程序在第一次测试后终止并显示错误消息:

X connection to :1 broken (explicit kill or server shutdown).
X connection to :1 broken (explicit kill or server shutdown).
make: *** [Makefile:39: tests/results/collision.result] Error 1

错误代码导致问题:

void MakeCollisionCircleInWorldTest()
{
    Testing_Unimplemented();
}

/*
 * other unimplemented tests here, cropped for brevity
 */ 

int main(int argc, char **argv)
{
    al_init();
    Testing_Init(argc, argv);

    TESTING_RUN(MakeCollisionCircleInWorldTest);
    TESTING_RUN(DuplicateCollisionCircleTest);
    TESTING_RUN(AddCollisionCircleTest);
    TESTING_RUN(RemoveCollisionCircleTest);
    TESTING_RUN(MoveTest);
    TESTING_RUN(CheckCollisionsTest);

    return 0;
}

注意:执行上述分叉的是TESTING_RUN。我认为这与崩溃有关(也许连接在第一个孩子终止后被终止?),但我不确定如何解决,也不知道如何解决。

当我在每个测试中分别调用al_init() 时(如下所示),没有提前终止或错误消息,但它似乎有点慢(不是慢得难以忍受,但有一个明显的暂停应该'对于那些因为没有实现而立即失败的测试真的存在)。此外,为每个单独的测试重新启动 Allegro 似乎有点痛苦。

void MakeCollisionCircleInWorldTest()
{
    al_init();
    Testing_Unimplemented();
}

/*
 * other unimplemented tests here, cropped for brevity
 */ 

int main(int argc, char **argv)
{
    Testing_Init(argc, argv);

    TESTING_RUN(MakeCollisionCircleInWorldTest);
    TESTING_RUN(DuplicateCollisionCircleTest);
    TESTING_RUN(AddCollisionCircleTest);
    TESTING_RUN(RemoveCollisionCircleTest);
    TESTING_RUN(MoveTest);
    TESTING_RUN(CheckCollisionsTest);

    return 0;
}

是什么导致了崩溃?有什么方法可以在 main 中初始化 Allegro 而不会破坏我的测试?

【问题讨论】:

  • 您需要仔细检查 Allegro 文档中有关分叉进程的内容以及子进程、父进程或两者是否可以继续使用资源。这将控制您是否必须在每个分叉测试中重新初始化。到目前为止,您的证据表明您的测试确实需要建立自己的 Allegro 环境,而不是尝试继续使用父进程的 Allegro 环境副本。我对 Allegro 一无所知,所以我帮不上什么忙,但让每个孩子都进行设置、测试和拆卸似乎可能会奏效——不做似乎行不通。

标签: c unit-testing fork xorg allegro5


【解决方案1】:

这个问题是由al_init()al_uninstall_system 设置为atexit 函数引起的。结果是孩子在退出时执行了系统卸载。这可以通过调用al_install_system(ALLEGRO_VERSION_INT, NULL) 而不是al_init() 来防止,然后在父进程完成时手动调用al_uninstall_system()。还有其他解决方案,但这是我目前所采用的,因为我的单元测试程序只有一个出口点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多