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

时间:2011-12-06 18:10:32

标签: c++ unit-testing

所以我有兴趣对与内核模块交互的库进行一些单元测试。为了正确地做到这一点,我想确保在每次测试结束时关闭文件句柄之类的东西。这似乎唯一可行的方法是在每个测试用例上使用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平台的,但跨平台的东西会非常棒。

2 个答案:

答案 0 :(得分:4)

Google Test确实支持分配流程以进行测试。但仅作为“退出”和/或“死亡”测试。另一方面,没有什么可以阻止你编写这样的每一个测试。

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

答案 1 :(得分:2)

C Checkby default单元测试库在单独的子进程中执行每个测试。

它还支持两种不同类型的fixtures - 在每次测试之前/之后执行 - 在子进程中执行 - (称为“已检查”)以及在测试套件之前/之后执行的那些 - {在父进程中 - (称为'unchecked'fixtures)。

您可以disable the forking通过环境变量CK_FORK=no或API调用 - 例如简化调试问题。

目前,libcheck runs under Linux,Hurd,BSD,OSX和各种Windows(mingw,non-mingw等)。