在 2014年3月3日星期一UTC+8上午2时57分13秒,agentzh写道:
> Hello!
>
>
>
> 2014-03-01 9:39 GMT-08:00 guxin_hi:
>
> > (1)用cpan安装Test:Nginx 0.22的时候,并没有安装Lua.pm文件,我在安装目录下搜索,确实也没搜到。
>
>
>
> Test::Nginx 模块的 CPAN 发布的周期一般比较长(多为几个月),而测试台的变化是很快的,所以较新添加的功能未及包含在最近一次
>
> CPAN 发布中,比如 Test::Nginx::Socket::Lua 这个模块就是前不久添加的。
>
>
>
> 正如 smallfish 建议的,尽量使用 GitHub 仓库里最新的版本 :)
>
>
>
> > (2)另外我修改了openresty中的部分测试样例,把Nginx::Socket::Lua换成Nginx::Socket, 也照样能跑通。我看代码貌似这个模块的作用是把环境变量里的代码放到配置文件中的init_by_lua中,不知道是否正确
>
> >
>
>
>
> 对。Test::Nginx::Socket::Lua 模块主要是在 Test::Nginx::Socket 的基础上为 ngx_lua
>
> 模块及其 Lua 库提供“个性化”的功能。
>
>
>
> 目前的“个性化”功能就是支持 TEST_NGINX_INIT_BY_LUA 这个环境变量,可以从外部指定 init_by_lua
>
> 中的统一的初始化 Lua 代码。
>
>
>
> 比如我们可以利用这个功能,配合 luacov 模块,从我们的测试集生成被测试 Lua 应用的 Lua 代码覆盖率报告:
>
>
>
> export TEST_NGINX_INIT_BY_LUA="require 'luacov.tick' jit.off()"
>
>
>
> 当然,对于较小的 Lua 应用,建议给 luacov 打上下面这个补丁以避免因为步长过大而丢失覆盖数据:
>
>
>
> --- src/luacov/runner.lua 2014-03-02 10:48:48.834064052 -0800
>
> +++ /usr/share/lua/5.1/luacov/runner.lua 2014-01-04 14:40:26.880845010 -0800
>
> @@ -21,7 +21,7 @@
>
> local function on_line(_, line_nr)
>
> if tick then
>
> ctr = ctr + 1
>
> - if ctr == 100 then
>
> + if ctr == 2 then
>
> ctr = 0
>
> stats.save(data, statsfile)
>
>
>
> 由此得到的 Lua 代码覆盖率报告可以用于指导添加有针对性的更多测试用例,以覆盖到从未执行到的 Lua 代码路径。
>
>
>
> 这个环境变量的另一个重要应用是强制 Lua VM 在执行完每一行代码后都运行一次完整的 GC cycle:
>
>
>
> export TEST_NGINX_INIT_BY_LUA="debug.sethook(function ()
>
> collectgarbage() end, 'l') jit.off()"
>
>
>
> 这种模式可以帮助捕捉一些和 Lua GC 相关的 C 级别上的内存问题。比如它就曾帮我定位了 lua-resty-core 库中的几处和
>
> FFI cdata 生命期相关的内存管理 bug.
>
>
>
> 当然了,此环境变量的另一个用途是统一使用 lua-resty-core 这样的库来运行所有的测试集而不用自己编辑修改测试集本身。例如
>
>
>
> export TEST_NGINX_INIT_BY_LUA="package.path =
>
> '/path/to/lua-resty-core/lib/?.lua;' .. (package.path or '') require
>
> 'resty.core'"
>
>
>
> 当然,lua-resty-core 本身也有专门的调试模式,可以再添加下面这些代码:
>
>
>
> require('resty.core.base').set_string_buf_size(1)
>
> require('resty.core.regex').set_buf_grow_ratio(1)
>
>
>
> 当然,调试模式会牺牲性能,只适用于测试,特别是内存相关的问题。
>
>
>
> Regards,
>
> -agentzh
hi, agentzh:
非常感谢详尽的回复,配合luacov是个很棒的建议,我也试用一下:)
另外还有一个问题,我在使用TEST_NGINX_CHECK_LEAK模式的时候,总是会在完成40%的时候退出,每条TEST报类似“tests skipped due to the lack of directive 1”的错误,但输出的采样数据貌似是正常的,我改小了-n的数目,会跑完全部请求,但依然报上述的错误,这可能是什么原因引起的?
best regards