【Lua】實現程式碼執行覆蓋率統計工具

爆走de蘿蔔發表於2021-11-28

一、如何評估測試過程的測試情況?

    很多時候完成功能測試後就會發布上線,甚至交叉和迴歸都沒有足夠的時間去執行,然後通過線上的補丁對遺漏的問題進行修復。如果可以在釋出前瞭解本次測試過程所覆蓋程式碼執行的比例情況,那麼就可以一定程度上反應測試的執行情況和系統的質量情況。

    程式碼執行覆蓋率是一種很好評估測試人員在執行測試過程中,所命中技術編碼情況的手段,並可以從側面評估系統的質量情況。我所在的專案前後端都是用Lua進行邏輯業務開發,這裡分享如何使用Lua的debug模組進行程式碼執行覆蓋率統計的實現。

 

二、Lua程式碼執行覆蓋統計工具

    程式碼覆蓋率可以做到行覆蓋率,函式覆蓋率和分支覆蓋率。通過Lua語言debug庫的sethook方法可以設定以行或以函式來監控程式碼的執行行為。

debug.sethook ([thread,] hook, mask [, count]):

    可以通過官方文件獲得更好的介紹,這裡通過設定回撥函式和監控的方式,然後在監控的回撥函式裡面記錄當前執行的檔案及執行的行數、以及函式記錄。最後在停止hook的時候將上面記錄資料輸出到文字檔案,這樣就可以知道本次測試在執行過程中所有程式碼執行的情況記錄。

 1 function call_hook_func()
 2     local info = debug.getinfo(2, "nlS")
 3     if not info then
 4         return
 5     end
 6     local filename = info.short_src
 7     local linenum = info.currentline
 8     local func = info.name   -- 函式名
 9     -- 過濾掉C層呼叫
10     if linenum <= 0 then return end
11     -- 文字函式記錄表 g_code 記錄檔名,行數,函式名和執行的次數
12     local file_line_tb = g_code[filename]
13     if not file_line_tb then
14         file_line_tb = {}
15         g_code[filename] = file_line_tb
16     end
17     -- 這裡是行數
18     local func_info = file_line_tb[linenum]
19     if not func_info then
20         func_info = {[0]=0, [1]=func}
21         file_line_tb[linenum] = func_info
22     end
23     -- 統計執行的次數
24     func_info[0] = (func_info[0] or 0) + 1
25 end
26 debug.sethook(call_hook_func, "c")

 以上是簡單的函式執行統計的程式碼,通過設定hook函式呼叫,在監控函式裡面統計當前執行的檔案、所在行、以及函式,並且還記錄了這個函式的執行次數。這樣就可以得到原始的程式碼執行情況的資料記錄。通過編寫一個分析指令碼將執行的資料和原始碼的資料進行對比,從而就可以計算出行覆蓋率,函式覆蓋率,以及分支覆蓋率。這樣每次在測試執行前開啟,在測試結束後統計計算,就可以評估本次測試所覆蓋的程式碼量,甚至可以做更深入的分析判斷哪些核心的邏輯沒有執行到。

 

三、Lua監控程式碼執行情況的專案倉庫

https://github.com/memolp/LuaCodeCoverage

使用方法:

    1. 匯入模組

require "CodeCoverage" 

    2. 執行Hook,並選擇統計的型別(這裡提供基於行的統計和基於函式的統計)

-- Jeff_CodeCoverage.LINE_COVERAGE_MODE 行覆蓋率統計
-- Jeff_CodeCoverage.FUNC_COVERAGE_MODE 函式覆蓋率統計
-- StartHook 第二個引數設定為true將實時輸出行或函式覆蓋的執行流資料
Jeff_CodeCoverage.StartHook(Jeff_CodeCoverage.FUNC_COVERAGE_MODE)

    3. 測試完業務功能後,呼叫停止Hook,輸出本次執行的資料

Jeff_CodeCoverage.StopHook()

    4. 通過上面輸出的資料,與原始碼進行對比計算出覆蓋率。(這裡需要開發一個統計原始碼行數和函式的工具)。

相關文章