2010-06-28 91 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); 
    } 

}