Here讨论了如何捕获失败的断言,例如你设置你的夹具,以便assert()失败,你看到很好的输出。但我需要的恰恰相反。我想测试assert()是否成功。但如果失败我想要有不错的输出。在那时它只是在它断言assert()时终止。
#define LIMIT 5
struct Obj {
int getIndex(int index) {
assert(index < LIMIT);
// do stuff;
}
}
Obj obj;
TEST(Fails_whenOutOfRange) {
ASSERT_DEATH(obj->getIndex(6), "");
}
TEST(Succeeds_whenInRange) {
obj->getIndex(4);
}
以上是人为的例子。我希望第二次测试不会在它失败的情况下终止,例如,如果我将LIMIT设置为3.毕竟,当assert()失败时,ASSERT_DEATH会以某种方式终止终止。
以下只是我的意见,但对我来说,你要么测试错误的东西,要么使用错误的工具。
断言(C assert()
)不是用于验证输入,而是用于捕捉不可能的情况。例如,它将从发布代码中消失,因此您无法依赖它。
您应该测试的是您的功能规范而不是实现。您应该决定,无效输入值的规范是什么:
assert
很好,但你不能用单元测试来测试它,因为未定义的行为是未定义的。NDEBUG
存在。在我看来,抛出异常是正确的做法,而不是调用std::abort
,这对用户来说几乎是无用的(不能被截获和正确处理)。您应该尝试使用命令行选项--gtest_break_on_failure
它意味着在调试器中运行测试,因此在测试失败时会得到一个断点。如果你不使用调试器,你将只获得一个SEGFAULT,执行将停止。
如果assert
触发(失败),您将获得“良好输出”(或崩溃或您的环境中的任何断言)。如果assert
没有触发,则没有任何反应并继续执行。你还需要知道什么?
这个(黑客)在Google Test中添加了EXPECT_NODEATH
宏。它是EXPECT_DEATH
的“对立面”,如果声明没有断言,中止或以其他方式失败,它将通过。
一般的想法很简单,但我没有花时间使错误消息更好。我试图让Google Test尽可能不受影响,只是捎带已经存在的东西。您应该可以在没有任何副作用的情况下将其包含在Google Test的其余部分中
对于你的情况:
TEST(Succeeds_whenInRange) {
EXPECT_NODEATH(obj->getIndex(4), "");
}