この記事はkdnaktの1人 Advent Calendar 2020の21日目の記事です(2日遅れ……)。
2020年は会社でKotlin dojoを主催して週1回30分Kotlinと戯れていました。12月はその集大成ということで、Kotlin/NativeでHTTPサーバーを作ってみたいと思います。どこまでできるか、お楽しみ……。
[httpieを利用したE2Eテスト]
CUIで利用できるHTTPクライアントであるhttpie(エイチティーティーパイ)を利用して、E2Eテストを実装します*1。
インストールはシンプルにbrewコマンドを利用します。名前はhttpieなのですがコマンドはhttp
なので注意が必要です。
$ brew install httpie (略) $ http --version 2.3.0
httpieのドキュメントを読んでなんとなく使い方は理解できたのですが、シェルスクリプトでE2Eテストを実装する上手いやり方が思いつかなかったのでGoogleで検索したところ、以下のRedditの記事とGitHubリポジトリが参考になりました。
実装するテストスクリプトと、関連するプロジェクト内のファイルの全体像は次の通りです。
. ├── build │ └── bin │ └── native │ └── releaseExecutable │ └── kttpd.kexe ├── public │ └── index.html ├── run_test.sh └── test ├── get_index_html.sh └── init ├── functions.sh └── precheck.sh
E2Eテストを行う際は、プロジェクトのルートディレクトリで以下のコマンドを実行します。
$ /bin/bash run_test.sh
run_test.sh
は以下のようになっています。
#!/bin/bash # テストスクリプトの初期化処理 . ./test/init/functions.sh # msg, ok, cleanUp, failなどの関数が定義されている . ./test/init/precheck.sh # httpieコマンドの利用可否チェック msg "TEST START" # テスト対象のkttpd.exeを起動する export SERVER_PORT=8888 export SERVER_PATH=localhost:$SERVER_PORT PID=$( ./build/bin/native/releaseExecutable/kttpd.kexe --port $SERVER_PORT >/dev/null & echo $! ) msg "started kttpd (PID: $PID)" # テストを実行する . ./test/get_index_html.sh # テスト対象のkttpd.exeを終了する cleanUp ok "TEST FINISHED"
get_index_html.sh
は、http://localhost:8888/index.html
にアクセスして、HTTPレスポンスのステータスコードと、取得したHTMLファイルの中身を比較するシンプルなテストです。コードの内容は以下の通りです。
#!/bin/bash msg "retrieve index.html" # assert_status_codeはfunctions.shで定義済み assert_status_code "get" "index.html" 200 RES=$(http --check-status --ignore-stdin --timeout=4.5 get $SERVER_PATH/index.html) diff -w <(echo "$RES") <(cat ./public/index.html) if [ "$?" != "0" ] ; then fail "wrong index.html" else ok "right index.html" fi
テストを実行すると、以下のように成功します。
テストが失敗する場合は、以下のような表示になります。
これで、シンプルなhttpieを利用したE2Eテストを実装できました。
[まとめ]
*1:yamlでテストを書けるtaverntesting/tavernも検討したのですが、REST APIに特化しており、HTMLファイルのテストが難しそうだったので断念しました。