簡體   English   中英

Google Test:如何為多個測試只運行一次fixture?

[英]Google Test: How to run fixture only once for multiple tests?

我正在嘗試使用 gtest 測試 http 客戶端。 我想用我自己的 http 服務器測試這個客戶端。 我有一個小型 python 服務器。 測試用例是客戶端向這個 python 服務器發送各種請求。 有沒有辦法在所有測試運行之前啟動服務器並在測試后銷毀該服務器?

我正在嘗試使用 gtest 固定裝置,如下所示; 通過在 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
}

如果您希望每個測試套件有一個連接(單個測試夾具),那么您可以在夾具類( 文檔)中定義靜態方法SetUpTestSuite()TearDownTestSuite() )

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

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

如果您希望所有測試套件都有一個實例,您可以使用全局設置和拆卸( 文檔

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

注意:代碼未經測試。

使用數據庫進行測試時遇到了類似的問題。 對於每次測試執行,數據庫連接都會被連接和斷開。 除了測試的目的是檢查特定函數內部的邏輯而不是連接/斷開與數據庫的連接之外,測試執行花費了太多時間。

因此,該方法已更改為創建和使用模擬對象而不是實際對象。 也許在您的情況下,您也可以模擬服務器對象並使模擬對象返回對客戶端請求的響應並對這些響應運行斷言,從而檢查特定請求是否獲得特定的相應響應。 因此,避免為每次測試執行啟動和停止實際服務器。

更多關於谷歌模擬在這里

更新:如果您使用的是 Visual Studio,那么您可以利用 CppUnitTestFramework,它提供了僅在模塊級別 (TEST_MODULE_INITIALIZE) 或在類級別 (TEST_CLASS_INITIALIZE) 或方法級別等執行一次函數的工具。 GMock 也適用於 Visual Studio CppUnitTestFramework。

在此處查看CppUnitTestFramework

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM