轉自:http://qa.taobao.com/?p=7218
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的靜態編譯的程式是能夠非常好的滿足程式碼涵蓋範圍統計的需求的。