有没有办法在特定测试 运行 后停止 GoogleTest,无论它通过还是失败?

Is there a way to stop GoogleTest after a specific test is run, whether it passes or fails?

我通过 GoogleTest 进行了大量单元测试 运行。当前其中一个(称为 fooTest)在完整测试套件为 运行 时失败,但在单独 运行 时通过。因此,在 fooTest 之前 运行 的一个(或多个)测试正在做一些导致它失败的事情,这当然是测试的一个大问题,我显然想找到罪魁祸首。

这是在默认 运行 条件下发生的,因此测试顺序始终相同。 fooTest 大约完成了这个 运行 命令的一半,并且有足够的测试使得测试的后半部分的 运行 时间很重要,特别是如果 运行 多次测试。

所以我想将 googletest 设置为在 fooTest 运行 之后始终停止测试 运行 - 无论它通过还是失败。我知道我可以做 --gtest_break_on_failure,但是如果我做的测试 运行 导致 fooTest 通过,我仍然想就此停下来,而不是通过其他一切。我可以 运行 进行调试并在测试后添加一个断点,但这也会稍微减慢速度并且感觉不太理想。

这似乎是一个简单的设置,但我还没有找到任何东西。我希望 运行 上有一个我可以使用的参数,或者有一个技巧可以实现这一点。

您有多种选择:

  1. 只需在fooTest的末尾调用exit函数即可。

  2. 创建一个test fixture。在 SetUp 中检查始终为 false 的标志,但如果执行 fooTest 则它设置为 true。像这样:

bool skip_testing = false;

// Class for test fixture
class MyTestFixture : public ::testing::Test {
 protected:
  void SetUp() override {
    if (skip_testing) {
      GTEST_SKIP();
    }
  }
};

TEST_F(MyTestFixture, test1) {
  //
  EXPECT_EQ(1, 1);
}

TEST_F(MyTestFixture, footest) {
  EXPECT_EQ(1, 1);
  skip_testing = true;
}

TEST_F(MyTestFixture, test2) {
  //
  EXPECT_EQ(1, 1);
}

TEST_F(MyTestFixture, test3) {
  //
  EXPECT_EQ(1, 1);
}


在此处查看工作示例:https://godbolt.org/z/8dzKGE6Eh

  1. 与选项 2 类似,但在 SetUp 中使用 explicit success and failure 而不是 GTEST_SKIP。但是,首选使用 GTEST_SKIP,因为您的输出将显示测试已被跳过。