gtest學習


介紹

學習如下gtest課程,總結主要的部分

1.玩轉Google開源C++單元測試框架Google Test系列(gtest)之一 - 初識gtest

2.玩轉Google開源C++單元測試框架Google Test系列(gtest)之二 - 斷言

3.玩轉Google開源C++單元測試框架Google Test系列(gtest)之三 - 事件機制

4.玩轉Google開源C++單元測試框架Google Test系列(gtest)之四 - 參數化

5.玩轉Google開源C++單元測試框架Google Test系列(gtest)之五 - 死亡測試 

6.玩轉Google開源C++單元測試框架Google Test系列(gtest)之六 - 運行參數

7.玩轉Google開源C++單元測試框架Google Test系列(gtest)之七 - 深入解析gtest

8.玩轉Google開源C++單元測試框架Google Test系列(gtest)之八 - 打造自己的單元測試框架

 

其中:

初始gtest:講了gtest環境搭建,及第一個demo (必會)

斷言:是gtest結果判斷,寫測試用例必用(必會)

事件機制:是在用例前后執行的,減少公共代碼(提高)

參數化: 構造一批參數多次執行測試用例(提高)

死亡測試:崩潰或退出斷言(掌握,備查)

運行參數:介紹gtest執行時可以輸入的系統參數(掌握,備查)

深入解析:通過展開gtest關鍵宏,看gtest源碼,學習Gtest原理(高級,理解精髓)

       Gtest通過很簡單的原理實現了C++的單元測試,還是需要好好理解其中的設計思想。

打造自己…:學習原理后,自己實現一個簡化的gtest(高級)

1      初識gtest

玩轉Google開源C++單元測試框架Google Test系列(gtest)之一 - 初識gtest

本篇將介紹一些gtest的基本使用,包括下載,安裝,編譯,建立我們第一個測試Demo工程,以及編寫一個最簡單的測試案例。 

 

Gtest官網

http://code.google.com/p/googletest/

從官方的使用文檔里,你幾乎可以獲得你想要的所有東西

http://code.google.com/p/googletest/wiki/GoogleTestPrimer

http://code.google.com/p/googletest/wiki/GoogleTestAdvancedGuide

 

編譯

用VS2017打開工程,直接編譯即可。

可以修改CMakeLists.txt中的一些配置。

編譯之后,在msvc里面的Debug或是Release目錄里看到編譯出來的gtestd.lib或是gtest.lib文件。

googletest\msvc\2010\gtest\Win32-Debug

 

2      斷言

玩轉Google開源C++單元測試框架Google Test系列(gtest)之二 - 斷言

 gtest中,斷言的宏可以理解為分為兩類,一類是ASSERT系列,一類是EXPECT系列。一個直觀的解釋就是:

1. ASSERT_* 系列的斷言,當檢查點失敗時,退出當前函數(注意:並非退出當前案例)。 

2. EXPECT_* 系列的斷言,當檢查點失敗時,繼續往下執行。

 

變量值檢查,如整數,bool,字符串等

這種有很多,輸入EXPECT_ 和 ASSERT_ 聯想很容易認識

顯式返回成功或失敗

直接返回成功:SUCCEED();

返回失敗: 

Fatal assertion

Nonfatal assertion

FAIL();

ADD_FAILURE();

 異常檢查

EXPECT_THROW

 EXPECT_ANY_THROW

 EXPECT_NO_THROW

類型檢查

testing::StaticAssertTypeEq<int, T>();

3      事件機制

玩轉Google開源C++單元測試框架Google Test系列(gtest)之三 - 事件機制

gtest提供了多種事件機制,非常方便我們在案例之前或之后做一些操作,有如下三種。

全局事件

全局的,所有案例執行前后。

要實現全局事件,必須寫一個類,繼承testing::Environment類,實現里面的SetUp和TearDown方法。

1. SetUp()方法在所有案例執行前執行

2. TearDown()方法在所有案例執行后執行

當然,這樣還不夠,我們還需要告訴gtest添加這個全局事件,我們需要在main函數中通過testing::AddGlobalTestEnvironment方法將事件掛進來,也就是說,我們可以寫很多個這樣的類,然后將他們的事件都掛上去。

TestSuite事件

TestSuite級別的,在某一批案例中第一個案例前,最后一個案例執行后。

我們需要寫一個類,繼承testing::Test,然后實現兩個靜態方法

1. SetUpTestCase() 方法在第一個TestCase之前執行

2. TearDownTestCase() 方法在最后一個TestCase之后執行

在編寫測試案例時,我們需要使用TEST_F這個宏,第一個參數必須是我們上面類的名字,代表一個TestSuite。

TestCase事件

