我修改了其中一个答案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
那么,这种方法是否可行,如果可行,缺少什么?
最佳答案
宏 ASSERT/EXPECT_EXIT(statement, predicate, regex)
满意
什么时候:-
- 执行
statement
将导致测试用例过程调用exit
exit
的返回码满足predicate
-
regex
匹配stderr
statement
产生的输出
标准函数 exit(N)
导致调用程序正常终止并返回代码 N
: 因此 documentation :
::testing::ExitedWithCode(exit_code)
This expression is true if the program exited normally with the given 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()
,你会发现它没有。
最好按原样使用您链接到的答案。
续OP的评论
您希望听到如何应用 googletest 死亡测试
对测试用例流程以外的流程进行死亡测试的宏。
这是不可能的。死亡测试的文档都是here .
要对测试用例流程以外的流程进行死亡测试,您将
必须使用通用 ASSERT/EXPECT
宏,按照指示的方式
通过您链接到的答案。
往那边走,如果你想测试s.status()
对于任何特定的终止信号
条件,那么您将需要从 s.status()
中获取相关信息
以特定于操作系统的方式和ASSERT/EXPECT
它应该是什么
是。如果您的操作系统符合 Posix(例如 Linux),那么请参阅,例如,
boost::process::posix_status
如果您的目标程序包含其行为的函数或类 你想接受死亡测试那么你总是有选择 使用 googletest 以预期的方式执行此操作,即 通过将这些函数或类分解到链接的库中 通过你的目标程序,然后死亡测试该库 死亡测试宏。
关于c++ - 如何使用 Google Test 测试 EXE? (2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40407956/