Boost.Test和Forking

时间:2010-06-28 08:59:03

标签: 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。

2 个答案:

答案 0 :(得分:3)

这听起来并不像您希望实现的单元测试。虽然我不明白为什么它不安全。您可能遇到竞争条件,如果单元测试尚未准备就连接到MockServ,但这很容易解决。

我从来没有直接做过这样的事情,但是我已经编写了用于fork / exec子进程的库的单元测试,并且它可以完美地工作。

答案 1 :(得分:3)

我在类似情况下使用了Boost单元测试库并获得了积极的结果。我想进行自动测试以查看库在分叉时是否正常工作。虽然在我的情况下它也更接近系统测试,但如果他们达到了你想要的效果,我就会使用可用的工具。

要克服的一个障碍是在不使用boost断言宏的情况下发出子进程的错误信号。如果是将使用BOOST_REQUIRE它会过早地中止测试,并且任何后续测试都将在父进程和子进程中执行。我最终使用进程退出代码向等待的父进程发出错误信号。但是,不要使用exit()作为boost atexit()挂钩,即使没有错误,也会在子进程中发出错误信号。请改用_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);
  }

}