2016-09-20 67 views
0

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

断言是为了防止在正确的程序中不应该发生的情况。你为什么要进行单元测试?如果在正确的程序中发生无效参数(例如来自格式错误的用户输入),则应该使用异常而不是断言。 – Quentin

+0

@Quentin其实它是我想测试的外部库(由Matlab代码生成器生成)。我们为生成的代码生成了一个包装,但是如果库可以处理可能在现实生活中发生的无效数据(因为它们来自输入文件),现在不会真的生成这个包装。我同意使用异常可能比我们的情况下的断言更好。 – tommyk

+0

这看起来很像http://stackoverflow.com/q/38533272/102345 – JBRWilkinson

回答

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; (例如,抛出一个你会发现的错误),并且希望你的具体的assert.h将测试是否已经定义,并且不会再试图再次定义它(再次,在你的编译器/ std库中查找具体信息assert.h头文件)
相关问题