kdnakt blog

hello there.

Kotlin/NativeでHTTPサーバーを作るアドベントカレンダー(21日目:httpieでE2Eテスト)

この記事はkdnaktの1人 Advent Calendar 2020の21日目の記事です(2日遅れ……)。

 

2020年は会社でKotlin dojoを主催して週1回30分Kotlinと戯れていました。12月はその集大成ということで、Kotlin/NativeでHTTPサーバーを作ってみたいと思います。どこまでできるか、お楽しみ……。

 

 

[httpieを利用したE2Eテスト]

CUIで利用できるHTTPクライアントであるhttpie(エイチティーティーパイ)を利用して、E2Eテストを実装します*1

github.com

 

インストールはシンプルにbrewコマンドを利用します。名前はhttpieなのですがコマンドはhttpなので注意が必要です。

$ brew install httpie
(略)
$ http --version
2.3.0

 

httpieのドキュメントを読んでなんとなく使い方は理解できたのですが、シェルスクリプトでE2Eテストを実装する上手いやり方が思いつかなかったのでGoogleで検索したところ、以下のRedditの記事とGitHubリポジトリが参考になりました。

www.reddit.com

github.com

 

実装するテストスクリプトと、関連するプロジェクト内のファイルの全体像は次の通りです。

.
├── 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

 

テストを実行すると、以下のように成功します。

f:id:kidani_a:20201223034833p:plain


テストが失敗する場合は、以下のような表示になります。

f:id:kidani_a:20201223035222p:plain

 

これで、シンプルなhttpieを利用したE2Eテストを実装できました。

 

[まとめ]

  • CLIで利用できるHTTPクライアントhttpieを試した
  • httpieを利用してE2Eテストのスクリプトを作成した
  • 実装中のコードは以下のリポジトリにまとめてある

github.com

 

*1:yamlでテストを書けるtaverntesting/tavernも検討したのですが、REST APIに特化しており、HTMLファイルのテストが難しそうだったので断念しました。