Google 测试:如何运行 fixture only for multiple tests?
Google Test: How to run fixture only once for multiple tests?
我正在尝试使用 gtest 测试 http 客户端。我想用我自己的 http 服务器测试这个客户端。我有一个小型 python 服务器。测试用例是客户端向此 python 服务器发送各种请求。有没有办法在所有测试之前启动服务器 运行 并在测试之后销毁该服务器?
我正在尝试使用此处所示的 gtest fixture;通过在 SetUp 中创建一个新进程并在 TearDown 中将其终止。但看起来这些调用是针对每个测试进行的。
class Base: public ::testing::Test {
public:
pid_t child_pid = 0;
void SetUp() {
char *cmd = "/usr/bin/python";
char *arg[] = {cmd, "./http_server.py", NULL};
child_pid = fork();
if ( child_pid == 0) {
execvp(cmd, arg);
std::cout << "Failed to exec child: " << child_pid << std::endl;
exit(-1);
} else if (child_pid < 0) {
std::cout << "Failed to fork child: " << child_pid << std::endl;
} else {
std::cout << "Child HTTP server pid: " << child_pid << std::endl;
}
}
void TearDown() {
std::cout << "Killing child pid: " << child_pid << std::endl;
kill(child_pid, SIGKILL);
}
};
TEST_F(Base, test_1) {
// http client downloading url
}
TEST_F(Base, test_2) {
// http client downloading url
}
在使用数据库进行测试时遇到类似问题。
对于每次测试执行,数据库连接都会被连接和断开。测试执行花费了太多时间,除了测试的目的是检查特定函数内部的逻辑而不是从数据库中 connect/disconnect。
因此,方法已更改为创建和使用模拟对象而不是实际对象。
也许在您的情况下,您也可以模拟服务器对象并使模拟对象 return 响应客户端请求,并 运行 断言这些响应,从而检查特定请求是否获得特定的相应响应。
因此,避免为每次测试执行启动和停止实际服务器。
更新:
如果您正在使用 Visual Studio 那么您可以利用 CppUnitTestFramework,它提供了仅在模块级别(TEST_MODULE_INITIALIZE )或在 class 级别(TEST_CLASS_INITIALIZE )或方法级别等
GMock 也适用于 Visual Studio CppUnitTestFramework。
在此处检查 CppUnitTestFramework
如果您希望每个测试套件(单个测试夹具)有一个连接,那么您可以在夹具 class 中定义静态方法 SetUpTestSuite()
和 TearDownTestSuite()
(documentation)
class Base: public ::testing::Test {
public:
static void SetUpTestSuite() {
//code here
}
static void TearDownTestSuite() {
//code here
}
};
如果您希望所有测试套件都使用单个实例,您可以使用全局设置和拆卸 (documentation)
class MyEnvironment: public ::testing::Environment
{
public:
virtual ~MyEnvironment() = default;
// Override this to define how to set up the environment.
virtual void SetUp() {}
// Override this to define how to tear down the environment.
virtual void TearDown() {}
};
然后您需要在 GoogleTest 中注册您的环境,最好在 main()
中(在调用 RUN_ALL_TESTS
之前):
//don't use std::unique_ptr! GoogleTest takes ownership of the pointer and will clean up
MyEnvironment* env = new MyEnvironment();
::testing::AddGlobalTestEnvironment(env);
注意:代码未经测试。
我正在尝试使用 gtest 测试 http 客户端。我想用我自己的 http 服务器测试这个客户端。我有一个小型 python 服务器。测试用例是客户端向此 python 服务器发送各种请求。有没有办法在所有测试之前启动服务器 运行 并在测试之后销毁该服务器?
我正在尝试使用此处所示的 gtest fixture;通过在 SetUp 中创建一个新进程并在 TearDown 中将其终止。但看起来这些调用是针对每个测试进行的。
class Base: public ::testing::Test {
public:
pid_t child_pid = 0;
void SetUp() {
char *cmd = "/usr/bin/python";
char *arg[] = {cmd, "./http_server.py", NULL};
child_pid = fork();
if ( child_pid == 0) {
execvp(cmd, arg);
std::cout << "Failed to exec child: " << child_pid << std::endl;
exit(-1);
} else if (child_pid < 0) {
std::cout << "Failed to fork child: " << child_pid << std::endl;
} else {
std::cout << "Child HTTP server pid: " << child_pid << std::endl;
}
}
void TearDown() {
std::cout << "Killing child pid: " << child_pid << std::endl;
kill(child_pid, SIGKILL);
}
};
TEST_F(Base, test_1) {
// http client downloading url
}
TEST_F(Base, test_2) {
// http client downloading url
}
在使用数据库进行测试时遇到类似问题。 对于每次测试执行,数据库连接都会被连接和断开。测试执行花费了太多时间,除了测试的目的是检查特定函数内部的逻辑而不是从数据库中 connect/disconnect。
因此,方法已更改为创建和使用模拟对象而不是实际对象。 也许在您的情况下,您也可以模拟服务器对象并使模拟对象 return 响应客户端请求,并 运行 断言这些响应,从而检查特定请求是否获得特定的相应响应。 因此,避免为每次测试执行启动和停止实际服务器。
更新: 如果您正在使用 Visual Studio 那么您可以利用 CppUnitTestFramework,它提供了仅在模块级别(TEST_MODULE_INITIALIZE )或在 class 级别(TEST_CLASS_INITIALIZE )或方法级别等 GMock 也适用于 Visual Studio CppUnitTestFramework。
在此处检查 CppUnitTestFramework
如果您希望每个测试套件(单个测试夹具)有一个连接,那么您可以在夹具 class 中定义静态方法 SetUpTestSuite()
和 TearDownTestSuite()
(documentation)
class Base: public ::testing::Test {
public:
static void SetUpTestSuite() {
//code here
}
static void TearDownTestSuite() {
//code here
}
};
如果您希望所有测试套件都使用单个实例,您可以使用全局设置和拆卸 (documentation)
class MyEnvironment: public ::testing::Environment
{
public:
virtual ~MyEnvironment() = default;
// Override this to define how to set up the environment.
virtual void SetUp() {}
// Override this to define how to tear down the environment.
virtual void TearDown() {}
};
然后您需要在 GoogleTest 中注册您的环境,最好在 main()
中(在调用 RUN_ALL_TESTS
之前):
//don't use std::unique_ptr! GoogleTest takes ownership of the pointer and will clean up
MyEnvironment* env = new MyEnvironment();
::testing::AddGlobalTestEnvironment(env);
注意:代码未经测试。