API testing toolについて調べてみる
Motivation
BaaSの開発でAPIを作成するけれど、QAチームのテストはAPIを呼び出すクライアント側の実装が完了しないと出来ない。
BaaSとして品質を担保する為にAPI群のテストをしたい。
OpenAPIでspec書いているのでswagger-uiとかを利用してAPI自体は単体では実行できるけれどもAPIをチェーンして呼び出すシナリオテストができない。
APIをチェーンするというのは
- 登録API(コードが発行される)
- 更新API(1で発行されたコードを指定して更新)
という一連の流れをやりたい。
postmanとかで、パラメータ埋め込みをいい感じにすれば、できなくはないがGUIで毎回やりたくないし、複数シナリオをCI上で実行したい。
テストコードを書くので、レビューしやすいフォーマット。。テキストベースでDSL等になっているとベスト。
:arrow_up: そんなAPIのテストツールがあるか調べてみる
A missing commandline application for execute IntelliJ HTTP Client file.
だそうだ。
JetBrainのHTTP Clientで作成した .http
もしくは .rest
ファイルをCI実行できるってことかな。
HTTP Client使ってなかったけれどOpenAPIでコード補完さえるのね。
便利そう。
レスポンスのハンドラーでスクリプトをかけるみたい
GET https://httpbin.org/status/200
> {%
client.test("Request executed successfully", function() {
client.assert(response.status === 200, "Response status is not 200");
});
%}
まだ調べきれてないけれど、スクリプトをかけるってことは、APIチェーンもいい感じにコード化できるってことかな?
リクエストデータも外部ファイルから繰り返し実行したいけれど、そこらへんも調べてみたい
GitHubにてJetBrains社がドキュメントだされております!
runn
scenarigoよりもドキュメントがしっかりしている感じ
dbからテストデータを読み込むことが出来たり前stepの内容を簡単に参照できるのが良さそう。
書き味はGithub actionsみたいで素敵。
さらっと使ってみた感想
- すごく簡単に使える
- OpenAPIのSpecのリクエストとレスポンス定義通りかチェックしてもらえる
- listコマンドで内容が見えるのでいい
- debugオプションを有効にすると何がおかしいかわかりやすい
使ってみて少し不具合や機能不足がありそう
- getパラメータにvarsからパラメータを読み込ませようとするとシングルコートがエスケープされてしまう
vars:
month: '202104'
steps:
-
req:
/api/test?month={{ vars.month }}:
put:
boody: null
とかにすると
-----START HTTP REQUEST-----
PUT /api/test?month=%27202104%27 HTTP/1.1
とかになってしまう
- Basic認証を使うOAS Specを読み込むことができない?
* runner req error: openapi3 document validation error: invalid components: security scheme of type 'http' has invalid 'scheme' value "Basic"
swagger-uiでは認識されているから、specの記述ミスではなさそうではないけれど
サポートがされてないってことかな?
コントリビュートチャンスか
共通処理をincludeして中でbindした変数をパラメータで引き継ごうと思ったけれど、うまくいかなかった。
bindした引数はtestでしか使えない?
getパラメータにvarsからパラメータを読み込ませようとするとシングルコートがエスケープされてしまう
原因が少し見えたかも。
全てのvarsパラメータがエスケープされる訳ではなくて、文字列が数値っぽい感じだと駄目かも
シングルクォート付きで置換している
yaml上で一括置換しているっぽくてpathの場合(pathだけでなく文字列途中の展開する場合も)が問題になりそう。
PRした
Basic認証を使うOAS Specを読み込むことができない?
validatorを行っているライブラリがそもそもbasic認証をサポートしていない模様。
basic認証ってまあアレだけれどもサポートしてくれないかな。。
コントリビュートチャンス再来w
いや。サポートしているな
Basic
にしているからdefaultになってしまっているのかw
小文字化して判定してくれると有り難いが、元のSpecを書き直すか。。
書き直してみたら、少し進んだ。
swagger-ui上も問題にはならなかった。小文字が正解ってことか。
openapi3 validation error: Security requirements failed
fm-
実際にリクエストは出来ているんだけれども。。
再現できたけれど、ここから問題の切り分けが必要だなー
チクチクDebugして見ていくか
ライブラリ側のオプションを弄ればいけそうだったのでPR
CLI単体である程度の関数呼び出したいなー
urlencode以外にもbase64とか
IncludeとbindについてMemo
-
Include元
https://github.com/k1LoW/runn/blob/main/testdata/book/include_main.yml -
Include先
https://github.com/k1LoW/runn/blob/main/testdata/book/include_a.yml
Include先でbindされた値はIncludeを行ったstep名で参照できる
steps.a.filename
という感じ
requestのテスト結果を参照するのに以下みたいに書かなくて済む
steps.a. res.body.hoge
というか、Include先には複数stepを定義できるのでそのまま参照できない?
bindを行うのがベストプラクティスか
あとInclude自体は多段で行うことができる
include_main.yml -> include_a.yml -> include_b.yml
みたいな感じ。
シナリオを作成する際に毎回同じステップを書くのをなくす為にこのincludeをうまく使うのが良さそうだ。
単体のシナリオを他のシナリオに組み込むことができる
その際にテストは重複になるので、include元で skipTest: true
とすることで純粋にステップのみを再利用できる
結果を引き継いでAPIチェーンするといい感じに書けるが一つ注意点があり
- bindした結果の参照は一つ前のInclude内でbindしたものに限られる
この注意点についてはInclude内でbindし直すと回避ができる
今後の仕様見直しで改善されるかもだけれども
PR出してみた
ちょこちょこ式展開を利用時にinvalid formatのエラーが発生するけれど、どこの箇所でエラーが発生したか分かりづらい。エラーメッセージが新設な内容だと良さそう。
さらっとしか見てないけれどバージョン管理できるPostmanっぽい
Web&デスクトップ版もありCLIでも使える
後で見る
runnに近い。負荷テストもカバーしている
軽くdocument見てみたけれどtestデータはcsvの例しか見つからなかった。
繰り返し実行はできないのかな?
fakeデータを使えるのは面白い
あとシナリオの共通化も見つからなかった。
Tavern知らなかった。もっとAPIテストの認知度が上がってきて盛り上がるといいなー