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

问题描述 投票:1回答:4

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++ unit-testing assert googletest assertions
4个回答
2
投票

以下只是我的意见,但对我来说,你要么测试错误的东西,要么使用错误的工具。

断言(C assert())不是用于验证输入,而是用于捕捉不可能的情况。例如,它将从发布代码中消失,因此您无法依赖它。

您应该测试的是您的功能规范而不是实现。您应该决定,无效输入值的规范是什么:

  • 未定义的行为,所以assert很好,但你不能用单元测试来测试它,因为未定义的行为是未定义的。
  • 定义的行为。然后你应该保持一致,无论NDEBUG存在。在我看来,抛出异常是正确的做法,而不是调用std::abort,这对用户来说几乎是无用的(不能被截获和正确处理)。

2
投票

您应该尝试使用命令行选项--gtest_break_on_failure

它意味着在调试器中运行测试,因此在测试失败时会得到一个断点。如果你不使用调试器,你将只获得一个SEGFAULT,执行将停止。


0
投票

如果assert触发(失败),您将获得“良好输出”(或崩溃或您的环境中的任何断言)。如果assert没有触发,则没有任何反应并继续执行。你还需要知道什么?


0
投票

这个(黑客)在Google Test中添加了EXPECT_NODEATH宏。它是EXPECT_DEATH的“对立面”,如果声明没有断言,中止或以其他方式失败,它将通过。

一般的想法很简单,但我没有花时间使错误消息更好。我试图让Google Test尽可能不受影响,只是捎带已经存在的东西。您应该可以在没有任何副作用的情况下将其包含在Google Test的其余部分中

对于你的情况:

TEST(Succeeds_whenInRange) {
    EXPECT_NODEATH(obj->getIndex(4), "");
}

GTestNoDeath.h

© www.soinside.com 2019 - 2024. All rights reserved.