Как инициализировать постоянную строку для нескольких тестов в Google Test?

Я использую Google Test, и у меня есть cpp-файл, содержащий несколько тестов. Я хотел бы инициализировать строку с текущей датой и временем при запуске первого теста. Я хотел бы использовать эту строку и во всех других тестах. Как я могу это сделать.

Я попробовал следующее (m_string будучи защищенным членом CnFirstTest), но это не сработало (так как конструктор и SetUp будет вызываться перед каждым тестом):

CnFirstTest::CnFirstTest(void) {
    m_string = currentDateTime();
}

void CnFirstTest::SetUp() {
}



TEST_F(CnFirstTest, Test1) {
    // use m_string
}

TEST_F(CnFirstTest, Test2) {
    // use m_string, too
}

1 ответ

Решение

Вы можете использовать Gtest testing::Environment для достижения этой цели:

#include <chrono>
#include <iostream>

#include "gtest/gtest.h"

std::string currentDateTime() {
  return std::to_string(std::chrono::steady_clock::now().time_since_epoch().count());
}

class TestEnvironment : public ::testing::Environment {
 public:
  // Assume there's only going to be a single instance of this class, so we can just
  // hold the timestamp as a const static local variable and expose it through a
  // static member function
  static std::string getStartTime() {
    static const std::string timestamp = currentDateTime();
    return timestamp;
  }

  // Initialise the timestamp.
  virtual void SetUp() { getStartTime(); }
};

class CnFirstTest : public ::testing::Test {
 protected:
  virtual void SetUp() { m_string = currentDateTime(); }
  std::string m_string;
};

TEST_F(CnFirstTest, Test1) {
  std::cout << TestEnvironment::getStartTime() << std::endl;
  std::cout << m_string << std::endl;
}

TEST_F(CnFirstTest, Test2) {
  std::cout << TestEnvironment::getStartTime() << std::endl;
  std::cout << m_string << std::endl;
}

int main(int argc, char* argv[]) {
  ::testing::InitGoogleTest(&argc, argv);
  // gtest takes ownership of the TestEnvironment ptr - we don't delete it.
  ::testing::AddGlobalTestEnvironment(new TestEnvironment);
  return RUN_ALL_TESTS();
}
Другие вопросы по тегам