gtest 參數化


 前言:

  在測試用例中,我們時常需要傳給被測函數不同的值,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的參數化功能真的是很方便,可以讓我們以更少的代碼,寫出更強大的測試模塊。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM