如何在调试模式下绕过单元测试中的断言?
How to bypass assert in unit test in Debug mode?
在测试用例中,我想测试一个在调试模式下为无效输入生成断言的函数。不幸的是,这停止了 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
所以,如果你有一个二进制库,你 link 你的测试用例,你需要告诉开发团队,除非他们给你一个没有启用断言的发布版本,否则你不会'无法 unit-test 他们的 API 对于负面测试用例。
如果您需要测试 header-only 库或针对要测试的源代码进行编译,则需要
- 使用 -DNDEBUG 编译测试 cases/suite; and/or
- 定义你自己的
assert
宏(例如,抛出一个你会捕获的错误)并希望你的特定 assert.h
将测试是否已经定义并且不会尝试再次定义它(同样,在你的 compiler/std 库 assert.h
header 中寻找细节)
在测试用例中,我想测试一个在调试模式下为无效输入生成断言的函数。不幸的是,这停止了 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
所以,如果你有一个二进制库,你 link 你的测试用例,你需要告诉开发团队,除非他们给你一个没有启用断言的发布版本,否则你不会'无法 unit-test 他们的 API 对于负面测试用例。
如果您需要测试 header-only 库或针对要测试的源代码进行编译,则需要
- 使用 -DNDEBUG 编译测试 cases/suite; and/or
- 定义你自己的
assert
宏(例如,抛出一个你会捕获的错误)并希望你的特定assert.h
将测试是否已经定义并且不会尝试再次定义它(同样,在你的 compiler/std 库assert.h
header 中寻找细节)