【问题标题】:C++ Unit Testing based on fork()基于 fork() 的 C++ 单元测试
【发布时间】:2011-12-06 18:10:31
【问题描述】:

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

【问题讨论】:

  • stackoverflow.com/a/267854/390913 "如果库正在打开你不知道的文件,你怎么知道他们在分叉后不需要它们?"
  • @perreal:我不确定这在这里如何应用。我希望每个单元测试都具有相同的初始状态。通过在每次测试之前进行分叉,可以确保这一点。库可能进行了一些静态初始化,但这对于所有派生的实例都是相同的。

标签: c++ unit-testing


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    用于 C 的 Check 单元测试库 by default 在单独的子进程中执行每个测试。

    它还支持两种不同的fixtures - 在每个测试之前/之后执行 - 在子进程中 - (称为“已检查”)和在测试套件之前/之后执行的 fixtures - 在父进程 - (称为“未检查”固定装置)。

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

    目前,libcheck runs under Linux、Hurd、BSD、OSX 和不同类型的 Windows(mingw、non-mingw 等)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-13
      • 2020-06-30
      • 2011-05-07
      • 1970-01-01
      • 2017-01-15
      相关资源
      最近更新 更多