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

标签 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

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

最佳答案

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() , 然后终止 cc.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/

相关文章:

c++ - 应用关于如何递增枚举的规则

C++从外部窗口捕获聊天 - ubuntu

c++ - 在没有赋值的情况下调用 std::move() 时会发生什么

c++ - 如何在 boost::posix_time 中启用纳秒?

C++ Virtual boost::any 继承

c++ - qt :all classes inherit from QObject or delete Manually after new? 我应该采取什么方式

c++ - System() 启动进程,但使用 CreateProcess 失败?

c++ - MacPorts Clang 3.1 缺少标准库安装?

c++ - 需要 Meyers Effective C++ Widget 右值实例讲解

c++ - Boost Asio - 异步堆栈 + 轮询