我有以下代码:
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你预计会失败。它报告在测试中检测到故障(预期失败)。我想要通过测试的情况。
答案 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。
的引用答案 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