LoginSignup
28
30

More than 5 years have passed since last update.

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

Posted at

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

28
30
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
30