前言:
在測試用例中,我們時常需要傳給被測函數不同的值,gtest為我們提供了簡便的方法,可以使我們能夠靈活的進行參數化測試。
步驟:
1.創建一個類,繼承testing::TestWithParam<T>,T是你需要參數化的參數類型,比如參數類型為int
2. 使用新宏TEST_P替代TEST。在TEST_P宏里,可以使用GetParam()獲取當前的參數的具體值。
3. 使用INSTANTIATE_TEST_CASE_P宏來輸入測試參數。
參數解釋和表格直接貼上某個大佬的解釋:
第一個參數是測試案例的前綴,可以任意取。
第二個參數是測試案例的名稱,需要和之前定義的參數化的類的名稱相同。
第三個參數是可以理解為參數生成器,上面的例子使用test::Values表示使用括號內的參數。Google提供了一系列的參數生成的函數:
Range(begin, end[, step]) | 范圍在begin~end之間,步長為step,不包括end |
Values(v1, v2, ..., vN) | v1,v2到vN的值 |
ValuesIn(container) and ValuesIn(begin, end) | 從一個C類型的數組或是STL容器,或是迭代器中取值 |
Bool() | 取false 和 true 兩個值 |
Combine(g1, g2, ..., gN) | 這個比較強悍,它將g1,g2,...gN進行排列組合,g1,g2,...gN本身是一個參數生成器,每次分別從g1,g2,..gN中各取出一個值,組合成一個元組(Tuple)作為一個參數。 說明:這個功能只在提供了<tr1/tuple>頭的系統中有效。gtest會自動去判斷是否支持tr/tuple,如果你的系統確實支持,而gtest判斷錯誤的話,你可以重新定義宏GTEST_HAS_TR1_TUPLE=1 |
示例:
示例1:最簡單的Values()的使用。
1 /*********************************************** 2 3 Filename : test3.cpp 4 Author : 5 Description : 6 Create Data : 2018-10-21 03:15:54 7 Modfiy History : 2018-10-21 03:15:54 8 9 ***********************************************/ 10 11 #include <iostream> 12 13 #include <gtest/gtest.h> 14 15 using namespace std; 16 17 class myTest : public testing::TestWithParam<int> 18 { 19 20 }; 21 22 TEST_P(myTest, test0) 23 { 24 int num = GetParam(); 25 cout << num << endl; 26 } 27 28 INSTANTIATE_TEST_CASE_P(ttt, myTest, testing::Values(1, 2, 3, 4)); 29 30 int main(int argc, char *argv[]) 31 { 32 testing::InitGoogleTest(&argc, argv); 33 34 return RUN_ALL_TESTS(); 35 }
編譯及結果:
示例2:Combine(g1, g2, ..., gN)的使用
1 /*********************************************** 2 3 Filename : test1.cpp 4 Author : 5 Description : 6 Create Data : 2018-10-21 02:40:25 7 Modfiy History : 2018-10-21 02:40:25 8 9 ***********************************************/ 10 11 #include <iostream> 12 #include <gtest/gtest.h> 13 14 using namespace std; 15 16 class funcTest : public testing::TestWithParam< tr1::tuple<int , int> > 17 { 18 protected: 19 virtual void SetUp() 20 { 21 // 如果此時參數是<1, 2> 22 // 那么 a = 1 23 // b = 2 24 a = tr1::get<0>(GetParam()); 25 b = tr1::get<1>(GetParam()); 26 } 27 virtual void TearDown() 28 { 29 30 } 31 int a; 32 int b; 33 }; 34 35 int func(int a, int b) 36 { 37 return a + b; 38 } 39 40 TEST_P(funcTest, test0) 41 { 42 cout << a << " + " << b <<" = " << func(a , b) << endl; 43 } 44 45 /*INSTANTIATE_TEST_CASE_P(MyFuncTest, 46 funcTest, 47 Combine(testing::Values(1, 2, 3), testing::Bool()));*/ 48 49 INSTANTIATE_TEST_CASE_P(MyFuncTest, 50 funcTest, 51 testing::Combine(testing::Values(1, 2, 3), testing::Values(1, 2))); 52 53 int main(int argc, char *argv[]) 54 { 55 testing::InitGoogleTest(&argc, argv); 56 57 return RUN_ALL_TESTS(); 58 }
編譯及結果:
示例3:傳參結構體
1 /*********************************************** 2 3 Filename : test2.cpp 4 Author : 5 Description : 6 Create Data : 2018-10-21 02:54:46 7 Modfiy History : 2018-10-21 02:54:46 8 9 ***********************************************/ 10 11 #include <iostream> 12 #include <gtest/gtest.h> 13 14 using namespace std; 15 16 using ::testing::TestWithParam; 17 using ::testing::Bool; 18 using ::testing::Values; 19 20 struct T 21 { 22 int a; 23 double b; 24 string c; 25 }; 26 27 class MyTest : public TestWithParam<struct T> 28 { 29 protected: 30 virtual void SetUp() 31 { 32 t1.a = GetParam().a; 33 t1.b = GetParam().b; 34 t1.c = GetParam().c; 35 } 36 virtual void TearDown() 37 { 38 39 } 40 41 struct T t1; 42 }; 43 44 TEST_P(MyTest, test0) 45 { 46 cout << t1.a<< " - " << t1.b << " - " << t1.c << endl; 47 } 48 49 INSTANTIATE_TEST_CASE_P(ttt1, MyTest, Values(T{1, 2.2 ,"cc"}, T{2, 3.3 ,"ee"})); 50 51 int main(int argc, char *argv[]) 52 { 53 testing::InitGoogleTest(&argc, argv); 54 55 return RUN_ALL_TESTS(); 56 }
編譯及結果:
總結:
gtest的參數化功能真的是很方便,可以讓我們以更少的代碼,寫出更強大的測試模塊。