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

时间:2011-03-16 12:22:43

标签: c++ unit-testing boost

我有以下代码:

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

BOOST_AUTO_TEST_CASE(BadDir)
{
  BOOST_CHECK_EQUAL(false, f());
}

如果我在命令行中执行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"

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

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

5 个答案:

答案 0 :(得分:4)

首先,我只在Linux上得到这种奇怪的行为。

我发现 Boost.Test 会改变您使用所选部署模型处理子退出代码的方式。 如果您使用boost库的静态链接或“all in one”标题boost/test/included/unit_test.hpp插入一个define:

#define BOOST_TEST_IGNORE_NON_ZERO_CHILD_CODE

在任何include指令解决问题之前。

如果您使用动态链接,这还不够。您可以使用命令行选项“ - catch_system_errors = no”调用生成的测试,也可以定义以下环境变量。

export BOOST_TEST_CATCH_SYSTEM_ERRORS="no"

我在debian wheezy上使用了boost 1.52和1.57,GCC 4.7.2。

以下是对deploy models of Boost.Test

的引用

另请参阅此问题:how-to-cancel-fatal-error-detection-in-boost-test

答案 1 :(得分:1)

这在Boost.Test的后续版本

中得到解决

答案 2 :(得分:1)

在运行时添加--catch_system_errors = no也可以。

我希望能够使用类似于BOOST_CHECK_THROW的宏或不需要重新编译unit_test的#define来处理这个问题,但至少有一个解决方案。

答案 3 :(得分:0)

如果您从终端运行测试,则应设置为" no" Boost环境变量 catch_system_errors 。 如果是Ubuntu OS,则必须在测试执行前在终端中键入next命令:

export BOOST_TEST_CATCH_SYSTEM_ERRORS="no"

答案 4 :(得分:0)

扩展了Chip Christian的answer :(重新)使用BOOST_TEST_IGNORE_NON_ZERO_CHILD_CODE标志编译boost.test(测试升级1.53)。在bjam命令行中,添加:

cxxflags="-DBOOST_TEST_IGNORE_NON_ZERO_CHILD_CODE"

请注意,添加此标志似乎并不总是强制重新编译,因此我执行了以下操作以强制重新编译:

touch boost/test/impl/execution_monitor.ipp