如何使用Google Test测试EXE? (2)

时间:2016-11-03 17:38:05

标签: c++ c++11 boost googletest

我修改了其中一个答案here,如

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

那么,这种方法是否可行,如果是,那么缺少什么?

1 个答案:

答案 0 :(得分:1)

ASSERT/EXPECT_EXIT(statement, predicate, regex)令人满意 当: -

  • statement的执行将导致测试用例进程调用exit
  • exit的返回代码符合predicate
  • regexstderr
  • 产生的statement输出相匹配

标准函数exit(N)导致调用程序正常终止,返回码为N:因此documentation

  

::测试:: ExitedWithCode(exit_code)

     

如果程序使用给定的退出代码正常退出,则此表达式为真。

answer that you want to make "more straightforward"的作者 草拟了一个基本断言的测试用例: -

  • 如果测试用例进程启动boost::process c,然后等待c完成, 然后会发现c已调用exit(0)

这可能是真的。

你写了一个断言的测试用例: -

  • 如果测试用例流程启动boost::process c,然后终止c,则 c.terminate(),然后使用c终止c.terminate()将导致测试用例进程调用exit(0)

这当然是假的。

此外,c.terminate() 通过致电cexit没有机会吃最后一餐,抽最后一根烟或正常终止。它只是在头部射出c。 因此,即使您的测试用例 测试c是否因exit(0)而调用c.terminate(),您也会发现它不会。{/ p>

最好选择与之相关的答案。

<强>续对于OP的评论

您希望了解如何应用googletest死亡测试 除了测试用例过程之外的过程的宏测试。 这是不可能的。死亡测试的文件都是here。 对于除测试用例过程之外的死亡测试过程,您将获得 必须按照指示的方式使用通用ASSERT/EXPECT宏 通过你联系到的答案。

这样,如果您希望测试s.status()任何特定的终止信号 条件然后你需要从s.status()中获取相关信息 以特定于操作系统的方式和ASSERT/EXPECT它应该是什么 是。如果您的操作系统符合Posix(例如Linux),那么请参阅,例如, boost::process::posix_status

如果目标程序包含其行为的函数或类 你想接受死亡测试,那么你总是可以选择 使用googletest以预期的方式执行此操作,即 通过将这些函数或类分解为链接的库 通过你的目标程序,然后死亡测试该库 死亡测试宏。