斷言
什么是斷言?
- 在百科上是這樣定義的:斷言通常表示為一些布爾表達式,程序員相信在程序中的某個特定點該表達式值為真,可以在任何時候啟用和禁用斷言驗證,因此可以在測試時啟用斷言而在部署時禁用斷言。同樣,程序投入運行后,最終用戶在遇到問題時可以重新啟用斷言。 使用斷言可以創建更穩定、品質更好且 不易于出錯的代碼。當需要在一個值為FALSE時中斷當前操作的話,可以使用斷言。
- 簡單來說,就是我們在編寫程序中會做出一些假設,斷言就是用于在代碼中捕獲這些假設,并對這個假設的結果進行分析,做出相應的動作。
在gtest中,斷言的宏可以分為以下兩類:
- ASSERT_* 系列的斷言,當檢查點失敗時,退出當前函數(注意:并非退出當前案例)。
- EXPECT_* 系列的斷言,當檢查點失敗時,繼續往下執行。
常用的檢查有:布爾值檢查、數值型數據檢查、浮點型檢查、字符串檢查、類型檢查、顯示返回成功或失敗、異常檢查等。
具有哪些斷言和用法可以查看下面的這個鏈接的內容,里面寫的非常詳細。
http://www.cnblogs.com/coderzh/archive/2009/04/06/1430364.html
事件機制
gtest提供了多種事件機制,非常方便我們在案例之前或之后做一些操作。通過繼承Test類,使用TEST_F宏,我們可以在案例之間共享一些通用方法,共享資源。gtest的事件一共有3種:
- 全局的,所有案例執行前后。
- TestSuite級別的,在某一批案例中第一個案例前,最后一個案例執行后。
- TestCase級別的,每個TestCase前后。
全局事件
要實現全局事件,必須寫一個類,繼承testing::Environment類,實現里面的SetUp和TearDown方法。
- SetUp()方法在所有案例執行前執行
- TearDown()方法在所有案例執行后執行
class FooEnvironment : public testing::Environment
{
public:
virtual void SetUp()
{
std::cout << "Foo FooEnvironment SetUP" << std::endl;
}
virtual void TearDown()
{
std::cout << "Foo FooEnvironment TearDown" << std::endl;
}
};
添加這個全局事件,方法是在main函數中通過testing::AddGlobalTestEnvironment方法將事件掛進來。當然,我們可以用同樣的"模板"寫很多個這樣的類。
int _tmain(int argc, _TCHAR* argv[])
{
testing::AddGlobalTestEnvironment(new FooEnvironment);
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
TestSuite事件
寫一個類,繼承testing::Test,然后實現兩個靜態方法:
- SetUpTestCase() 方法在第一個TestCase之前執行
- TearDownTestCase() 方法在最后一個TestCase之后執行
class FooTest : public testing::Test {
protected:
static void SetUpTestCase() {
......
}
static void TearDownTestCase() {
......
}
static ......;
};
- 在編寫測試案例時,我們要使用TEST_F這個宏,第一個參數必須是我們上面類的名字,代表一個TestSuite。在測試時,會把TestSuite中使用TEST_F的宏和同一第一個參數(類名)的測試用例作為看作一個整體。
TEST_F(FooTest, Test1)
{
......
}
TEST_F(FooTest, Test2)
{
......
}
TestCase事件
TestCase事件是掛在每個案例執行前后的,實現方式和上面的幾乎一樣,不過需要實現的是SetUp方法和TearDown方法:
- SetUp()方法在每個TestCase之前執行
- TearDown()方法在每個TestCase之后執行
class FooCalcTest:public testing::Test
{
protected:
virtual void SetUp()
{
m_foo.Init();
}
virtual void TearDown()
{
m_foo.Finalize();
}
FooCalc m_foo;
};
TEST_F(FooCalcTest, HandleNoneZeroInput)
{
......
}
TEST_F(FooCalcTest, HandleNoneZeroInput_Error)
{
......
}