1. 程式人生 > >C語言專案程式碼覆蓋率實踐

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 .

--no-recursion -c

    *需要生成分支覆蓋資料可修改檔案'/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月