2016年1月5日火曜日

Test::Nginx::Socket で Nginx のテストを書いてみる

概要

Perl のモジュールで Test::Nginx::Socket というのがありこれを使うことで Nginx のテストを書くことができます
例えば「/hoge」にアクセスしたら「fuga」がレスポンスボディで返却されてレスポンスコードが 200 になるというようなテストを書くことができます

環境

  • CentOS 6.7 64bit Final
  • nginx 1.9.3
  • Test::Nginx::Socket 0.24
  • echo-nginx-module 0.58
  • prove 3.17

事前準備

基本的な Nginx のインストールは過去の記事の手順を元に行っていることを前提にしています
Nginx をソースからインストールしていることが前提なのでご注意ください

Test::Nginx::Socket をインストール

まずはテストフレームワークである Test::Nginx::Socket をインストールします
cpanm を使ってインストールします

  • cd /var/tmp
  • wget https://cpanmin.us -O install_cpanm.pl
  • perl install_cpanm.pl - --sudo App::cpanminus
  • cpanm Test::Nginx

確認は以下のコマンドで可能です

  • find `perl -e ‘print “@INC”’` -name ‘*.pm’ -print | grep Nginx

echo-nginx-module をインストール

echo-nginx-module はテストを書くときに便利な Nginx のモジュールです
インストールしておいたほうがサンプルを書くのも楽なのでインストールします

  • cd /root/work
  • wget https://github.com/openresty/echo-nginx-module/archive/v0.58.tar.gz
  • tar zvxf v0.58.tar.gz
  • cd echo-nginx-module-0.58
  • cd /root/work/nginx-1.9.3
  • ./configure --prefix=/opt/nginx --with-http_ssl_module --with-ld-opt="-Wl,-rpath,/usr/local/lib" --add-module=/root/work/ngx_devel_kit-0.2.19 --add-module=/root/work/lua-nginx-module-0.9.19 --add-module=/root/work/echo-nginx-module-0.58
  • make -j2
  • make install
  • /opt/nginx/sbin/nginx -V
nginx version: nginx/1.9.3
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/opt/nginx --with-http_ssl_module --with-ld-opt=-Wl,-rpath,/usr/local/lib --add-module=/root/work/ngx_devel_kit-0.2.19 --add-module=/root/work/lua-nginx-module-0.9.19 --add-module=/root/work/echo-nginx-module-0.58/

-V でインストール時のビルドオプションを確認できます
ngx_devel_kitlua-nginx-module は前回インストールしたモジュールで今回も使うので指定しています

サンプルのテストコードを作成する

  • cd /var/tmp
  • mkdir t
  • cd t
  • vim sample_nginx_test.t
use Test::Nginx::Socket;

# テストを実行する回数を指定します、以下の場合は 2 回
repeat_each(2);
plan tests => repeat_each() * 2 * blocks();

# テストをシャッフルせず上から実施します
no_shuffle();
# DocumentRoot の設定を自動で生成しないようにします
no_root_location();
# テストを実行します
run_tests();

__DATA__

=== TEST 1: sample
--- config
    location /hello {
            echo hello_world;
    }
--- request
    GET /hello HTTP/1.0
--- response_body
hello_world
--- error_code: 200

テスト冒頭でオプションをコールすることができます
他にもオプションはあるので詳細は公式サイトを見てください

今回サンプルで作成したテストは「/hello」にアクセスするとレスポンスとして「hello_world」を返却する location を定義して、そのパスに対して GET でアクセスした結果、レスポンスボディが「hello_world」でありレスポンスコードが「200」であるかをチェックするテストになります

実行してみる

テストは prove コマンドを使って実行します
おそらくデフォルトでインストールされていると思います

  • cd /var/tmp
  • prove -v t

t/sample_nginx_test.t ..
1..4
ok 1 - TEST 1: sample - status code ok
ok 2 - TEST 1: sample - response_body - response is expected (req 0)
ok 3 - TEST 1: sample - status code ok
ok 4 - TEST 1: sample - response_body - response is expected (req 1)
ok
All tests successful.
Files=1, Tests=4, 1 wallclock secs ( 0.01 usr 0.01 sys + 0.10 cusr 0.01 csys = 0.13 CPU)
Result: PASS

上記のようになれば OK です

テストの流れ

どうやら、Test::Nginx::Socket は作成したテストを元に nginx.conf を独自で作成して、その作成した nginx.conf を元に Nginx を起動します
なので、自分で作成した nginx.conf を使いたい場合、そうなるようにテストを作成する必要があります
もしかしたら自分が作成した nginx.conf を指定して Nginx を実行した上でテストを実行することができるかもしれませんが、まだ調査できていません
たぶんできると思うんですが、、、

最後に

紹介は以上です
End to End のテストケースを書くには便利なツールだと思います
内部で Lua スクリプトなどを使っている場合は別途 Lua テスト用のユニットテストがあると更に良いと思います
結構いろいろなテストが書けるのでこれだけでもいいかもしれませんが

参考サイト

0 件のコメント:

コメントを投稿