如何在调试模式下绕过单元测试中的断言?

时间:2016-09-20 06:59:37

标签: c++ unit-testing assert catch-unit-test

在测试用例中,我想测试一个在调试模式下为无效输入生成断言的函数。不幸的是,这会阻止Catch测试运行。有没有办法绕过这个断言,以便测试运行器继续运行?

这是我的测试用例:

 SCENARIO("Simple test case", "[tag]") {
    GIVEN("some object") {
        MyObject myobject;

        WHEN("object is initialized with invalid data") {
            // method init generates an assertion when parameters are invalid
            bool result = myObject.init(nullptr, nullptr, nullptr, nullptr);
            REQUIRE(false == result);

            THEN("data processing can't be started") {
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

通常assert是一个像

这样的宏
#define assert(e) ((void) ((e) \
  ? 0 
  : (void)printf ("%s:%u: failed assertion `%s'\n",  __FILE__, __LINE__, #e),
    abort(), // <-- this aborts you program after printf's above
    0        
)

并在调试版本中启用此宏。有关更多细节,请查看标准assert.h

因此,如果您有一个用于链接测试用例的二进制库,则需要告诉开发团队,除非他们为您提供了未启用断言的发布版本,否则您将无法单元化 - 测试他们的API用于负面测试用例。

如果您需要测试仅限标头的库,或者针对要测试的源代码进行编译,则需要

  1. 使用-DNDEBUG编译测试用例/套件; 和/或
  2. 定义您自己的assert宏(例如,抛出您将要捕获的错误)并希望您的特定assert.h将测试是否已经定义并且不会尝试定义它再次(再次,在您的编译器/ std libs assert.h标题中寻找细节)