CGIのユニットテストを書く
www.cgi-testライブラリを使ってCGIスクリプトを実際に動作させるテストが作れます。
CGIに含まれる関数群はモジュール化してgauche.testの単体テストを行い、CGIのファンクショナルテストにwww.cgi-testを使いましょう。
「www.cgiライブラリを利用する」で書いたhello.cgiのテストを書いてみましょう。
テストコードはtest-hello.scmというファイル名にして、hello.cgiと同じフォルダに置いてください。
(use gauche.test)
(use www.cgi-test)
(test-start "CGI Test")
(test* "Hello Gauche"
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"\n \"http://www.w3.org/TR/html4/strict.dtd\">\n<html><body><p>Hello, Gauche!</p\n></body\n></html\n>"
(values-ref (run-cgi-script->string
"./hello.scm"
:environment '((REQUEST_METHOD . "GET")))
1)
)
(test-end)
通常のユニットテストと違い、gauche.testに加えてwww.cgi-testを読み込みます。
次の箇所でwww.cgi-testの関数を使っています。
(values-ref (run-cgi-script->string
"./hello.cgi"
:environment '((REQUEST_METHOD . "GET")))
1)
run-cgi-script->stringはCGIスクリプトを実行し、その結果をHTTPヘッダのリストと文字列の二つの値(多値)にして返す関数です。このテストではヘッダーの値はテストしないので、values-refで二つ目の値(0から始まるので二つ目は1)になる文字列だけを取得しています。
ここで得られる文字列はhello.cgiが返すHTMLそのものなので、test*で比較する値はブラウザが受けとるHTMLをそのまま書いています。
run-cgi-script->stringの引数は左から順にCGIスクリプトのパス、オプション引数で環境変数とCGIに渡すパラメータを指定できます。
パラメータを渡す例:
; hello.cgi?name=TAROU&age=12とアクセスした場合
(run-cgi-script->string
"./hello.cgi"
:environment '((REQUEST_METHOD . "GET"))
:parameters '((name . "TAROU")
(age . 12)))
以上のようにしてCGIスクリプトをHTTPサーバを使わずに実行してテストすることができます。
www.cgi-testには、run-cgi-script->stringと返り値の種類が違う同種の関数が用意されています。
run-cgi-script->string-listは行単位の文字列のリストにして返します。
run-cgi-script->sxmlはHTMLやXMLをS式で表わすSXMLにして返します。実際のアプリケーションは複雑で大きなHTMLを返します。そのようなHTMLから一部分を抽出して比較したい場合にrun-cgi-script->stringは不便です。SXMLにするとHTMLがSchemeのリストになるため、高度な処理が簡単に記述できるようになります。Gacuhe作者の川合氏が作っているWikiエンジンのWiLiKiにはSXMLのパターンマッチを使ったテスト用ライブラリsxml.xml-testがあります。是非参考にしてください。