如何仅重复一次测试 运行 全局 Set-Up/Tear-Down 或 SetUpTestSuite / TearDownTestSuite

How to repeat a test running only once Global Set-Up/Tear-Down or SetUpTestSuite / TearDownTestSuite

我有一个测试套件设置需要一些时间 运行。 (开串口初始化与板卡通讯等)

我想 运行 循环测试,但没有 运行 每次都进行此设置和清理,因为它们不需要,只会浪费时间。

TestSuiteSetup 的默认行为是执行一次,然后允许从该套件到 运行 的任意数量的测试。 运行 一个套件中的多个测试或重复一个测试实际上是相同的用例,但它似乎不支持-repeat。 (我希望可以将标志与选项结合起来,例如:-run_setup_only_once)

这在 gtest 中可行吗?或者有其他方法可以实现吗?

有几种方法可以实现这一点。

  • 实施您自己的 main,从您的项目中排除 gtest_main.cc:
    int main(int argc, char *argv[]) {
      ::testing::InitGoogleTest(&argc, argv);
      MySetUp();
      const int rv = RUN_ALL_TESTS();
      MyTearDown();
      return rv;
    }
    
  • 在任何源文件中定义类似于单例的全局静态初始化对象:
    namespace {
      struct Init {
        Init() { MySetUp(); } 
        ~Init() { MyTearDown(); } 
      } my_global_init;
    }
    

使用某种形式的全局对象来指示它是否是第一次重复怎么样?下面是一个简单的例子:

#include <iostream>

#include "gtest/gtest.h"

bool g_first_iteration = true;

class FooTest : public testing::Test {
 protected:
  static void SetUpTestSuite() {
    std::cout << "========Beginning of all tests========" << std::endl;

    // This part is run only in the first iteration.
    if (g_first_iteration) {
      g_first_iteration = false;
      std::cout << ">>>>>>>> First time setup <<<<<<<<< " << std::endl;
    }
  }
};

TEST_F(FooTest, Test1) { EXPECT_EQ(1, 1); }

您可以在此处查看输出:https://godbolt.org/z/71eE34bff