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 响应客户端请求,并 运行 断言这些响应,从而检查特定请求是否获得特定的相应响应。 因此,避免为每次测试执行启动和停止实际服务器。

more about google mocks here

更新: 如果您正在使用 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);

注意:代码未经测试。