[英]Catch2 - Populating singleton with different mock data for different test files
[英]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.