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