运行 时分叉的 allegro 单元测试崩溃
Forked allegro unit tests crash when run
我正在为 c 使用一个自定义的 unit-testing 系统,它将每个测试分叉到一个新进程中,这样即使一个测试崩溃,其他测试仍然可以不间断地执行。现在我正在尝试使用它来测试使用 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
执行上述分叉。我假设这与崩溃有关(也许连接在第一个 child 终止后被终止?),但我不确定具体如何,也不确定如何解决。
当我在每个测试中分别调用 al_init()
时(如下所示),没有提前终止也没有错误消息,但它似乎有点慢(不是慢得无法忍受,但有一个明显的pause 对于那些因为未实现而立即失败的测试来说不应该存在)。此外,为每个单独的测试重新启动 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 而不会破坏我的测试?
此问题是由 al_init()
将 al_uninstall_system
设置为 atexit
函数引起的。结果是child在退出的时候进行了系统卸载。这可以通过调用 al_install_system(ALLEGRO_VERSION_INT, NULL)
而不是 al_init()
,然后在 parent 进程完成时手动调用 al_uninstall_system()
来防止。还有其他解决方案,但这就是我现在采用的解决方案,因为我的单元测试程序只有一个退出点。
我正在为 c 使用一个自定义的 unit-testing 系统,它将每个测试分叉到一个新进程中,这样即使一个测试崩溃,其他测试仍然可以不间断地执行。现在我正在尝试使用它来测试使用 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
执行上述分叉。我假设这与崩溃有关(也许连接在第一个 child 终止后被终止?),但我不确定具体如何,也不确定如何解决。
当我在每个测试中分别调用 al_init()
时(如下所示),没有提前终止也没有错误消息,但它似乎有点慢(不是慢得无法忍受,但有一个明显的pause 对于那些因为未实现而立即失败的测试来说不应该存在)。此外,为每个单独的测试重新启动 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 而不会破坏我的测试?
此问题是由 al_init()
将 al_uninstall_system
设置为 atexit
函数引起的。结果是child在退出的时候进行了系统卸载。这可以通过调用 al_install_system(ALLEGRO_VERSION_INT, NULL)
而不是 al_init()
,然后在 parent 进程完成时手动调用 al_uninstall_system()
来防止。还有其他解决方案,但这就是我现在采用的解决方案,因为我的单元测试程序只有一个退出点。