在 Google Test 框架中,TEST
和 TEST_F
是定義測試用例的兩個核心宏,它們的區別主要體現在 測試上下文的管理方式 上。以下是二者的詳細對比:
1. TEST
宏
定義方式
TEST(TestSuiteName, TestName) {// 測試邏輯
}
特點
- 獨立上下文:每個測試用例獨立運行,不共享任何狀態。
- 無初始化/清理:無法自動執行公共的設置(
SetUp
)和清理(TearDown
)代碼。 - 適用場景:
適用于不需要共享資源的簡單測試,或測試之間完全獨立的情況。
示例
TEST(CalculatorTest, AddTwoNumbers) {Calculator calc;EXPECT_EQ(calc.Add(2, 3), 5);
}TEST(CalculatorTest, SubtractTwoNumbers) {Calculator calc; // 每個測試獨立創建對象EXPECT_EQ(calc.Subtract(5, 3), 2);
}
2. TEST_F
宏
定義方式
TEST_F(TestFixtureClassName, TestName) {// 測試邏輯(可訪問夾具成員)
}
特點
- 共享上下文:測試用例基于一個 測試夾具(Test Fixture),所有測試共享相同的初始化和清理邏輯。
- 自動調用
SetUp
/TearDown
:
每個測試運行前自動調用SetUp()
,運行后自動調用TearDown()
。 - 適用場景:
需要共享配置或資源(如數據庫連接、文件句柄)的復雜測試。
示例
// 定義夾具類
class DatabaseTest : public testing::Test {
protected:void SetUp() override {db.Connect("test_db"); // 每個測試前連接數據庫}void TearDown() override {db.Disconnect(); // 每個測試后斷開連接}Database db;
};// 使用夾具
TEST_F(DatabaseTest, InsertRecord) {EXPECT_TRUE(db.Insert("data"));
}TEST_F(DatabaseTest, QueryRecord) {db.Insert("data");EXPECT_EQ(db.Query(), "data");
}
核心區別總結
特性 | TEST | TEST_F |
---|---|---|
上下文管理 | 獨立上下文,無共享 | 基于夾具共享上下文 |
初始化和清理 | 手動處理 | 自動調用 SetUp() 和 TearDown() |
資源復用 | 每個測試獨立創建資源 | 所有測試共享夾具中的資源 |
代碼冗余 | 高(重復初始化代碼) | 低(通過夾具復用代碼) |
適用場景 | 簡單、獨立的測試 | 需要共享配置或資源的復雜測試 |
如何選擇?
-
使用
TEST
:
測試用例之間完全獨立,無需共享任何設置或資源。 -
使用
TEST_F
:
測試用例需要共享相同的初始化和清理邏輯(例如配置數據庫、創建臨時文件)。
關鍵注意事項
-
夾具類的生命周期:
每個TEST_F
測試運行時,Google Test 會創建一個新的夾具對象,確保測試隔離。 -
避免狀態污染:
即使使用夾具,不同測試之間仍通過獨立的夾具對象隔離狀態。 -
命名規范:
TEST
的TestSuiteName
是自由命名的字符串。TEST_F
的TestFixtureClassName
必須是已定義的夾具類名。
通過合理使用 TEST
和 TEST_F
,可以顯著提高測試代碼的可維護性和執行效率。