Open21

API testing toolについて調べてみる

katzumikatzumi

Motivation

BaaSの開発でAPIを作成するけれど、QAチームのテストはAPIを呼び出すクライアント側の実装が完了しないと出来ない。
BaaSとして品質を担保する為にAPI群のテストをしたい。
OpenAPIでspec書いているのでswagger-uiとかを利用してAPI自体は単体では実行できるけれどもAPIをチェーンして呼び出すシナリオテストができない。
APIをチェーンするというのは

  1. 登録API(コードが発行される)
  2. 更新API(1で発行されたコードを指定して更新)

という一連の流れをやりたい。
postmanとかで、パラメータ埋め込みをいい感じにすれば、できなくはないがGUIで毎回やりたくないし、複数シナリオをCI上で実行したい。

テストコードを書くので、レビューしやすいフォーマット。。テキストベースでDSL等になっているとベスト。

:arrow_up: そんなAPIのテストツールがあるか調べてみる

katzumikatzumi

https://github.com/restcli/restcli

A missing commandline application for execute IntelliJ HTTP Client file.

だそうだ。
JetBrainのHTTP Clientで作成した .http もしくは .rest ファイルをCI実行できるってことかな。

https://www.jetbrains.com/help/idea/http-client-in-product-code-editor.html

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チェーンもいい感じにコード化できるってことかな?

リクエストデータも外部ファイルから繰り返し実行したいけれど、そこらへんも調べてみたい

katzumikatzumi

runn
https://tech.pepabo.com/2022/06/07/scenario-testing-in-go/

scenarigoよりもドキュメントがしっかりしている感じ
dbからテストデータを読み込むことが出来たり前stepの内容を簡単に参照できるのが良さそう。
書き味はGithub actionsみたいで素敵。

katzumikatzumi

さらっと使ってみた感想

  • すごく簡単に使える
  • 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の記述ミスではなさそうではないけれど
サポートがされてないってことかな?

コントリビュートチャンスか

katzumikatzumi

共通処理をincludeして中でbindした変数をパラメータで引き継ごうと思ったけれど、うまくいかなかった。
bindした引数はtestでしか使えない?

katzumikatzumi

getパラメータにvarsからパラメータを読み込ませようとするとシングルコートがエスケープされてしまう

原因が少し見えたかも。
全てのvarsパラメータがエスケープされる訳ではなくて、文字列が数値っぽい感じだと駄目かも

https://github.com/k1LoW/runn/blob/main/operator.go#L700-L701

シングルクォート付きで置換している
yaml上で一括置換しているっぽくてpathの場合(pathだけでなく文字列途中の展開する場合も)が問題になりそう。

katzumikatzumi

いや。サポートしているな
Basic にしているからdefaultになってしまっているのかw
小文字化して判定してくれると有り難いが、元のSpecを書き直すか。。

katzumikatzumi

書き直してみたら、少し進んだ。
swagger-ui上も問題にはならなかった。小文字が正解ってことか。

openapi3 validation error: Security requirements failed

fm-
実際にリクエストは出来ているんだけれども。。

katzumikatzumi

IncludeとbindについてMemo

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し直すと回避ができる
今後の仕様見直しで改善されるかもだけれども

katzumikatzumi

PR出してみた
https://github.com/k1LoW/runn/pull/81

ちょこちょこ式展開を利用時にinvalid formatのエラーが発生するけれど、どこの箇所でエラーが発生したか分かりづらい。エラーメッセージが新設な内容だと良さそう。

katzumikatzumi

runnに近い。負荷テストもカバーしている
https://stepci.com/

軽くdocument見てみたけれどtestデータはcsvの例しか見つからなかった。
繰り返し実行はできないのかな?
fakeデータを使えるのは面白い

あとシナリオの共通化も見つからなかった。