【Lua】實現程式碼執行覆蓋率統計工具
一、如何評估測試過程的測試情況?
很多時候完成功能測試後就會發布上線,甚至交叉和回歸都沒有足夠的時間去執行,然後通過線上的修補程式對遺漏的問題進行修復。如果可以在發布前了解本次測試過程所覆蓋程式碼執行的比例情況,那麼就可以一定程度上反應測試的執行情況和系統的品質情況。
程式碼執行覆蓋率是一種很好評估測試人員在執行測試過程中,所命中技術編碼情況的手段,並可以從側面評估系統的品質情況。我所在的項目前後端都是用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監控程式碼執行情況的項目倉庫
//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. 通過上面輸出的數據,與源碼進行對比計算出覆蓋率。(這裡需要開發一個統計源程式碼行數和函數的工具)。