2010-06-28 53 views
1

我正在使用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(如果有的话)。

回答

3

这听起来并不像你想要达到的单元测试一样。虽然我不明白为什么它不安全。如果您的单元测试连接到MockServ(如果尚未准备好),您可能会遇到竞争情况,但这很容易解决。

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

+0

当你说你已经“为fork/exec编写库的单元测试”我假定你的意思是在Boost.Test的上下文中吗? – 2010-06-28 11:59:42

+0

正确,使用Boost.Test。 – 2010-06-28 12:35:49

+0

谢谢。出于好奇,为什么你会说这听起来不像是单元测试你? – 2010-06-28 18:32:23

3

我在相似的情况下使用了Boost单元测试库,并获得了积极的结果。我想要进行自动测试,看看库是否像分叉时那样工作。虽然在我的案例中它也更接近系统测试,但如果他们能够实现您想要的功能,我都会使用可用的工具。

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

}