Test::Nginxでnginxモジュールのテストを自動化する

  • 26
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

Test::Nginx

Test::Nginxngx_luaOpenRestyのメンテナでおなじみのagentzh氏によるnginx.confの動作をテストするためのCPANモジュールです。

先日のエントリで紹介したngx_dynamic_upstreamのテストで使ってみているのでそれを元に解説します。

Test::Nginxをインストールする

ここではcpanmでインストールします。

cpanm Test::Nginx

また、テストの実行を楽にするためにApp::Proveもインストールします。

cpanm App::Prove

Test::Nginx用のテストを書く

ngx_dynamic_upstreamでアップストリームの一覧を取得するテストを書いてみます。

t/list.t
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にさほど詳しくなくても簡単で直感的なテストコードを書けるというのがいいですね。