gtest 三種事件機制
前言:
1.首先說明gtest中事件的結構層次:
測試程序:一個測試程序只有一個main函數,也可以說是一個可執行程序是一個測試程序。該級別的事件機制會在程序的開始和結束執行。
測試套件:代表一個測試用例的集合體,該級別的事件機制會在整體的測試案例開始可結束執行。
測試用例:該級別的事件機制會在每個測試用例開始和結束都執行。
gtest中的事件機制是指在測試前和測試後提供給用戶自行添加操作的機制,而且次機制也可用讓同一測試套件下的測試用例共享數據。
一、全局的事件機制(針對整個測試程序)
實現全局的事件機制,需要創建一個自己的類,然後繼承testing::Environment類,然後分別實現成員函數SetUp()和TearDown(),同時在main函數內進行調用,即"testing::AddGlobalTestEnvironment(new MyEnvironment);",通過調用函數我們可以添加多個全局的事件機制。
SetUp()函數是在所有測試開始前執行。
TearDown()函數是在所有測試結束後執行。
示例:
1 /*********************************************** 2 3 Filename : test.cpp 4 Author : 5 Description : 6 Create Data : 2018-10-21 00:42:34 7 Modfiy History : 2018-10-21 00:42:34 8 9 ***********************************************/ 10 11 #include <iostream> 12 13 #include <gtest/gtest.h> 14 15 using namespace std; 16 17 class MyEnvironment0 : public testing::Environment 18 { 19 public: 20 virtual void SetUp() 21 { 22 cout << "Global event0 : start" << endl; 23 }24 25 virtual void TearDown() 26 { 27 cout << "Global event0 : end" << endl; 28 } 29 }; 30 31 class MyEnvironment1 : public testing::Environment 32 { 33 public: 34 virtual void SetUp() 35 { 36 cout << "Global event1 : start" << endl; 37 } 38 39 virtual void TearDown() 40 { 41 cout << "Global event1 : end" << endl; 42 } 43 }; 44 45 TEST(GlobalTest0, test0) 46 { 47 EXPECT_EQ(1, 1); 48 }; 49 50 51 TEST(GlobalTest0, test1) 52 { 53 EXPECT_EQ(2, 2); 54 }; 55 56 TEST(GlobalTest1, test0) 57 { 58 EXPECT_EQ(3, 3); 59 }; 60 61 int main(int argc, char *argv[]) 62 { 63 testing::AddGlobalTestEnvironment(new MyEnvironment0); 64 testing::AddGlobalTestEnvironment(new MyEnvironment1); 65 66 testing::InitGoogleTest(&argc, argv); 67 68 return RUN_ALL_TESTS(); 69 }
編譯命令及結果:
二、局部的事件機制(針對一個個測試套件)
測試套件的事件機制我們同樣需要去創建一個類,繼承testing::Test,實現兩個靜態函數SetUpTestCase()和TearDownTestCase(),測試套件的事件機制不需要像全局事件機制一樣在main註冊,而是需要將我們平時使用的TEST宏改為TEST_F宏。
SetUpTestCase()函數是在測試套件第一個測試用例開始前執行。
TearDownTestCase()函數是在測試套件最後一個測試用例結束後執行。
需要註意TEST_F的第一個參數使我們創建的類名,也就是當前測試套件的名稱。
示例:
1 /*********************************************** 2 3 Filename : test.cpp 4 Author : 5 Description : 6 Create Data : 2018-10-21 01:05:17 7 Modfiy History : 2018-10-21 01:05:17 8 9 ***********************************************/ 10 11 #include <iostream> 12 13 #include <gtest/gtest.h> 14 15 using namespace std; 16 17 class MyTestSuite0 : public testing::Test 18 { 19 protected: 20 static void SetUpTestSuite() 21 { 22 cout << "TestSuite event0 : start" << endl; 23 } 24 25 static void TearDownTestSuite() 26 { 27 cout << "TestSuite event0 : end" << endl; 28 } 29 }; 30 31 class MyTestSuite1 : public testing::Test 32 { 33 protected: 34 static void SetUpTestSuite() 35 { 36 cout << "TestSuite event1 : start" << endl; 37 } 38 39 static void TearDownTestSuite() 40 { 41 cout << "TestSuite event1 : end" << endl; 42 } 43 }; 44 45 TEST_F(MyTestSuite0, test0) 46 { 47 EXPECT_EQ(1, 1); 48 } 49 50 TEST_F(MyTestSuite1, test0) 51 { 52 EXPECT_EQ(1, 1); 53 } 54 55 TEST_F(MyTestSuite0, test1) 56 { 57 EXPECT_EQ(1, 1); 58 } 59 60 TEST_F(MyTestSuite1, test1) 61 { 62 EXPECT_EQ(1, 1); 63 } 64 65 int main(int argc, char *argv[]) 66 { 67 testing::InitGoogleTest(&argc, argv); 68 69 return RUN_ALL_TESTS(); 70 }
編譯命令及結果:
三、個體的事件機制(針對一個個測試用例)
測試用例的事件機制的創建和測試套件的基本一樣,不同地方在於測試用例實現的兩個函數分別是SetUp()和TearDown(),這兩個函數不是靜態函數了。
SetUp()函數是在一個測試用例的開始前執行。
TearDown()函數是在一個測試用例的結束後執行。
示例:
1 /*********************************************** 2 3 Filename : test.cpp 4 Author : 5 Description : 6 Create Data : 2018-10-21 01:23:12 7 Modfiy History : 2018-10-21 01:23:12 8 9 ***********************************************/ 10 11 #include <iostream> 12 13 #include <gtest/gtest.h> 14 15 using namespace std; 16 17 class MyTestCase0 : public testing::Test 18 { 19 protected: 20 virtual void SetUp() 21 { 22 cout << "TestCase event0 : start" << endl; 23 } 24 25 virtual void TearDown() 26 { 27 cout << "TestCase event0 : end" << endl; 28 } 29 }; 30 31 class MyTestCase1 : public testing::Test 32 { 33 protected: 34 virtual void SetUp() 35 { 36 cout << "TestCase event1 : start" << endl; 37 } 38 virtual void TearDown() 39 { 40 cout << "TestCase event1 : end" << endl; 41 } 42 }; 43 44 TEST_F(MyTestCase0, test0) 45 { 46 EXPECT_EQ(1, 1); 47 } 48 49 TEST_F(MyTestCase0, test1) 50 { 51 EXPECT_EQ(1, 1); 52 } 53 54 TEST_F(MyTestCase1, test0) 55 { 56 EXPECT_EQ(1, 1); 57 } 58 59 TEST_F(MyTestCase1, test1) 60 { 61 EXPECT_EQ(1, 1); 62 } 63 64 int main(int argc, char *argv[]) 65 { 66 testing::InitGoogleTest(&argc, argv); 67 68 return RUN_ALL_TESTS(); 69 }
編譯命令及結果:
總結:
gtest的三種事件機制總的來說還是簡單的,而且也比較靈活,通過上面的例子也能看出我們可以在事件機制中實現一些資源共享,使我們的測試更加靈活。
gtest 三種事件機制