C語言專案程式碼覆蓋率實踐
去年換工作到一家做交易的公司,動輒都是成百上千萬的交易額,核心系統使用C語言開發的,但是沒有自動化測試工具。也許上家公司GTest給慣壞了,沒有自動化測試總感覺像是在裸奔……於是,利用零散的空餘時間,帶著一個外包在已有的手工測試工具的基礎上,整了一個自動化測試工具出來。工具做好之後,補充了一定數量的測試用例後,開始考慮覆蓋率的問題。網上搜索一番,原來gcc自帶的gcov/lcov工具包已經實現了覆蓋率生成,下面就是一番實踐後的一個小結。
1、編譯選項:-fprofile-arcs -ftest-coverage
使用上述編譯選項編譯、連結應用程式。其中,‘ftest-coverage’用以生成.gcno檔案,‘fprofile-arcs’用以後續執行應用程式時生成.gcda檔案。
2、執行應用程式生成.gcda檔案
3、執行'gcov *.c'命令生成.gcov檔案
gcov使用前面兩步生成的.gcno檔案和.gcda檔案生成.gcov檔案,如有巢狀子目錄,則每個目錄下的原始檔都需要生成.gcov檔案。
其實,.gcov檔案已經包含了程式碼的覆蓋資訊,但不是圖形化的資料,看起來不直觀,所以需要使用lcov工具以生成圖形化的統計資料。
4、執行lcov生成.info檔案:
>lcov -d <.gcda檔案目錄> -o <檔名稱.info> -b <.gcno檔案路徑> -c
//lcov -d . -o 'test.info' -b .
*需要生成分支覆蓋資料可修改檔案'/etc/lcovrc(需要root許可權)或~/.lcovrc:lcov_branch_coverage= 1
*如果有巢狀子目錄,則每個子目錄需要單獨生成.info檔案,使用如下命令將多個.info檔案合併為一個.info檔案:
lcov -a 1.info -a 2.info -o all.info
5、執行genhtml生成HTML檔案
genhtml -o <輸出目錄名> <檔名.info>
//genhtml -o result all.info
*整體覆蓋率
*單個檔案覆蓋率
參考:
http://ltp.sourceforge.net/coverage/lcov.php
--2018年7月