C++?測(cè)試框架GoogleTest入門(mén)介紹
引言
開(kāi)發(fā)者雖然主要負(fù)責(zé)工程里的開(kāi)發(fā)任務(wù),但是每個(gè)開(kāi)發(fā)完畢的功能都是需要開(kāi)發(fā)者自測(cè)通過(guò)的,所以經(jīng)常會(huì)聽(tīng)到開(kāi)發(fā)者提起單元測(cè)試的話(huà)題。那么今天我就帶大伙一起來(lái)看看大名鼎鼎的谷歌 C++ 測(cè)試框架 GoogleTest.
簡(jiǎn)單介紹
來(lái)看看谷歌官方是怎么介紹這個(gè)框架的:
Googletest 是由測(cè)試技術(shù)團(tuán)隊(duì)根據(jù) Google 的特定要求和約束開(kāi)發(fā)的測(cè)試框架。無(wú)論您是在 Linux,Windows 還是 Mac 上工作,如果您編寫(xiě) C++ 代碼,googletest 都可以為您提供幫助。它支持任何類(lèi)型的測(cè)試,而不僅僅是單元測(cè)試。
雖然谷歌是根據(jù)特定的需求和限制條件來(lái)開(kāi)發(fā)這個(gè)框架的,但是它自己也指明了這個(gè)框架還可以用于其它用途,比如作為模擬器使用,當(dāng)然這就扯遠(yuǎn)了,暫且不提。
谷歌在開(kāi)發(fā)這套框架的時(shí)候,是有一套基本的設(shè)計(jì)思路的。
他們認(rèn)為測(cè)試應(yīng)該是相互獨(dú)立而且是可重復(fù)的。如果正在做的測(cè)試由于其他測(cè)試的成功或失敗而受到影響,這無(wú)疑會(huì)令人感到痛苦。GoogleTest 通過(guò)在不同的對(duì)象上運(yùn)行不同的測(cè)試來(lái)實(shí)現(xiàn)測(cè)試的相互隔離。當(dāng)其中一個(gè)或多個(gè)測(cè)試失敗時(shí),測(cè)試框架還允許測(cè)試者繼續(xù)單獨(dú)運(yùn)行測(cè)試用例以達(dá)到快速調(diào)試。測(cè)試應(yīng)該組織良好,并反映測(cè)試代碼的結(jié)構(gòu)。有很多測(cè)試其實(shí)可以共享數(shù)據(jù)和子例程的,那么 Googletest 提供了測(cè)試套件的概念將相關(guān)測(cè)試分組,測(cè)試套件中的所有測(cè)試就可以共享數(shù)據(jù)和子例程了。這種模式其實(shí)很常見(jiàn),并且使得測(cè)試易于維護(hù),特別是當(dāng)你需要切換到新的代碼工程時(shí),測(cè)試流程將極大簡(jiǎn)化。
像谷歌這種規(guī)模的科技企業(yè),內(nèi)部的 C++ 項(xiàng)目非常之多,還是跨平臺(tái)的,那么就對(duì)測(cè)試框架有平臺(tái)無(wú)關(guān)的要求了。GoogleTest 正是如此,無(wú)論你是用的是那款編譯器,哪個(gè)平臺(tái),通吃。
當(dāng)然,測(cè)試的過(guò)程中理應(yīng)提供盡可能全面的信息幫助開(kāi)發(fā)者理解執(zhí)行軟件過(guò)程,GoogleTest 也不例外。就算測(cè)試過(guò)程中,某個(gè)測(cè)試執(zhí)行失敗被停止了,測(cè)試框架也會(huì)繼續(xù)其它測(cè)試。如果你不希望某個(gè)測(cè)試由于失敗而停止,可以設(shè)置該測(cè)試為非致命報(bào)錯(cuò)(non-fatal)。像這樣的測(cè)試過(guò)程,可以幫助開(kāi)發(fā)者在單個(gè)運(yùn)行-編輯-編譯周期中找到盡可能多的問(wèn)題 bug。這樣的測(cè)試框架是不是很高效?
雖說(shuō)問(wèn)題 bug 出現(xiàn)就夠令開(kāi)發(fā)者討厭的了,但是自測(cè)過(guò)程的繁瑣事那就更糟心了(頭發(fā)怎么掉得那么快),比如,開(kāi)發(fā)者除了需要測(cè)試具體內(nèi)容還得自己跟蹤測(cè)試清單。Googletest 就可以幫助你從這里邊脫身出來(lái),做一枚瀟灑的碼農(nóng)。
這里問(wèn)一句,你用過(guò) JUnit 或 PyUnit 嗎?如果有的話(huà),那么 Googletest 對(duì)你來(lái)說(shuō)真的是易如反掌了。據(jù)說(shuō) Googletest 是基于 xUnit 架構(gòu)開(kāi)發(fā)而來(lái)。至于什么是 xUnit 架構(gòu),有機(jī)會(huì)我再聊聊吧。
測(cè)試框架在測(cè)試過(guò)程中,基本的測(cè)試操作就是使用斷言(assert)來(lái)驗(yàn)證測(cè)試代碼的行為,崩潰或者斷言失敗都表示被測(cè)試代碼的行為不正確,否則正確。
初體驗(yàn)
來(lái)看一下簡(jiǎn)單的測(cè)試樣例(環(huán)境配置安裝會(huì)在后面有詳細(xì)介紹)
#include <math.h> #include <gtest/gtest.h> int square(const int a) { int b = a * a; if (b != b) { return -1; } else { return a * a; } } TEST(SquareTest, PositiveNos) { ASSERT_EQ(0, square(0)); ASSERT_EQ(36, square(6)); ASSERT_EQ(324, square(18)); } int main(int argc, char **argv) { testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }
這個(gè)測(cè)試樣例是為了測(cè)試函數(shù) int square(const int a) 的行為是否正確。
編譯生成可執(zhí)行文件之后,運(yùn)行起來(lái)
可以看到,上面總共有一個(gè)測(cè)試套件和一個(gè)測(cè)試。首先啟動(dòng)一次全局測(cè)試環(huán)境,使用框架提供的宏 TEST() 創(chuàng)建了一個(gè)測(cè)試套件,命名為 SquareTest,和一個(gè)測(cè)試,命名為 PositiveNos。然后,運(yùn)行測(cè)試套件內(nèi)包含的所有測(cè)試,測(cè)試通過(guò) OK。全部測(cè)試結(jié)束后,卸載全局測(cè)試環(huán)境。匯總?cè)繙y(cè)試結(jié)果 PASSED。測(cè)試流程結(jié)束。
以上就是C++ 測(cè)試框架GoogleTest入門(mén)介紹的詳細(xì)內(nèi)容,更多關(guān)于C++ 測(cè)試框架GoogleTest的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解C++中typedef 和 #define 的區(qū)別
這篇文章主要介紹了C++中typedef 與 #define 的區(qū)別,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09C語(yǔ)言動(dòng)態(tài)數(shù)組的使用實(shí)現(xiàn)代碼
這篇文章主要介紹了C語(yǔ)言動(dòng)態(tài)數(shù)組的使用實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2017-01-01C++設(shè)計(jì)模式之簡(jiǎn)單工廠模式的實(shí)現(xiàn)示例
這篇文章主要給大家介紹了關(guān)于C++設(shè)計(jì)模式之簡(jiǎn)單工廠模式的相關(guān)資料,簡(jiǎn)單工廠模式,主要用于創(chuàng)建對(duì)象,添加類(lèi)時(shí),不會(huì)影響以前的系統(tǒng)代碼,需要的朋友可以參考下2021-06-06C語(yǔ)言文件操作零基礎(chǔ)新手入門(mén)保姆級(jí)教程
在實(shí)際應(yīng)用中,我們往往需要對(duì)文件進(jìn)行操作,下面這篇文章主要給大家分享了關(guān)于C語(yǔ)言文件操作的零基礎(chǔ)新手入門(mén)保姆級(jí)教程,文中通過(guò)示例代碼以及圖片介紹的非常詳細(xì),需要的朋友可以參考下2021-10-10C++調(diào)用Go方法的字符串傳遞問(wèn)題及解決方案
這篇文章主要介紹了C++調(diào)用Go方法的字符串傳遞問(wèn)題及解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之二叉樹(shù)的非遞歸后序遍歷算法
這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之二叉樹(shù)的非遞歸后序遍歷算法的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下2017-10-10