基于fork()的c++单元测试

C++ Unit Testing based on fork()

本文关键字:c++ 单元测试 fork 基于      更新时间:2023-10-16

所以我有兴趣做一些与内核模块交互的库的单元测试。为了正确地做到这一点,我想确保在每个测试结束时关闭文件句柄之类的东西。唯一可行的方法是在每个测试用例上使用fork()。是否有任何预先存在的单元测试框架可以自动执行此操作?

我所期望的一个例子如下:

TEST() {
    int x = open("/dev/custom_file_handle");
    TEST_ASSERT_EQUAL(x, 3);
}
TEST() {
    int y = open("/dev/other_file_handle");
    TEST_ASSERT_EQUAL(x, 3);
}

特别地,在每次测试之后,文件句柄被关闭,这意味着文件描述符在每次测试之后应该是相同的值。

我实际上并没有测试文件描述符的值。这只是一个简单的例子。在我的特殊情况下,任何时候只允许一个用户打开文件描述符。

这是针对Linux平台的,但跨平台的东西会很棒。

Google Test支持fork进程来测试它。但仅限于"退出"和/或"死亡"测试。另一方面,没有什么可以阻止您这样编写每个测试。

理想情况下,我会建议你用不同的方法来处理你的问题。例如,使用相同的Google Test框架,您可以列出测试用例并分别运行它们,因此编写一个简单的包装器,多次调用每个二进制文件来运行不同的测试将解决您的问题。Fork有它自己的问题

默认情况下,C语言的Check单元测试库在单独的子进程中执行每个测试。

它还支持两种不同类型的fixture——一种在每次测试之前/之后在子进程中执行(称为"检查"),另一种在测试套件之前/之后在父进程中执行(称为"未检查"fixture)。

您可以通过环境变量CK_FORK=no或API调用禁用分叉-例如,简化调试问题。

目前,libcheck运行在Linux, Hurd, bsd, OSX和不同类型的Windows (mingw, non-mingw等)。