1. 程式人生 > >c程式碼覆蓋率工具

c程式碼覆蓋率工具

 C/C++程式的程式碼覆蓋率統計工具非常少,與JAVA相比開源免費的工具更是寥寥無幾,好用又開源的簡直是鳳毛麟角。左挑右選最後看中了基於GCOV的LCOV作為NGINX測試的覆蓋率統計工具。選擇LCOV的原因很簡單:一是適合GCOV是GCC配套的測試覆蓋率工具;二是NGINX是純C的程式,GCOV對純C程式碼的覆蓋率展現更加精確;三是LCOV作為GCOV的擴充套件,能夠生成直觀的HTML的帶原始碼的覆蓋率報表。    那麼下面就來看看,怎麼通過LCOV來展現NGINX測試程式碼覆蓋率的情況。 一、下載和安裝 1、LCOV的主頁:http://ltp.sourceforge.net/coverage/lcov.php
2、如果你有root許可權解壓後直接make insall安裝到系統的執行目錄,然後在任意地方都可以執行LCOV工具的命令了。 3、如果你沒有root或者sudo的許可權,也沒問題,可以直接在Makefile裡定義PREFIX變數並指向擁有許可權的安裝目錄(例如:PREFIX=/home/mylcov),然後make install安裝到指定的目錄,通過帶路徑的命令形式來使用LCOV工具的命令(例如:/home/mylcov/lcov …..)。 4、GCOV無需安裝,伴隨著GCC和LINUX一起發行。  二、如何統計覆蓋率  1、要讓LCOV能最後統計並展現出覆蓋率,需要在編譯被測的NGINX的時候新增一些選項,從而開啟GCOV的程式碼覆蓋率支援。 編譯選項:-fprofile-arcs -ftest-coverage 連結選項:-lgcov NGINX使用autoconf生成makefile,我們只需要在configure時加入以上的選項,請執行以下的命令列開啟NGINX的程式碼覆蓋率功能。 ./configure --with-pcre --with-http_ssl_module 
--with-cc-opt="-fprofile-arcs -ftest-coverage" --with-ld-opt=-lgcov 標紅加粗的部分就是前述的選項。  2、編譯安裝NGINX並初始化LCOV統計資料 在執行完剛才的CONFIGURE命令後,直接make 和make install就把帶有統計程式碼覆蓋的NGINX版本安裝好了。這個時候會發現在原始碼的編譯目錄裡有不少.gcno和.gcda檔案,.gcno是覆蓋率統計的路徑弧長檔案,.gcda是覆蓋率檔案。 我們接下來要做的事情是要將覆蓋率的資料初始化,並且今後在每次重新統計覆蓋率之前都需要進行初始化。在剛才原始碼的編譯目錄中執行lcov  –d ./ -z,意思是將當前目錄(./)下的gcda覆蓋率檔案清空,是覆蓋率資料回覆到空的狀態。 
 3、啟動NGINX執行各種各樣的測試吧  4、測試執行完成,收集覆蓋率資料 依然是在NGINX原始碼編譯目錄下執行lcov –b ./ -d ./ -c –o outputfile.info,意思是統計的相對目錄是當前目錄,對當前目錄下的覆蓋率資料進行採集,並彙總到名為outputfile.info的檔案中。    5、利用匯總的資料檔案生成直觀的網頁形式的帶有程式碼覆蓋情況的報告 在outputfile.info所在目錄下執行genhtml outputfile.info,意思是利用匯總資料檔案outputfile.info生成一些列的網頁格式的報告。    三、LCOV的優勢和弱點 LCOV基於GCOV進行測試覆蓋率的統計,LCOV本身也是為了LINUX核心測試覆蓋率而生的,因此對於LINUX下GCC編譯的程式有很好的支援,並且通過html形式的報告展現給測試人員,結果非常直觀並且利於分析。LCOV測試的覆蓋率的種類也比較全面,行覆蓋、分支覆蓋、函式覆蓋。 但是也有令人遺憾的地方對於以so形式存在的動態連結庫檔案不能給予支援,對於完全C++編寫的程式碼的覆蓋率統計結果是以C++程式碼被編譯器處理過後的C形式來統計的,所以覆蓋的資料和實際程式碼展示頁中的情況略有出入,但是仍然可以作為測試覆蓋率的參考。 總體來說LCOV對於NGINX這樣的純C的靜態編譯的程式是能夠非常好的滿足程式碼覆蓋率統計的需求的。