2016-11-03 62 views
0

我希望修改的答案here的一個像如何使用Google測試測試EXE? (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 

那麼,這種做法可能在所有的,如果是,缺什麼?

+0

'exec'未定義。請發佈您的實際代碼。 –

+0

@MikeKinghan:請參閱上述參考資料之一的答案。 – HeinrichStack

+0

我做到了。 'exec'在那裏也沒有定義。爲了告訴你爲什麼*你的代碼無法正常工作,我們需要查看它。 –

回答

1

的宏ASSERT/EXPECT_EXIT(statement, predicate, regex)是在線北京 時: -

  • statement執行將導致測試用例過程調用exit
  • exit satisifies predicate返回代碼
  • regexstderr輸出匹配由statement產生

標準函數exit(N)導致調用程序,返回碼N正常終止:因此documentation

::測試:: ExitedWithCode(exit_code)

如果程序退出該表達式爲真通常使用給定的退出代碼。

answer that you want to make "more straightforward" 筆者勾畫了一個測試用例,基本上斷言: -

  • 如果測試用例進程啓動一個boost::processc,然後等待c完成, 然後c將被發現引用了exit(0)

這可能是正確的。

你已經寫斷言測試用例: -

  • 如果測試用例進程啓動一個boost::processc,然後終止c,與 c.terminate(),然後終止cc.terminate()會導致測試用例過程調用exit(0)

這肯定是錯誤的。

Futhermore,c.terminate() 不給c吃了最後一頓飯,抽最後一根菸,或致電exit正常終止的機會。它只是拍攝了c。 因此,即使您的測試用例確實有作爲c.terminate()的結果測試c是否被調用exit(0),您會發現它沒有。

最好與你所鏈接的答案一致,因爲它代表着。

Contd。對於OP的評論

您希望聽到如何將googletest死亡測試 宏應用於除測試用例進程以外的進程的死亡測試。 這是不可能的。死亡測試的文件全部爲here。 對於除測試用例過程之外的其他死亡測試過程,您必須使用通用ASSERT/EXPECT宏,其方式爲 ,鏈接的答案爲 。

走回頭路,如果您希望測試s.status()任何特定的終止信號,然後 狀況下,你將需要獲得相關信息進行的s.status() 在特定OS的方式和ASSERT/EXPECT它自己應該 是。如果你的操作系統是符合POSIX標準(如Linux)上,則見,例如, boost::process::posix_status

如果你的目標程序中包含的功能或類,它們的行爲 要經受死亡測試,那麼你總是可以選擇 使用googletest以預期的方式執行此操作,即 將這些函數或類放入由目標程序鏈接到 的庫中,然後用死亡測試宏對 進行死亡測試。

+0

那麼,我期待聽到,如何通過**外部過程**,googletest提供的建議方法來實現:'TEST(MyDeathTest,NormalExit)EXPECT_EXIT(NormalExit(),:: testing: :ExitedWithCode(0),「成功」); (KillMyself(),:: testing :: KilledBySignal(SIGKILL),「發送自己的不可屏蔽信號」); }' } 驗證: 調用'NormalExit()'會導致進程使用'退出代碼0'將「成功」打印到'stderr'和'exit',調用'KillMyself()'殺死進程信號'SIGKILL' – HeinrichStack