Test::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
以下はngx_dynamic_upstreamの全テストをprove
で実行している様子です。
$ 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にさほど詳しくなくても簡単で直感的なテストコードを書けるというのがいいですね。