c++ - Boost.Test 和 fork

标签 c++ unit-testing boost mocking boost-test

我正在使用 Boost.Test 进行单元测试,目前正在从每个测试中启动的单独线程中运行各种模拟服务器。为了更准确地测试我的代码,模拟服务器应该真正处于不同的进程中。

我正在考虑按照这些思路做一些事情:

MY_TEST()
if (fork() == 0) {
    runMockServer();  // responds to test requests or times out, then returns
    exit(0);
}
// Connect to MockServ and Run actual test here
END_TEST()

但我担心这会搞砸测试框架。

这样安全吗?有人做过这样的事吗?

如果重要的话,我在 Ubuntu 8.04 上使用 Boost 1.34.1。

最佳答案

我在类似的情况下使用了 Boost 单元测试库,并取得了积极的结果。我想进行自动测试以查看库在 fork 时是否正常工作。尽管在我的案例中它也更接近于系统测试,但我完全赞成使用可用的工具,只要它们能达到您想要的效果。

不过,要克服的一个障碍是在不使用 boost assert 宏的情况下从子进程发出错误信号。如果例如BOOST_REQUIRE 将被使用,它会过早地中止测试,并且任何后续测试都将在父进程和子进程中执行。我最终使用进程退出代码向等待的父进程发出错误信号。但是,不要使用 exit()作为 boost 有atexit()钩子(Hook)在子进程中发出错误信号,即使没有。使用 _exit()相反。

我用于测试的设置是这样的。

BOOST_AUTO_TEST_CASE(Foo)
{
  int pid = fork();
  BOOST_REQUIRE( pid >= 0 );
  if( pid  == 0 ) // child
  {
    // Don't use Boost assert macros here
    // signal errors with exit code

    // Don't use exit() since Boost test hooks 
    // and signal error in that case, use _exit instead.
    int rv = something(); 
    _exit(rv);
  }else{ // parent
    // OK to use boost assert macros in parent
    BOOST_REQUIRE_EQUAL(0,0);
    // Lastly wait for the child to exit
    int childRv;
    wait(&childRv);
    BOOST_CHECK_EQUAL(childRv, 0);
  }

}

关于c++ - Boost.Test 和 fork ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3131123/

相关文章:

unit-testing - 如何在 Jest 中将模拟函数恢复为原始值?

unit-testing - 在 Kotlin MockK 中 unmockkAll 后会发生什么?

c++ - 智能指针的 std::swap 是否保证引用不变?

c++ - 基于数组大小有效性的特化

c++ - 滚动到顶部不起作用

c# - C++ 与 C# 类型安全

android - 使用 Robolectric 的 ShadowNfcAdapter 对 NFC 帮助程序类进行单元测试

c++ - 使用 boost::spirit 读取空值

c++ - boost::random::discrete_distribution 是否可以动态调整大小?

c++ - Eigen 矩阵右除等价