Google Test: Как запустить прибор только один раз для нескольких тестов? - PullRequest
2 голосов
/ 19 июня 2019

Я пытаюсь протестировать http-клиента с помощью gtest.Я хочу протестировать этот клиент с моим собственным 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
}

Ответы [ 2 ]

3 голосов
/ 19 июня 2019

Если вы хотите иметь одно соединение на набор тестов (одно тестовое устройство), то вы можете определить статические методы SetUpTestSuite() и TearDownTestSuite() в своем классе приборов ( документация )

class Base: public ::testing::Test {
public:
    static void SetUpTestSuite() {
        //code here
    }

    static void TearDownTestSuite() {
        //code here
    }
};

Если вы предпочитаете иметь один экземпляр для всех наборов тестов, вы можете использовать глобальные SetUp и TearDown ( документация )

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);

Примечание: Код не был проверен.

1 голос
/ 19 июня 2019

Столкнулся с подобной проблемой при тестировании с базой данных.При каждом выполнении теста соединение с базой данных было подключено и отключено.Выполнение тестов заняло слишком много времени, кроме того, целью тестов было проверить логику внутри определенной функции, а не подключаться / отключаться от базы данных.

Итак, подход был изменен, чтобы создавать и использовать фиктивные объекты вместо реальных объектов.Возможно, в вашем случае вы также можете смоделировать объект сервера и заставить фиктивный объект возвращать ответы на клиентские запросы и запускать утверждения для этих ответов, проверяя тем самым, что конкретный запрос получает конкретный соответствующий ответ.Следовательно, избегая запуска и остановки реального сервера для каждого выполнения теста.

подробнее о гуглах Google здесь

Обновление: если вы используете Visual Studio, вы можете использовать CppUnitTestFramework, который дает возможность выполнять функции только один раз на уровне модуля (TEST_MODULE_INITIALIZE)) или один раз на уровне класса (TEST_CLASS_INITIALIZE) или уровне метода и т. д. GMock также работает с Visual Studio CppUnitTestFramework.

проверьте здесь CppUnitTestFramework

...