[英]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.