概要
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_kit
と lua-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 件のコメント:
コメントを投稿