当assert()意外触发时,如何抑制Google测试中的终止?

时间:2016-05-28 12:57:57

标签: c++ unit-testing assert googletest assertions

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会以某种方式终止终止。

4 个答案:

答案 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), "");
}

GTestNoDeath.h