Hello!
2014/1/22 aCayF:
> 我最近在写基于Test::Nginx测试框架的测试用例,有如下几个问题想请教您一下
>
> 1.plan tests => repeat_each() * (n * blocks())
> 这句话定义了计划测试次数,其中repeat_each()返回值是发起的请求数, blocks()返回值是data字段的块数,
> 而n则是由用户指定的针对每请求每块的测试次数,该次数和我在每个块下指定的指令数有关,如果计划测试数和实际测试数有差,则会测试失败
> 上述理解对吗?
>
test plan 是可选的,如果你搞不清楚(很多用户都搞不清楚),可以直接禁掉 test plan 检查,即使用
use Test::Nginx::Socket 'no_plan';
而不要使用 plan() 函数。
关于 test plan 的意义,可以参见下面这个链接:
http://stackoverflow.com/questions/690342/why-do-i-need-to-know-how-many-tests-i-will-be-running-with-testmore
> 2.假设n和块下指令数有关,我发现有些指令并不算在这个n内,我的猜测是所有有关配置和请求的指令应该算是测试的驱动数据,不算在n内,而所有和响应有关的指令则算在这个n内,即n=和响应有关的指令数,有个特殊情况就是响应指令后面跟了eval的话还要另外计算这条指令对n的贡献
> 上述理解对吗?
>
这个 n 是测试台执行的基本测试的个数。所谓“基本测试”就是比较一个 数,或者比较一个字符串。每个 block
都会由多个“基本测试”组成,都是针对某一项输出的比较。你可以在执行 prove 命令时指定 -v
选项,这样你可以看到实际执行的所有“基本测试”,例如:
$ prove -v t/count.t
t/count.t ..
1..6
ok 1 - TEST 1: module size - status code ok
ok 2 - TEST 1: module size - response_body - response is expected
ok 3 - TEST 1: module size - pattern "[error]" does not match a
line in error.log (req 0)
ok 4 - TEST 1: module size - status code ok
ok 5 - TEST 1: module size - response_body - response is expected
ok 6 - TEST 1: module size - pattern "[error]" does not match a
line in error.log (req 1)
ok
All tests successful.
Files=1, Tests=6, 1 wallclock secs ( 0.02 usr 0.01 sys + 0.15
cusr 0.05 csys = 0.23 CPU)
Result: PASS
> 3.我查了查官方的lua库,n一般等于3,这是有什么考虑吗?隐藏的error_code:200算在这个n内吧?
>
是的,--- error_code: 200 这个是隐含的,如果你没有自己指定 --- error_code 段的话。
> 4.n=3的话,那么每个块下的有关响应指令条数必须有且只有两个(去除隐藏的error_code:200),这样就限死了每块下的测试次数,有更灵活的方法吗?
>
你可以作加法,比如
plan tests => repeat_each() * blocks() * 3 + 4;
如果有的块会有更多的“基本测试”的话。
> 5.当测试出错时,我会去查看t/sevroot/logs/error.log文档,而这个文档并不一定总记录出错测试的日志,有什么方法能获取出错测试的日志记录吗?
>
一个常见的技巧是使用 --- error_log 段,例如
--- error_log
[error]
[alert]
这样如果错误日志里有这两种级别的消息,测试台会直接报印出来,不用你自己去翻 error.log 了。
Regards,
-agentzh