簡體   English   中英

如何使用Google Test測試EXE? (2)

[英]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()然后終止cc.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.

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