【问题标题】:How to bypass assert in unit test in Debug mode?如何在调试模式下绕过单元测试中的断言?
【发布时间】:2016-09-20 06:59:36
【问题描述】:

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

【问题讨论】:

  • 断言可以防止在正确的程序中永远发生的情况。你为什么要对它进行单元测试?如果在正确的程序中可能出现无效参数(例如来自格式错误的用户输入),您应该使用异常而不是断言。
  • @Quentin 实际上它是一个我想测试的外部库(由 Matlab 代码生成器生成)。我们为生成的代码生成了一个包装器,但如果库可以处理现实生活中可能发生的无效数据,因为它们来自输入文件,现在还没有。我同意在我们的案例中使用异常可能是比断言更好的解决方案。
  • 这似乎与stackoverflow.com/q/38533272/102345非常相似

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


【解决方案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 将测试是否已经定义并且不会尝试再次定义它(再次,在您的编译器/标准库 assert.h 标头中查找细节)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-17
    • 2016-04-17
    • 2021-04-09
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多