使用Test::Nginx自动化测试nginx模块
测试::Nginx
Test::Nginx是由ngx_lua或OpenResty的维护人agentzh先生开发的用于测试nginx.conf文件的CPAN模块。
我尝试使用先前在文章中介绍的ngx_dynamic_upstream进行测试,然后根据测试结果进行解释。
安装Test::Nginx。
这里将使用cpanm进行安装。
cpanm Test::Nginx
另外,为了方便进行测试执行,我们也会安装App::Prove。
cpanm App::Prove
撰写用于Test::Nginx的测试
我将尝试编写一个测试,使用ngx_dynamic_upstream来获取上游服务器列表。
use lib 'lib';
use Test::Nginx::Socket;
#repeat_each(2);
plan tests => repeat_each() * 2 * blocks();
run_tests();
__DATA__
=== TEST 1: list
--- http_config
upstream backends {
zone zone_for_backends 128k;
server 127.0.0.1:6001;
server 127.0.0.1:6002;
server 127.0.0.1:6003;
}
--- config
location /dynamic {
dynamic_upstream;
}
--- request
GET /dynamic?upstream=zone_for_backends
--- response_body
127.0.0.1:6001;
127.0.0.1:6002;
127.0.0.1:6003;
尽管测试代码也是用Perl编写的,但是通过查看以上的测试代码可以明白,即使对Perl不熟悉也可以编写非常简单直观的测试代码。在这个例子中,我们只检查了响应体,但也可以检查状态码,如下所示。
=== TEST 3: not found upstream
--- http_config
upstream backends {
zone zone_for_backends 128k;
server 127.0.0.1:6001;
server 127.0.0.1:6002;
server 127.0.0.1:6003;
}
--- config
location /dynamic {
dynamic_upstream;
}
--- request
GET /dynamic?upstream=not_found
--- response_body_like: 400 Bad Request
--- error_code: 400
这是在prove中执行ngx_dynamic_upstream的所有测试的情况。
$ cd ngx_dynamic_upstream
$ prove t
t/00-list.t .......... ok
t/01-update-param.t .. ok
t/02-down.t .......... ok
t/03-add.t ........... ok
t/04-remove.t ........ ok
All tests successful.
Files=5, Tests=28, 5 wallclock secs ( 0.04 usr 0.02 sys + 0.91 cusr 0.44 csys = 1.41 CPU)
Result: PASS
$
总结
我解释了用于测试nginx.conf操作的CPAN模块Test::Nginx。
通常情况下,要测试nginx模块,需要执行非常繁琐的步骤,即“发送HTTP请求并检查响应的状态和内容”。但是,使用Test::Nginx工具可以仅通过CLI进行测试,非常方便。此外,正如之前提到的,即使对Perl不太了解,也可以轻松、直观地编写测试代码,这一点很好。