玩转Google开源C++单元测试框架Google Test系列(gtest)之一 - 初识gtest
一、前言
本篇將介紹一些gtest的基本使用,包括下載,安裝,編譯,建立我們第一個測試Demo工程,以及編寫一個最簡單的測試案例。?
二、下載
如果不記得網(wǎng)址, 直接在google里搜gtest,第一個就是。目前gtest的最新版本為1.3.0,從下列地址可以下載到該最新版本:
http://googletest.googlecode.com/files/gtest-1.3.0.zip?
http://googletest.googlecode.com/files/gtest-1.3.0.tar.gz?
http://googletest.googlecode.com/files/gtest-1.3.0.tar.bz2?
三、編譯
下載解壓后, 里面有個msvc目錄:
?
使用VS的同學(xué)可以直接打開msvc里面的工程文件, 如果你在使用的是VS2005或是VS2008,打開后會提示你升級,升完級后,我們直接編譯里面的“gtest”工程,可以直接編過的。
這里要提醒一下的是,如果你升級為VS2008的工程,那么你的測試Demo最好也是VS2008工程,不然你會發(fā)現(xiàn)很郁悶,你的Demo怎么也編不過,我也曾折騰了好久,當(dāng)時我升級為了VS2008工程,結(jié)果我使用VS2005工程建Demo,死活編不過。(這里有人誤解了,并不是說只能在VS2008中編譯,在VS2005中同樣可以。如果要編譯VS2005版本,最好保證gtest和你的測試工程都使用VS2005工程。)
編譯之后,在msvc里面的Debug或是Release目錄里看到編譯出來的gtestd.lib或是gtest.lib文件。
四、第一個Demo
下面我們開始建立我們的第一個Demo了,假如之前使用的VS2008編譯的gtest,那么,我們在VS2008中,新建一個Win32 Console Application。接著就是設(shè)置工程屬性,總結(jié)如下:
1.設(shè)置gtest頭文件路徑
2.設(shè)置gtest.lib路徑
3.Runtime Library設(shè)置
?
如果是Release版本,Runtime Library設(shè)為/MT。當(dāng)然,其實你也可以選擇動態(tài)鏈接(/MD),前提是你之前編譯的gtest也使用了同樣是/MD選項。
工程設(shè)置后了后,我們來編寫一個最簡單測試案例試試,我們先來寫一個被測試函數(shù):
int?Foo(int?a,?int?b){
????if?(a?==?0?||?b?==?0)
????{
????????throw?"don't?do?that";
????}
????int?c?=?a?%?b;
????if?(c?==?0)
????????return?b;
????return?Foo(b,?c);
}
沒錯,上面的函數(shù)是用來求最大公約數(shù)的。下面我們就來編寫一個簡單的測試案例。
#include?<gtest/gtest.h>TEST(FooTest,?HandleNoneZeroInput)
{
????EXPECT_EQ(2,?Foo(4,?10));
????EXPECT_EQ(6,?Foo(30,?18));
}
上面可以看到,編寫一個測試案例是多么的簡單。 我們使用了TEST這個宏,它有兩個參數(shù),官方的對這兩個參數(shù)的解釋為:[TestCaseName,TestName],而我對這兩個參數(shù)的定義是:[TestSuiteName,TestCaseName],在下一篇我們再來看為什么這樣定義。
對檢查點的檢查,我們上面使用到了EXPECT_EQ這個宏,這個宏用來比較兩個數(shù)字是否相等。Google還包裝了一系列EXPECT_* 和ASSERT_*的宏,而EXPECT系列和ASSERT系列的區(qū)別是:
??? 1. EXPECT_*? 失敗時,案例繼續(xù)往下執(zhí)行。
??? 2. ASSERT_* 失敗時,直接在當(dāng)前函數(shù)中返回,當(dāng)前函數(shù)中ASSERT_*后面的語句將不會執(zhí)行。?
在下一篇,我們再來具體討論這些斷言宏。為了讓我們的案例運行起來,我們還需要在main函數(shù)中添加如下代碼:
int?_tmain(int?argc,?_TCHAR*?argv[]){
????testing::InitGoogleTest(&argc,?argv);
????return?RUN_ALL_TESTS();
}
“testing::InitGoogleTest(&argc, argv);” :gtest的測試案例允許接收一系列的命令行參數(shù),因此,我們將命令行參數(shù)傳遞給gtest,進(jìn)行一些初始化操作。gtest的命令行參數(shù)非常豐富,在后面我們也會詳細(xì)了解到。
“RUN_ALL_TESTS()” :運行所有測試案例
OK,一切就緒了,我們直接運行案例試試(一片綠色,非常爽):
?
五、總結(jié)
本篇內(nèi)容確實是非常的初級,目的是讓從來沒有接觸過gtest的同學(xué)了解gtest最基本的使用。gtest還有很多更高級的使用方法,我們將會在后面討論。總結(jié)本篇的內(nèi)容的話:
??? 1. 使用VS編譯gtest.lib文件
??? 2. 設(shè)置測試工程的屬性(頭文件,lib文件,/MT參數(shù)(和編譯gtest時使用一樣的參數(shù)就行了))
??? 3. 使用TEST宏開始一個測試案例,使用EXPECT_*,ASSER_*系列設(shè)置檢查點。
??? 4. 在Main函數(shù)中初始化環(huán)境,再使用RUN_ALL_TEST()宏運行測試案例。
優(yōu)點:
??? 1. 我們的測試案例本身就是一個exe工程,編譯之后可以直接運行,非常的方便。
??? 2. 編寫測試案例變的非常簡單(使用一些簡單的宏如TEST),讓我們將更多精力花在案例的設(shè)計和編寫上。
??? 3. 提供了強(qiáng)大豐富的斷言的宏,用于對各種不同檢查點的檢查。
??? 4. 提高了豐富的命令行參數(shù)對案例運行進(jìn)行一系列的設(shè)置。
總結(jié)
以上是生活随笔為你收集整理的玩转Google开源C++单元测试框架Google Test系列(gtest)之一 - 初识gtest的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tinyxml2解析XML文件
- 下一篇: 玩转Google开源C++单元测试框架G