繁体   English   中英

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

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM