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会以某种方式终止终止。
答案 0 :(得分:2)
以下只是我的看法,但对我来说,你要么测试错误的东西,要么使用错误的工具。
断言(C assert()
)不是用于验证输入,而是用于捕捉不可能的情况。例如,它将从发布代码中消失,因此您无法依赖它。
您应该测试的是您的函数规范而不是实现。您应该决定无效输入值的规范是什么:
未定义的行为,因此assert
没问题,但您无法使用单元测试对其进行测试,因为未定义的行为是井,未定义。
定义的行为。然后,无论NDEBUG
存在,您都应该保持一致。在我看来,抛出异常是正确的做法,而不是调用std::abort
,这对用户来说几乎是无用的(无法被截获和正确处理)。
答案 1 :(得分:2)
您应该尝试使用命令行选项--gtest_break_on_failure
它意味着在调试器中运行测试,因此在测试失败时会得到一个断点。如果你不使用调试器,你将只获得一个SEGFAULT,执行将停止。
答案 2 :(得分:0)
如果assert
触发(失败),你会得到&#34;好的输出&#34; (或崩溃或您的环境中的任何断言)。如果assert
未触发,则不会发生任何事情并继续执行。
您还需要知道什么?
答案 3 :(得分:0)
此(黑客)为Google Test添加了EXPECT_NODEATH
宏。这是&#34;对面&#34;如果语句没有断言,中止或以其他方式失败,它将通过EXPECT_DEATH
。
一般的想法很简单,但我没有花时间把错误信息做得更好。我试图让Google Test尽可能不受影响,只是捎带已经存在的东西。您应该能够在没有任何副作用的情况下将其包含在Google Test的其余部分
中对于你的情况:
TEST(Succeeds_whenInRange) {
EXPECT_NODEATH(obj->getIndex(4), "");
}