APIテストを教えてもらったので振り返る
社内のQAメンバーにバックエンド(Apex)のAPIテストを教えてもらいました。
(ありがとうございました!)
大まかな流れについて振り返りたいと思います。
また、APIテストの前後処理にjavascriptやJavaが使われていたのですが、そこについては自力ではできなかったので、どういった内容だったのか調べながら理解します。
使ったツール
サーバーへの負荷試験やパフォーマンスの測定に使われるツールです。
準備
①ツール
- Javaをインストール
- ApacheJMeterをインストール
- 今回のテストで使うブランチをローカルへ落とす
- JMeter用のディレクトリを作り、jmxファイルを作成
- JMeterを起動し、jmxファイルを開く
②API仕様書の確認
実装のために、以下を調べます。
- テストの対象となるAPIのパスを確認
- HTTPリクエストとレスポンスに使われるパラメータを確認
リクエストのパラメータ
APIに対して投げるリクエストはJMeterでjsonフォーマットで書くので、入力が必要な項目を確認します。今回は最低限の確認のため、任意項目については検討しませんでした。
レスポンスのパラメータ
APIテストの成功/失敗の判定に使うアサーション(Response Assertion)をどのパラメータにするか検討します。
実装
- サンプラーを作成
Body Dataにリクエストをjson形式で書きます。
内容はAPIのpathと準備で検討したparamです。 - PreProcessorで前処理を作成
リクエストで使うパラメータの値を予め指定したい時などに作成します。
今回はリクエストに日付を指定したかったので、javascriptで月や日を取得し、次の処理(サンプラー)で使うためにvars.put()で変数を定義しました。 - PostProcessorで後処理を作成
レスポンスのパラメータを次のテストで使いたい時などに作成します。
今回はレスポンスをパース(*1)してからvars.put()で変数を定義しました。
また、今回はレスポンスに複数のデータがあり、一つのみ使いたかったので、配列で最初のデータのみ取得するようにしました。 - Response Assertionを作成
レスポンスデータをアサーションする設定です。
今回はレスポンスのjsonファイルに設定した文字列が含まれているかどうかを検証する設定にしました。 - Beanshell Assertionを作成
テスト実行後にBeanshellでアサーション処理をします。ここはJavaで書かれています。
Jenkinsでの定期実行で失敗した際に出るエラー文を見やすい形にする処理をしています。 - Config Elementを設定
今回は以下の3つを設定しました。すべてを理解はできていないのですが、調べたことを書きます。
HTTP Request Defaults
HTTPリクエストに対して設定されるデフォルトの構成です。
HTTP Header Manager
HTTPヘッダー情報を設定します。
BeanShell Post Processor
JMeterはレスポンス情報のデフォルトの文字エンコードが「ISO-8859-1」になっているため、BeanShell Post Processorで文字コードを変更し、文字化けを防ぎます。
参考:
【Apache JMeter】レスポンス情報が文字化けする場合の対応方法の紹介 – fumidzuki
学んだこと
テストのピラミッドがよく理解できる
UI Test, Integration Test, Unit Testの順に上から並んでおり、ピラミッドの上位を拡充する方がコストがかかるため、下位のUnit Testを拡充する方がコストメリットがあることを示した図です。
今まではUI Testのみ自動化経験がありました。今回のようにIntegration Testを実際に作ってみることで、上位のテストを色々なパターンに対して作るよりも、下位のテストを充実させる方がメンテナンスにかかる時間の減少や費用対効果があると肌感で理解することができました。
最後に
APIテストを実際に作ってみて、自分の守備範囲が広がった気がします。
少しですがJenkinsも触ったりできて良かったです。
また、JavaScriptも使われており、E2E自動テストでも使える言語なので、コードを書けるようになって自動テストでの選択肢を増やせるようになりたいなと思いました。
*1 パース(parse)
ある書式で記述されたデータをプログラムで使えるデータ構造の集合体に変換すること。
今回だとJson.parseを使い、Jsonで記述された文字列をJavascriptのJsonオブジェクトに変換しました。