Boost测试:捕获用户定义的异常

use*_*536 4 c++ boost unit-testing

如果我的代码中有用户定义的异常,我就无法通过Boost测试将其视为失败.

例如,

BOOST_AUTO_TEST_CASE_EXPECTED_FAILURES(MyTest,1)
BOOST_AUTO_TEST_CASE(MyTest)
{
// code which throws user defined exception, not derived from std::exception.

}
Run Code Online (Sandbox Code Playgroud)

我收到一条通用消息:

Caught exception: ....
unknown location(0):....
Run Code Online (Sandbox Code Playgroud)

它不会将此错误识别为失败,因为它不是std :: exception.所以它不尊重expected_failures子句.

如何强制执行该段代码应始终抛出异常?这似乎是一件有用的事情.如果将来的代码更改导致代码通过并且没有抛出异常,我想知道这一点.

Mar*_*off 8

EXPECTED_FAILURES指的是对失败BOOST_REQUIRE或其他断言.文件明确指出:

该功能不用于检查预期的功能故障.要检查特定输入是否导致抛出异常,请使用BOOST_CHECK_THROW系列测试工具.

重点是我的.

当断言失败但您想暂时忽略它时,预期的失败意味着在测试期间用作临时解决方法.

从他们预期的失败规范中获取一个片段:

BOOST_AUTO_TEST_CASE_EXPECTED_FAILURES( my_test1, 1 )

BOOST_AUTO_TEST_CASE( my_test1 )
{
    BOOST_CHECK( 2 == 1 );
}
Run Code Online (Sandbox Code Playgroud)

将导致输出

test.cpp(10): error in "my_test1": check 2 == 1 failed

Test suite "example" passed with:
  1 assertions out of 1 failed
  1 failures expected
  1 test case out of 1 passed

正如您所看到的,尽管断言失败,但由于使用了预期的故障,测试用例仍然通过.


因此,如果您需要验证某些内容是否会引发异常,请使用以下代码:

BOOST_AUTO_TEST_CASE(invalid_operation_should_throw_custom_exception)
{
    MyObj obj;
    BOOST_REQUIRE_THROW(obj.invalid_operation(), CustomException);
}
Run Code Online (Sandbox Code Playgroud)