簡體   English   中英

不同的 catch2 檢查不同的輸入

[英]Different catch2 checks on different inputs

我正在嘗試測試一些需要一些設置才能使用的代碼,並且我想避免重復設置步驟。 設置步驟對輸入有一定的依賴性,但結果可能會因輸入的具體內容而顯着不同。 有沒有為此設置 catch2 測試用例的好方法?

舉例來說,讓我們考慮一個我們可能想要測試的非常基本的 object:

#include <cmath>
struct SquareRoot {
  double n;
  double root() { return std::sqrt(n); }
};

如果我們想為此編寫一些測試,“肯定”和“否定”顯然是要檢查的(“零”是三分之一)。 對於這兩個,我們需要創建一個 object,這取決於輸入,然后調用 function,但實際檢查非常不同。

#include <catch2/catch.hpp>
TEST_CASE("SquareRoot") {
  SECTION("positive") {
    double n = 4.0;
    SquareRoot sqrt{n};          // <---
    double result = sqrt.root(); // <---
    REQUIRE(result == 2.0);
  }

  SECTION("negative") {
    double n = -4.0;
    SquareRoot sqrt{n};          // <---
    double result = sqrt.root(); // <---
    REQUIRE(std::isnan(result));
  }
}

我可以想象GENERATE()輸入,但是你需要一些方法來決定之后實際運行哪些檢查。

TEST_CASE("SquareRoot") {
  double n = GENERATE(4.0, -4.0);
  SquareRoot sqrt{n};
  double result = sqrt.root();
  // Which REQUIRE do I run here???
}

在實際系統中,object 系統更為復雜。 如果設置超過幾行,我已經成功地將其分解為單獨的 function,但需要在每次測試中重復。 類似地,對結果的檢查通常不止一次(例如,我們可能會在此處的否定情況下檢查errno )。

即使對於簡單的情況,我也傾向於編寫小的輔助函數(或 lambdas)。 對於您的示例,這可能短至:

#include <catch2/catch.hpp>

auto rootTest(double x)
{
    return SquareRoot{x}.root();
}

TEST_CASE("SquareRoot") {
  SECTION("positive") {
    CHECK(rootTest(4.0) == 2.0);
    REQUIRE(errno == 0);
  }

  SECTION("negative") {
    CHECK(std::isnan(rootTest(-4.0)));
    REQUIRE(errno);
  }
}

在更復雜的情況下,您可以另外定義一個 POD 結構,讓您的測試 function 返回多個命名值,這有助於保持測試條件易於閱讀。 您還可以在 function 中使用 Catch2 語句,以防您確實有適用於任何輸入的測試。

暫無
暫無

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

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