首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Boost.Test和Forking

Boost.Test和Forking
EN

Stack Overflow用户
提问于 2010-06-28 16:59:03
回答 2查看 1.1K关注 0票数 1

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

我正在考虑做一些如下的事情:

代码语言:javascript
复制
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。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-06-28 19:53:36

这听起来并不像是你想要实现的单元测试。尽管我不明白为什么它不安全。如果单元测试还没有准备好,您的单元测试可能会出现竞态情况,连接到MockServ,但这很容易解决。

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

票数 3
EN

Stack Overflow用户

发布于 2012-12-21 19:56:54

我曾在类似的情况下使用过Boost Unit Test库,并取得了积极的结果。我想要进行自动测试,看看一个库在派生时是否像它应该的那样工作。虽然在我的例子中它也更接近系统测试,但我完全支持使用可用的工具,如果它们实现了您想要的。

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

我用于测试的设置如下所示。

代码语言:javascript
复制
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);
  }

}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3131123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档