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

How to bypass assert in unit test in Debug mode?

本文关键字:单元测试 断言 调试 模式      更新时间:2023-10-16

在一个测试用例中,我想测试一个在调试模式下生成无效输入断言的函数。不幸的是,这会停止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") {
            }
        }
    }
}

通常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进行负测试用例的单元测试。

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

    使用-DNDEBUG编译你的测试用例/套件;
  1. 定义自己的assert宏(例如:抛出您将捕获的错误)并希望您的特定assert.h将测试是否已经定义并且不会尝试再次定义它(再次,在编译器/std库assert.h头中查找具体信息)