boost::unit_test 案例失败,因为子进程以非零值退出

rtu*_*ado 5 c++ boost unit-testing

我有以下代码:

bool f()
{
  command = "mkdir -p /\/\/";
  result = aSystemCall(command);
  if (result == ...
}

BOOST_AUTO_TEST_CASE(BadDir)
{
  BOOST_CHECK_EQUAL(false, f());
}
Run Code Online (Sandbox Code Playgroud)

如果我command在命令行中执行,则会收到权限被拒绝错误。我知道这一点。这正是我想要测试的。
aSystemCall将命令作为子进程执行。当子进程以该命令的非零错误退出时,aSystemCall返回错误。它不会扔。
如果我BadDir在命令行中运行测试用例,后面的代码aSystemCall永远不会执行,测试失败,输出如下:

mkdir: cannot create directory '/\/\/': Permission denied
unknown location(0): fatal error in "BadDir": child has exited; pid: 25356; uid: 19753;   exit value: 1
test.cpp(100): last checkpoint
Leaving test case "BadDir"; testing time: 10ms
Leaving test suite "Test"
Leaving test suite "Master Test Suite"
Run Code Online (Sandbox Code Playgroud)

如果我BadDir在 gdb 中运行测试用例,aSystemCall返回,可以检查结果,并且测试通过。

有没有办法告诉 boost::unit_test 过滤掉像这样的可能错误,以便继续执行?我已经试过了BOOST_AUTO_TEST_CASE_EXPECTED_FAILURE(blah, 1),但这只是告诉 boost::unit_test 你期待失败。它报告在测试中检测到的失败(预期失败)。我想要一个通过的测试情况。

Gen*_*tal 1

这个问题在 Boost.Test 的更高版本中得到解决

  • 这个答案没有很好地解释。 (5认同)
  • @Gennadiy我在unit_test.hpp包含之前使用'#define BOOST_TEST_IGNORE_NON_ZERO_CHILD_CODE'得到了预期的行为。该标志和其他标志是否在 boost 测试文档中的某处定义?您可以在测试中定义/取消定义它,还是在整个运行中定义/取消定义它? (3认同)
  • @Gennadiy 将此答案设置为我接受的答案,但我希望您能提供更详细的解释以及您的后续结果。 (3认同)