c++ - 如何在 Debug模式下绕过单元测试中的断言?

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

在一个测试用例中,我想测试一个在 Debug模式下为无效输入生成断言的函数。不幸的是,这停止了 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 是否有负面测试用例。

如果您需要测试仅包含 header 的库或针对要测试的源代码进行编译,则需要

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

关于c++ - 如何在 Debug模式下绕过单元测试中的断言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39587624/

相关文章:

c++ - 通用方法指针。指向不同类的 reinterpret_cast 方法指针,这是 UB 吗?

c++ - 简单的 C++ 输入文件和 if 语句

c++ - libzmq 和 cppzmq 之间以及 zmq.h 和 zmq.hpp 之间的区别?

python - 如何使用 Python 的单元测试断言数据库错误?

python - C++ 17 与 Python 2.7 的兼容性

java - 如何同时使用真实类和mockito?

c# - 自动夹具和 AutoMoq : Overriding object generation behavior

c++ - C++ 构建器 XE4 上的 AssertErrorProc

c++ - 如何断言内存已释放

typescript - 是否可以在 TypeScript 中断言编译错误?