首先想到的是在用例中對每個斷言的結果進行判斷,但如果用例中存在比較多斷言或用例很多時,要在每個用例中都增加一堆的if語句,這樣很麻煩,代碼也不美觀。于是研究了下gtest的源碼,發現gtest有提供獲取當前用例信息的接口:
(1)gtest用例結構
在使用它的接口之前,首先得理解清楚其用例結構。gtest中有3個與用例結構相關的類:TestCase、TestInfo和Test。
TestCase并不是指的用例,而且我們平常說的用例集(test suite),而且Test才是我們平常說的用例,所以TestCase是Test的集合;TestInfo是存放用例信息的類,包括用例集名、用例名和執行結果等信息;TestCase中有個TestInfo*的vector,用于保存用例集中每個用例的信息。
(2)TestInfo和Test的關聯
Test類中沒有TestInfo的成員,那么它們是怎么關聯起來的呢?通過代碼調試用例的執行過程發現,在所有用例之前會把用例的信息寫進TestInfo*的vector中,而在構造TestInfo對象時,通過一個TestFactoryBase* factory的成員與相應的用例類綁定,執行到某個用例時,再通過相應的CreateTest函數來創建用例對象。
(3)UniTest::GetInstance()
UnitTest是個單件,可以通過UniTest::GetInstance()函數獲取單件的實例;