我修改了其中一个答案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
那么,这种方法是否可行,如果是,那么缺少什么?
答案 0 :(得分:1)
宏ASSERT/EXPECT_EXIT(statement, predicate, regex)
令人满意
当: -
statement
的执行将导致测试用例进程调用exit
exit
的返回代码符合predicate
regex
与stderr
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()
通过致电c
,exit
没有机会吃最后一餐,抽最后一根烟或正常终止。它只是在头部射出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以预期的方式执行此操作,即 通过将这些函数或类分解为链接的库 通过你的目标程序,然后死亡测试该库 死亡测试宏。