Google C++单元测试框架(Gtest)系列教程之六——FAQ节选
這一節,我們來看Gtest的FAQ(Frequently-Asked Questions)。
為什么測試用例和測試實例命名中不應包含下劃線
在C++中,對于以下情況,相應的標識可能會被編譯器或標準庫使用:
為避免標識符沖突,用戶代碼中不應自定義以上兩種情況的標識。使用TEST()或TEST_F()時,濫用下劃線,將有可能產生標志符命名沖突。
當我們定義以下測試實例并執行測試程序時,Gtest會為我們生成一個名為TestCaseName_TestName_Test的類。
TEST(TestCaseName, TestName)如果TestCaseName或TestName中包含下劃線,情況會怎樣呢?
- TestCaseName以"_"開頭(例如_Foo),我們得到_Foo_TestName_Test
- TestCaseName以"_"結尾(例如Foo_),我們得到Foo__TestName_Test
- TestName以"_"開頭(例如_bar),我們得到TestCaseName__bar_Test
- TestName以"_"結尾(例如bar_),我們得到TestCaseName_bar__Test
以上命名方式都有可能產生命名沖突,因而TestCaseName和TestName以“_"開頭或結尾均不可取。
如果TestCaseName或TestName命名中包含下劃線,情況又會怎樣呢?
TEST(Time, Flies_Like_An_Arrow) { ... } TEST(Time_Flies, Like_An_Arrow) { ... }假設我們同時定義了兩個測試實例,Oops! 這時Gtest將產生同一個類:Time_Flies_Like_An_Arrow。
因而為避免命名沖突的情況發生(不管是與系統標志沖突或自定義的標志間沖突),我們的測試用例或測試實例的命名最好不包含下劃線。當然,這是建議而不是必須的。
在測試固件類中,為什么要用set-up/tear-down函數,而不使用構造函數/析構函數
還記得測試固件的作用嗎?通過測試固件,Gtest為每一個測試實例生成一個測試固件對象,該對象為每個測試實例提供獨立的數據配置,通過編寫SetUp()/TearDown()函數,我們可以對數據進行初始化和銷毀操作。
對于一個類而言,構造函數和析構函數不是同樣有初始化數據/銷毀數據的作用嗎?Gtest提供SetUp()和TearDown()豈不是多此一舉?No,no,no, 對于以下情況,還非得用SetUp()/TearDown()不可:
對于銷毀操作中包含異常拋出調用的,由于在C++的析構函數中不能拋出異常,這時候需使用TearDown()調用(關于C++析構函數拋出異常的介紹,請看這里)。
為什么當我調用RUN_ALL_TESTS()函數時,編譯器拋出"ignoring return value"警告
一些Gtest使用者忽略了RUN_ALL_TESTS()的返回值,理應這樣調用:
return RUN_ALL_TESTS();而不是這樣:
RUN_ALL_TESTS();測試程序根據RUN_ALL_TESTS()的返回值判斷其所包含的測試實例是否通過。如果在main()函數中忽略其返回值,即使是某個測試實例檢測失敗,整個測試程序也會被認為是無檢測失敗地成功執行。
為避免誤用RUN_ALL_TESTS(),對于不作為main()返回值的調用,gcc將對此拋出警告,為消除該警告,將RUN_ALL_TESTS()作為main()函數的返回值即可。
如何為一個測試固件定義多個測試用例
我想編寫多個測試實例,它們對應于同一個測試固件,對此,是否要為每一個測試實例編寫新的測試固件類?就像這樣:
class FooTest : public BaseTest {};TEST_F(FooTest, Abc) { ... } TEST_F(FooTest, Def) { ... }class BarTest : public BaseTest {};TEST_F(BarTest, Abc) { ... } TEST_F(BarTest, Def) { ... }這里類FooTest和類BarTest什么都不做,我們這樣定義只是為了產生兩個不同的測試用例名。
其實使用typedef能更便捷地達到目的:
typedef BaseTest FooTest;TEST_F(FooTest, Abc) { ... } TEST_F(FooTest, Def) { ... }typedef BaseTest BarTest;TEST_F(BarTest, Abc) { ... } TEST_F(BarTest, Def) { ... }總結
以上是生活随笔為你收集整理的Google C++单元测试框架(Gtest)系列教程之六——FAQ节选的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用google mock模拟C++对象
- 下一篇: gcc 参数 -fprofile-arc