最近,因為要展示某項目的單元測試的代碼覆蓋率,我無意間在網上找到了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,但功能強大。讓我們一起向開發該軟件的前輩們致敬!