[英]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()
然后终止c
与c.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.