[英]How to test an EXE with Google Test? (2)
我在這里修改了答案之一
std::string path_to_exectuable = "thepath";
TEST(FooTester,CheckHelpScriptReturns0)
{
using bp =::boost::process;
std::vector<std::string> args; args.push_back("--help");
bp::context ctx;
ctx.stdout_behavior = bp::capture_stream();
bp::child c = bp::launch("myExe.exe", args, ctx);
EXPECT_EXIT(c.terminate(), ::testing::ExitedWithCode(0), "");
}
希望使它更簡單。 但是,這將無法工作,並且將輸出
Result: failed to die
那么,這種方法完全可行嗎?如果是,那么缺少什么呢?
在以下情況下滿足宏ASSERT/EXPECT_EXIT(statement, predicate, regex)
:
statement
執行將導致測試用例過程調用exit
exit
的返回碼滿足predicate
regex
匹配statement
產生的stderr
輸出 標准函數exit(N)
使調用程序正常終止,返回碼為N
:因此, 文檔 :
:: testing :: ExitedWithCode(exit_code)
如果程序使用給定的退出代碼正常退出,則此表達式為true。
您想使答案“更直接”的作者已草繪了一個測試用例,該用例實質上斷言:
boost::process
c
,然后等待c
完成,則將發現c
調用了exit(0)
。 這很可能是對的。
您編寫了一個測試用例,它斷言:
boost::process
c
,然后終止c
,與c.terminate()
然后終止c
與c.terminate()
將導致測試用例過程調用exit(0)
這肯定是錯誤的。
此外, c.terminate()
不會給c
機會吃最后一餐,抽最后一支煙或通過調用exit
正常終止。 它只是在頭部射c
。 因此,即使您的測試用例確實測試了c
是否由於c.terminate()
調用了exit(0)
c.terminate()
,您也會發現事實並非如此。
最好按照您所鏈接的答案進行操作。
繼續 供OP評論
您希望聽到如何將googletest死亡測試宏應用於除測試用例之外的其他過程的死亡測試。 這是不可能的。 死亡測試的文件都在這里 。 對於除測試用例之外的其他死亡測試過程,您必須以鏈接的答案所指示的方式使用通用ASSERT/EXPECT
宏。
這樣,如果您想測試s.status()
是否有任何特定的終止信號條件,那么您將需要以特定於操作系統的方式從s.status()
中獲取相關信息,並對其進行ASSERT/EXPECT
應該。 如果您的操作系統符合Posix(例如Linux),則請參見例如boost::process::posix_status
如果您的目標程序包含要對其行為進行死亡測試的函數或類,那么您始終可以選擇使用googletest以預期的方式執行此操作,即將這些函數或類分解為鏈接到的庫您的目標程序,然后使用死亡測試宏對該庫進行死亡測試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.