如何仅重复一次测试 运行 全局 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
我有一个测试套件设置需要一些时间 运行。 (开串口初始化与板卡通讯等)
我想 运行 循环测试,但没有 运行 每次都进行此设置和清理,因为它们不需要,只会浪费时间。
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