Test::Nginx使用说明
1. 简介
1.1 组件介绍
Test::Nginx是一个由Perl编写的nginx测试组件,继承自Test::Base。
1.2 安装方法
sudo cpan Test::Nginx
1.3 测试目录结构
测试目录最好命名为t,因为在测试过程中会在t中创建conf目录存储当前测试的配置和日志(默认路径为t/),应该可以提供参数来指定目录,尚未研究。
cc_cache/
├── go.sh
└── t
├── 001-test.t
├── 002-strategy.t
├── 003-rule.t
└── ANYU.pm
1.4 测试文件格式
Test::Nginx遵循一种特殊的设计。
#codes...
__DATA__
#suites...
如代码片段所示,使用__DATA__将每个测试文件分割成代码和测试用例两部分,Perl解释器将只运行代码部分内容。
__DATA__
其实这是Perl相关的语法,在代码中使用<STDIN>可以从标准输入接收数据,类似地使用<DATA>文件句柄可以直接从脚本自身获取数据(脚本中特殊常量__DATA__之后的内容),同时它也标志着脚本的逻辑代码的结束。
注意:第二次使用句柄时,需要修改偏移量才能重新从头读取数据。
1.4.1 代码部分
# 调用对应的测试模块,一般情况使用'no plan'即可
use Test::Nginx::Socket 'no plan';
# 运行测试用例
run_tests();
1.4.2 用例部分
由一系列测试块(BLOCK)组成,每个测试块由标题、可选描述和一组用例组成。
# 标题名称,合理标题前缀有利于测试结果分析
# 可以使用reindex命令自动生成TEST编号前缀
=== title TEST01: NAME
optional description
# value1包含换行符在内多行数据
# 可以使用多个filter对value1进行预处理
--- section1 (filter ...)
value1
# value2默认使用了chmop去掉了两边的空白符
--- section2 : value2
常用sections举例。
=== TEST 1: hello, world
This is just a simple demonstration
# 增加配置到server{}
--- config
location = /t {
echo "hello, world!";
}
# 发起测试请求
--- request
GET /t
# 确认响应body
# chomp用来去掉value两边的空白符
--- response_body chomp
hello, world!
# 确认响应状态码,不显示指定该section时默认200
--- error_code: 200
# 仅运行此block
--- ONLY
# 跳过此block
--- SKIP
# eval将value作为代码执行并获取对应结果
-- response_body eval
"a" x 4096
1.4.3 更多Sections
Section | 说明 | 备注 |
---|---|---|
config | 插入server块配置 | |
http_config | 插入http块配置 | |
main_config | 插入顶层配置 | |
request | 发起请求 | 默认HTTP/1.1,可以后缀指定 |
pipelined_requests | 多个请求 | request好像会自动转换 |
response_body | 响应body | 可以用eval支持qr//格式的正则 |
response_body_like | 响应正则 | response_body好像会自动转换 |
error_code | 响应码 | 默认200 |
more_headers | 请求头 | |
response_headers | 响应头检查 | |
error_log | 错误日志包含 | |
no_error_log | 错误日志不包含 | 使用[error]确定没异常 |
grep_error_log | 筛选日志条件 | 结果与grep_error_log_out匹配 |
grep_error_log_out | 匹配筛选日志 | 类res可以是多行内容 |
wait | 日志等待时间 | 单位秒,支持float |
must_die | 测试启动失败 | 标记,启动失败则测试通过 |
ONLY | 只测试当前block | 标记 |
SKIP | 跳过当前block | 标记 |
ignore_response | 不检查响应完整性 | 默认HTTP/1.1协议格式 |
timeout | 连接超时时间 | 默认3秒 |
测试时将为每个block生成一个配置文件t/servroot/conf/nginx.conf
进行测试。
我们还可以通过编写perl代码的方式来新增section或扩展现有的section。
1.4.4 测试代码实例
测试用例文件t/001-test.t
中的内容如下所示,以供参考。
1
2 use t::ANYU 'no_plan';
3
4 run_tests();
5
6
7 __DATA__
8
9 === TEST 1: test hello world
10 Start test::nginx.
11
12 --- config
13 location /test {
14 rewrite_by_lua_block {
15 ngx.print('hello world');
16 }
17 }
18
19 --- pipelined_requests eval
20 [
21 "GET /test",
22 "GET /test"
23 ]
24
25
26 --- response_body eval
27 [
28 "hello world",
29 qr/hello.*world/
30 ]
31
32
33 #--- error_code chomp