使用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不太了解,也可以轻松、直观地编写测试代码,这一点很好。