簡體   English   中英

Boost.Test和分叉

[英]Boost.Test and Forking

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

我在類似的情況下使用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);
  }

}

這聽起來不像是要完成的單元測試。 雖然我不明白為什么它不安全。 您可能會遇到競爭狀況,如果尚未將單元測試連接到MockServ,則可以輕松解決。

我從來沒有直接做過這樣的事情,但是我為fork / exec子進程的庫編寫了單元測試,並且可以完美地工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM