cLualua 的代碼覆蓋率工具
cLua 是一個(gè) lua 的代碼覆蓋率工具。
特性
- C++開(kāi)發(fā),性能更高,對(duì)宿主進(jìn)程影響更小
- 簡(jiǎn)單require即可使用,或通過(guò)hookso注入
- 獨(dú)立的命令行解析工具
編譯
- 編譯libclua.so
# cmake .
# make
- 編譯clua解析工具
# go build clua.go
使用
- 直接嵌入lua腳本中使用,lua文件里使用如下
-- 加載libclua.so
local cl = require "libclua"
-- 開(kāi)始記錄執(zhí)行過(guò)程,生成結(jié)果文件
-- 第一個(gè)參數(shù)為結(jié)果文件的文件名
-- 第二個(gè)參數(shù)為定時(shí)生成結(jié)果文件的間隔(秒),0表示關(guān)閉
cl.start("test.cov", 5)
-- 執(zhí)行某些事情
do_something()
-- 結(jié)束記錄
cl.stop()
- 或者使用hookso注入到進(jìn)程中(假設(shè)進(jìn)程id為PID),手動(dòng)開(kāi)啟
a) 首先獲取進(jìn)程中的Lua_State指針,比如進(jìn)程調(diào)用了lua_settop(L)函數(shù),那么就取第一個(gè)參數(shù)
# ./hookso arg $PID liblua.so lua_settop 1
123456
b) 加載libclua.so
# ./hookso dlopen $PID ./libclua.so
c) 執(zhí)行l(wèi)ibclua.so的start_cov手動(dòng)開(kāi)啟,等價(jià)于start_cov(L, "./test.cov", 5)
# ./hookso call $PID libclua.so start_cov i=123456 s="./test.cov" i=5
c) 執(zhí)行l(wèi)ibclua.so的stop_cov手動(dòng)關(guān)閉,等價(jià)于stop_cov(L)
# ./hookso call $PID libclua.so stop_cov i=123456
- 執(zhí)行完上述兩種方法的任一一種,用clua解析test.cov查看結(jié)果。clua更多參數(shù)參考-h
# ./clua -i test.cov
示例
- 運(yùn)行test.lua
# lua5.3 ./test.lua
- 查看目錄下,已有test.cov文件
# ll test.cov
- 查看結(jié)果,每行前面的數(shù)字表示執(zhí)行的次數(shù),空表示沒(méi)被執(zhí)行
# ./clua -i test.cov
total points = 20, files = 1
coverage of /home/project/clua/test.lua:
local cl = require "libclua"
cl.start("test.cov", 5)
1 function test1(i)
10 if i % 2 then
10 print("a "..i)
else
print("b "..i)
end
11 end
1 function test2(i)
40 if i > 30 then
19 print("c "..i)
else
21 print("d "..i)
end
41 end
1 function test3(i)
51 if i > 0 then
51 print("e "..i)
else
print("f "..i)
end
52 end
102 for i = 0, 100 do
101 if i < 10 then
10 test1(i)
91 elseif i < 50 then
40 test2(i)
else
51 test3(i)
end
end
1 cl.stop()
/home/project/clua/test.lua total coverage 60%
- 在結(jié)果中,可以看到每一行的執(zhí)行次數(shù),方便定位潛在bug
- 最后一行會(huì)輸出文件的總體覆蓋率(注:因?yàn)橛衑lse、end之類的影響,所以并不完全精確)
評(píng)論
圖片
表情
