【问题标题】:Boost.Test and ForkingBoost.Test 和分叉
【发布时间】:2010-06-28 08:59:02
【问题描述】:

我正在使用 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。

【问题讨论】:

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


    【解决方案1】:

    我在类似的情况下使用了 Boost Unit Test 库并获得了积极的结果。我想进行自动测试,看看库在分叉时是否正常工作。尽管在我的情况下它也更接近于系统测试,但如果它们实现了你想要的,我完全赞成使用可用的工具。

    要克服的一个障碍是在不使用 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);
      }
    
    }
    

    【讨论】:

      【解决方案2】:

      这听起来不像是对您想要实现的目标进行单元测试。虽然我不明白为什么它不安全。如果您的单元测试尚未准备好,您可能会遇到竞争条件,即您的单元测试连接到 MockServ,但这很容易解决。

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

      【讨论】:

      • 当您说“为 fork/exec 的库编写单元测试”时,我假设您的意思是在 Boost.Test 的上下文中?
      • 谢谢。出于好奇,您为什么说这听起来不像是对您进行单元测试?
      • 主要是扯皮,但我考虑测试全流程集成或功能测试。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-14
      • 1970-01-01
      • 1970-01-01
      • 2012-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多