程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 展示C代碼覆蓋率的gcovr工具簡介及相關命令使用示例

展示C代碼覆蓋率的gcovr工具簡介及相關命令使用示例

編輯:關於C語言

展示C代碼覆蓋率的gcovr工具簡介及相關命令使用示例


最近,因為要展示某項目的單元測試的代碼覆蓋率,我無意間在網上找到了gcovr工具。使用之後,覺得這個工具相當的不錯,於是便寫下這篇文章,可供相關的開發人員參考。

簡而言之,gcovr是一個將單元測試中的代碼覆蓋率以多種方式(包括列表方式、XML文件方式、HTML網頁方式等)展示出來的工具,目前最新的版本是3.2。gcovr的下載地址是:https://pypi.python.org/pypi/gcovr/。

該工具運行在Linux之下,解壓後,將scripts目錄下的gcovr拷貝到/usr/bin目錄下就可以了。

下面以尋找棧的增長方向的FindStackDirection.c程序為例,介紹gcovr的使用方法。

程序源代碼為:

/**********************************************************************
* 版權所有 (C)2015, Zhou Zhaoxiong。
*
* 文件名稱:FindStackDirection.c
* 文件標識:無
* 內容摘要:尋找棧的增長方向
* 其它說明:無
* 當前版本:V1.0
* 作    者:Zhou Zhaoxiong
* 完成日期:20151218
*
**********************************************************************/
#include 

// 重定義數據類型
typedef unsigned char  UINT8;
typedef signed   int   INT32;

// 函數聲明
void FindStackDirection(void);


/**********************************************************************
* 功能描述:主函數
* 輸入參數:無
* 輸出參數:無
* 返 回 值:無
* 其它說明:無
* 修改日期        版本號      修改人              修改內容
* ---------------------------------------------------------------
* 20151218        V1.0     Zhou Zhaoxiong          創建
***********************************************************************/
INT32 main()
{
    FindStackDirection();

    return 0; 
}


/**********************************************************************
* 功能描述:查找棧增長方向
* 輸入參數:無
* 輸出參數:無
* 返 回 值:無
* 其它說明:無
* 修改日期        版本號      修改人              修改內容
* ---------------------------------------------------------------
* 20151218        V1.0     Zhou Zhaoxiong          創建
***********************************************************************/
void FindStackDirection(void)
{
    UINT8  iStackAddr        = 0;        // 用於獲取棧地址
    static UINT8 *pStackAddr = NULL;     // 用於存放第一個iStackAddr的地址 

    if (pStackAddr == NULL)              // 第一次進入
    {                          
        pStackAddr = &iStackAddr;        // 保存iStackAddr的地址
        FindStackDirection();            // 遞歸 
    }
    else                                 // 第二次進入 
    {  
        if (&iStackAddr > pStackAddr)        // 第二次iStackDirection的地址大於第一次iStackDirection, 那麼說明棧增長方向是向上的
        {   
            printf("Stack grows up!\n");
        }
        else if (&iStackAddr < pStackAddr)   // 第二次iStackDirection的地址小於第一次iStackDirection, 那麼說明棧增長方向是向下的
        {  
            printf("Stack grows down!\n");
        }
        else
        {
            printf("Bad stack!\n");
        }
    }
} 

1.程序編譯及執行
將示例程序上傳到Linux機器上,並在程序所在的目錄下使用“gcc -fprofile-arcs -ftest-coverage -fPIC -O0 FindStackDirection.c -o FindStackDirection”命令對程序進行編譯,生成FindStackDirection.gcno和FindStackDirection文件。

編譯命令中的“-fprofile-arcs -ftest-coverage -fPIC”用於產生能夠被gcovr命令處理的文件。

接著執行“./FindStackDirection”命令,又生成了FindStackDirection.gcda文件。

2.輸出列表形式的代碼覆蓋率
在程序所在的目錄下運行“gcovr -r .”命令,可看到輸出結果如下:

------------------------------------------------------------------------------
                  GCC Code Coverage Report
Directory: .
------------------------------------------------------------------------------
File                   Lines    Exec  Cover   Missing
------------------------------------------------------------------------------
FindStackDirection.c      14      12    85%   65,73
------------------------------------------------------------------------------
TOTAL                     14      12    85%
------------------------------------------------------------------------------

這就是代碼覆蓋率報告,我們可以看到,程序運行之後,覆蓋了85%的代碼。

3.輸出分支覆蓋率
在程序所在的目錄下運行“gcovr -r . –branches”命令,可看到輸出結果如下:

------------------------------------------------------------------------------
                 GCC Code Coverage Report
Directory: .
------------------------------------------------------------------------------
File                   Branches   Taken  Cover   Missing
------------------------------------------------------------------------------
FindStackDirection.c        6        4    66%   63,67
------------------------------------------------------------------------------
TOTAL                       6        4    66%
------------------------------------------------------------------------------

我們可以看到,程序一共有6個分支,執行了其中的4個。

4.輸出展示覆蓋率的XML文件
在程序所在的目錄下運行“gcovr -r . –xml-pretty”命令,可看到輸出結果如下:




 
  
   .
  
 
 
  
   
    
     
     
      
      
      
      
      
      
      
       
        
       
      
      
       
        
       
      
      
      
      
       
        
       
      
      
      
      
     
    
   
  
 

我們可以看到,命令的執行結果是輸出了XML格式的代碼覆蓋率報告。

5.輸出展示覆蓋率的HTML文件
在程序所在的目錄下運行“gcovr -r . –html -o FindStackDirection.html”命令,可看到在當前目錄下生成了FindStackDirection.html文件。用浏覽器打開,其內容如下圖所示:
這裡寫圖片描述

這個HTML文件以圖形化的方式直觀地展示了代碼的覆蓋率。

我們還可以添加“–html-details”選項為代碼工程中的每個文件生成一個獨立的web頁。例如,我們在程序所在的目錄下運行“gcovr -r . –html –html-details -o FindStackDirection2.html”命令,可看到在當前目錄下生成了FindStackDirection2.html文件和FindStackDirection2.FindStackDirection.c.html文件。用浏覽器打開FindStackDirection2.html文件,其內容如下圖所示:
這裡寫圖片描述

可以看到,頁面上的“FindStackDirection.c”文字有一條下劃線,單擊該文字,出現的一個新的頁面,其內容如下圖所示:
這裡寫圖片描述html

最後再啰嗦幾句,gcovr是一個用Python編寫的開源軟件,大小只有幾十KB,但功能強大。讓我們一起向開發該軟件的前輩們致敬!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved