C/C++程式碼覆蓋率統計工具:gcov&&gcovr安裝和簡單使用

gcov安裝

Linux ver:

gcov是gcc的自帶功能 屬於GNU 不用特別安裝

Windows ver:

在windows下安裝可以使用gcov的gcc 之前試過mingw和Cygwin64 Terminal,在後續可視化的過程中效果不是很理想,經過多方測試發現Strawberry Perl的GCC可以很好的滿足後續可視化的需求。至於為什麼mingw的後續可視化為什麼不行 好像和llvm的模擬有關係……

在安裝完成Perl以後就就可以在windows下使用gcov了。

gcovr安裝

Linux下與windows下gcovr的安裝大同小異 都是通過Python的pip安裝 根據不同的Python版本pip會選擇與此Python版本相適應的gcovr進行安裝。

如果你用的作業系統還沒有Python請自行安裝。這裡使用Python3.8版本為栗子進行說明安裝過程。

在剛才安裝的Strawberry Perl中已經包含了pip 所以win用戶可以忽略安裝pip的步驟。

如果你的電腦沒有pip也請安裝一個pip pip的安裝方式非常簡單。可以在瀏覽器中將下列鏈接右鍵另存後安裝:

//bootstrap.pypa.io/get-pip.py

也可以在Linux中使用curl命令進行下載

下載完成後執行語句

python get-pip.py

  就可以進行安裝了 如果報錯可能是許可權問題,添加語句sudo後執行或win下使用管理員許可權。

安裝好pip後。

執行語句

pip install gcovr

  安裝gcovr。安裝的部分大功告成。

gcov與gcovr的使用

 

Linux和win下如何使用gcov與gcovr呢?我們以假設要編譯example.cpp文件為例:

example.cpp源程式碼如下:其實並不局限於這個測試樣例,完全自己可以根據需求寫一個具有多函數多分枝跳轉語句以及可以輸入多種測試數據的測試樣例。

 1 // example.cpp
 2 
 3 int foo(int param)
 4 {
 5     if (param)
 6     {
 7         return 1;
 8     }
 9     else
10     {
11         return 0;
12     }
13 }
14 
15 int main(int argc, char* argv[])
16 {
17     foo(0);
18 
19     return 0;
20 }

 

在終端或cmd命令行里輸入下句:

g++ -fprofile-arcs -ftest-coverage -fPIC -O0 example.cpp -o program

  

就可以生成目標可執行文件program或program.exe。請注意,我們在編譯該程式時沒有進行優化,因為優化可能會合併程式碼行,否則會更改程式中的執行流程。此外,我們使用-fprofile-arcs -ftest-coverage -fPIC編譯器選項進行編譯,這些選項添加了邏輯以生成可以由gcov命令處理的輸出文件。

接下來我們運行程式進行測試 ,如果沒有參數就直接運行就行了。

./program

  windows下執行

program.exe

  就表示對程式的一次執行測試。

 

生成文件example1.gcno和example1.gcda。這些文件由gcov處理,以生成程式碼覆蓋率統計資訊。gcovr命令調用gcov並以各種格式匯總這些程式碼覆蓋率統計資訊。

比如最基本的簡單顯示測試結果:

gcovr -r .

  以我這裡的程式碼為例,就會列印如下的結果:

------------------------------------------------------------------------------
                           GCC Code Coverage Report
Directory: .
------------------------------------------------------------------------------
File                                       Lines    Exec  Cover   Missing
------------------------------------------------------------------------------
example.cpp                                    7       6    85%   7
------------------------------------------------------------------------------
TOTAL                                          7       6    85%
------------------------------------------------------------------------------

  此輸出的每一行都包含給定源文件的摘要,其中包括已檢測的行數,已執行的行數,已執行的行數百分比以及未執行的行號的摘要。為了提高清晰度,gcovr使用積極的方法將未覆蓋的行分組,並將由「非程式碼」行(空白,獨立大括弧和單行注釋)分隔的未覆蓋行合併到一個區域中。結果,「缺少」列表中列出的行數可能大於「行」和「執行」列的差。-r選項指定要分析的文件的根目錄。這使gcovr可以生成更簡單的報告(沒有絕對路徑名),並且可以從分析中排除系統頭文件。請注意,gcov按行累積統計資訊。因此,它最好與一種編程風格一起工作,該編程風格每行僅放置一條語句。

這只是最基礎的要求 進一步我們想要得到更為詳細的程式碼分析報告,使用如下命令生成關於整個項目的測試結果。(因為測試用例只有一個CPP文件所以結果只有一個文件,後續會用複雜的項目進一步舉例說明)

gcovr -r . --html --html-details -o example-html-details.html

  這樣就可以根據之前測試的結果生成一個可視化的html格式的測試報告了。如下圖所示。

 

 請注意,–html-details選項只能與-o(–output)選項一起使用。例如,如果–output選項指定輸出文件coverage.html,則為每個文件生成的網頁將具有coverage。<filename> .html形式的名稱。

至此我們程式碼覆蓋率測試的結果已經算是達到預期結果了,但是gcovr的功能絕不僅限於此,這只是個開始,以後的部落格會進一步分析gcov的工作原理和gcovr的更強大的使用方法,並會舉出更複雜的樣例來加以說明。同樣可以自己學習研讀官網給出的相關說明來了解gcovr的強大功能。

參考文獻:

pip的安裝://pip.pypa.io/en/stable/installing/

gcovr的使用官方說明書://gcovr.com/en/stable/index.html

Strawberry Perl的下載地址://strawberryperl.com/