TestCase級別的,每個TestCase前后。

TestCase事件是掛在每個案例執行前后的,實現方式和上面的幾乎一樣,不過需要實現的是SetUp方法和TearDown方法:

1. SetUp()方法在每個TestCase之前執行

2. TearDown()方法在每個TestCase之后執行

 

4      參數化

玩轉Google開源C++單元測試框架Google Test系列(gtest)之四 - 參數化

在設計測試案例時,經常需要考慮給被測函數傳入不同的值的情況。我們之前的做法通常是寫一個通用方法,然后編寫在測試案例調用它。即使使用了通用方法,這樣的工作也是有很多重復性的,程序員都懶,都希望能夠少寫代碼,多復用代碼。Google的程序員也一樣,他們考慮到了這個問題,並且提供了一個靈活的參數化測試的方案。

 

就是如果需要測試一個參數為很多值的時候,可以一次寫好。具體先不看了。

5      死亡測試

玩轉Google開源C++單元測試框架Google Test系列(gtest)之五 - 死亡測試 

“死亡測試”名字比較恐怖,這里的“死亡”指的的是程序的崩潰。通常在測試過程中,我們需要考慮各種各樣的輸入,有的輸入可能直接導致程序崩潰,這時我們就需要檢查程序是否按照預期的方式掛掉,這也就是所謂的“死亡測試”。gtest的死亡測試能做到在一個安全的環境下執行崩潰的測試案例,同時又對崩潰結果進行驗證。

Fatal assertion

Nonfatal assertion

Verifies

ASSERT_DEATH(statement, regex`);

EXPECT_DEATH(statement, regex`);

statement crashes with the given error

ASSERT_EXIT(statement, predicate, regex`);

EXPECT_EXIT(statement, predicate, regex`);

statement exits with the given error and its exit code matches predicate

由於有些異常只在Debug下拋出,因此還提供了*_DEBUG_DEATH,用來處理Debug和Realease下的不同。

簡單來說,通過*_DEATH(statement, regex`)和*_EXIT(statement, predicate, regex`),我們可以非常方便的編寫導致崩潰的測試案例,並且在不影響其他案例執行的情況下,對崩潰案例的結果進行檢查。

6      運行參數

玩轉Google開源C++單元測試框架Google Test系列(gtest)之六 - 運行參數

gtest也為我們提供了一系列的運行參數(環境變量、命令行參數或代碼里指定),使得我們可以對案例的執行進行一些有效的控制。

對於運行參數,gtest提供了三種設置的途徑:

1. 系統環境變量

2. 命令行參數

3. 代碼中指定FLAG

因為提供了三種途徑,就會有優先級的問題, 有一個原則是,最后設置的那個會生效。不過總結一下,通常情況下,比較理想的優先級為:

命令行參數 > 代碼中指定FLAG > 系統環境變量

 

在main函數中,將命令行參數交給了gtest,由gtest來搞定命令行參數的問題。

testing::InitGoogleTest(&argc, argv);

測試案例集合

命令行參數

說明

--gtest_list_tests

使用這個參數時,將不會執行里面的測試案例,

而是輸出一個案例的列表。

--gtest_filter

對執行的測試案例進行過濾,支持通配符

--gtest_also_run_disabled_tests

執行案例時,同時也執行被置為無效的測試案例。

--gtest_repeat=[COUNT]

設置案例重復運行次數,非常棒的功能!

測試案例輸出

命令行參數

說明

--gtest_color=(yes|no|auto)

輸出命令行時是否使用一些五顏六色的顏色。默認是auto。

--gtest_print_time

輸出命令行時是否打印每個測試案例的執行時間。默認是不打印的。

--gtest_output=xml[:DIRECTORY_PATH\|:FILE_PATH]

將測試結果輸出到一個xml中。

對案例的異常處理

命令行參數

說明

--gtest_break_on_failure

調試模式下,當案例失敗時停止,方便調試

--gtest_throw_on_failure

當案例失敗時以C++異常的方式拋出

--gtest_catch_exceptions

是否捕捉異常。

7      深入解析gtest

玩轉Google開源C++單元測試框架Google Test系列(gtest)之七 - 深入解析gtest

通過分析TEST宏和RUN_ALL_TEST宏,了解到了整個gtest運作過程。

總的來說,TEST負責測試用例的編寫和注冊。RUN_ALL_TEST負責測試用例的運行。

 

8      打造自己的單元測試框架

玩轉Google開源C++單元測試框架Google Test系列(gtest)之八 - 打造自己的單元測試框架

嘗試編寫一個精簡版本的C++單元測試框架:nancytest ,通過編寫這個簡單的測試框架,將有助於我們理解gtest。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM