之前的都是一個(gè)個(gè)的去進(jìn)行測(cè)試,比如一個(gè)判斷是不是素?cái)?shù)的函數(shù)欺矫,我測(cè)試就需要這樣:
TEST(IsPrimeTest, HandleTrueReturn)
{
EXPECT_TRUE(IsPrime(3));
EXPECT_TRUE(IsPrime(5));
EXPECT_TRUE(IsPrime(11));
EXPECT_TRUE(IsPrime(23));
EXPECT_TRUE(IsPrime(17));
}
現(xiàn)在我要測(cè)試100個(gè)偷厦,我們是不是要這樣寫一百行呢,要是還要分成不同的測(cè)試案例呢兔综?這就需要我們引入一個(gè)參數(shù)化饿凛。
參數(shù)化
步驟
- 告訴gtest你的參數(shù)類型是什么,添加一個(gè)類软驰,繼承testing::TestWithParam<T>涧窒,其中T就是你需要參數(shù)化的參數(shù)類型,比如上面的找素?cái)?shù)例子锭亏,需要參數(shù)化一個(gè)int型的參數(shù)纠吴。
class IsPrimeParamTest : public::testing::TestWithParam<int>
{
};
- 告訴gtest你拿到參數(shù)的值后,具體做些什么樣的測(cè)試慧瘤。
這里要使用一個(gè)新的宏:TEST_P戴已,關(guān)于這個(gè)"P"的含義,Google給出的答案就是可以理解為”parameterized" (參數(shù)化)或者 "pattern"(模型)锅减。在TEST_P宏里糖儡,使用GetParam()獲取當(dāng)前的參數(shù)的具體值。
TEST_P(IsPrimeParamTest, HandleTrueReturn)
{
int n = GetParam();
EXPECT_TRUE(IsPrime(n));
}
- 告訴gtest你想要測(cè)試的參數(shù)范圍是什么
使用INSTANTIATE_TEST_CASE_P這宏來告訴gtest你要測(cè)試的參數(shù)范圍:
INSTANTIATE_TEST_CASE_P(TrueReturn, IsPrimeParamTest, testing::Values(3, 5, 11, 23, 17));
第一個(gè)參數(shù)是測(cè)試案例的前綴怔匣,可以任意取握联。
第二個(gè)參數(shù)是測(cè)試案例的名稱,需要和之前定義的參數(shù)化的類的名稱相同每瞒,如:IsPrimeParamTest
第三個(gè)參數(shù)是可以理解為參數(shù)生成器金闽,上面的例子使用test::Values表示使用括號(hào)內(nèi)的參數(shù)。Google提供了一系列的參數(shù)生成的函數(shù):
函數(shù) | 含義 |
---|---|
Range(begin, end[, step]) | 范圍在begin~end之間剿骨,步長為step代芜,不包括end |
Values(v1, v2, ..., vN) | v1,v2到vN的值 |
ValuesIn(container) and ValuesIn(begin, end) | 從一個(gè)C類型的數(shù)組或是STL容器,或是迭代器中取值 |
Bool() | 取false 和 true 兩個(gè)值 |
Combine(g1, g2, ..., gN) | 將g1,g2,...gN進(jìn)行排列組合浓利,g1,g2,...gN本身是一個(gè)參數(shù)生成器挤庇,每次分別從g1,g2,..gN中各取出一個(gè)值,組合成一個(gè)元組(Tuple)作為一個(gè)參數(shù)荞膘。 |
注:Combine只在提供了<tr1/tuple>頭的系統(tǒng)中有效罚随。gtest會(huì)自動(dòng)去判斷是否支持tr/tuple玉工,如果你的系統(tǒng)確實(shí)支持羽资,而gtest判斷錯(cuò)誤的話,你可以重新定義宏GTEST_HAS_TR1_TUPLE=1遵班。
~ 更多函數(shù)實(shí)際引用例子:參數(shù)例子 ~
參數(shù)化后的測(cè)試案例名
命名規(guī)則大概為:
prefix/test_case_name.test.name/index
前綴/測(cè)試案例的名稱/索引
文章參考:https://www.cnblogs.com/coderzh/archive/2009/04/08/1431297.html