こんにちは。QAチームのhanです。
LiquidのQAチームでは、リリースをする度に実施する回帰テストを、正確且つ迅速な結果を得るために、テスト自動化を推進しております。
今回はkarateというテストフレームワークを使ったAPIテストの一例を紹介させて頂きます。
karateとは?
- Gherkinの文法を自然言語に近い形で記述できるテストフレームワーク
- 学習コストが低い、プログラミング経験がない人も使える(と思っています!)
- テスト記述方法が直観的で、結果も見やすい(と思っています!)
詳細はこちらで確認できます。 github.com
サンプルコードを実行して、どんなものなのか確認して見ましょう
1.Quickstartを参考にプロジェクト作成します。
2.プロジェクトが作成されたので、中を確認して見るとexamplesがあったのでとりあえず実行して見ます。
3. ビルドが成功すると、このようにhtml形式でファイル出力されるのでブラウザで確認できます。
サンプルコードは実行できたので、テストを書いて見ましょう!
例えば、以下のような仕様と接続情報があるとします。
チケット購入システムにてチケットを購入した人の申請IDを渡すとチケット番号とチケットの有効期限が取得できるAPI
接続URL:https://hogehoge.com/ticket_results/:applicant_id method:get Content-Type:application/json XXX-Key:'xxxxxx' レスポンス形式:json
テストデータと期待値
シナリオ名 | 申請IDの状態 | 申請ID | http status | エラーコード | 期待値 |
---|---|---|---|---|---|
Scenario_1 | 存在する 申請ID |
abc12345 | 200 | - | {"ticket_number":"451104905710","expire_date":"20210731"} |
Scenario_2 | 存在しない 申請ID |
def67890 | 409 | CE00004 | - |
テストの記述方法
Feature: テストの概要、詳細などを記述 Background: 共通的に利用するグローバル変数などを定義しておくと、 各シナリオの前に実行される 複数記述可能 Scenario: シナリオの概要 Given 前提条件を記述 And 複数の条件を連続して記述する際に使う(直前のステップと同じ意味を持つ) When REST-APIのmethod(postやgetなど)を記述 Then 期待値を記述 * match response レスポンスのチェック
期待値通りになるようにテストを書いて見る
Feature: sample Background: * def URL = 'https://hogehoge.com' * def requst_headers = {Content-Type: 'application/json', XXX-Key: 'xxxxxx'} Scenario: 存在する申請ID Given url URL And path '/ticket_results/abc12345' And headers requst_headers When method get Then status 200 * match response == {"ticket_number":"451104905710","expire_date":"20210731"} Scenario: 存在しない申請ID Given url URL And path '/ticket_results/def67890' And headers requst_headers When method get Then status 409 * match response contains {"error_code": "CE00004"}
あえて期待値を書き換えてテストを失敗させて見る
存在する申請ID
では、ticket_number の451104905710
を351104905710
に存在しない申請ID
では、error_code のCE00004
をCE00005
に
Feature: sample2 Background: * def URL = 'https://hogehoge.com' * def requst_headers = {Content-Type: 'application/json', XXX-Key: 'xxxxxx'} Scenario: 存在する申請ID Given url URL And path '/ticket_results/abc12345' And headers requst_headers When method get Then status 200 * match response == {"ticket_number":"351104905710","expire_date":"20210731"} Scenario: 存在しない申請ID Given url URL And path '/ticket_results/def67890' And headers requst_headers When method get Then status 409 * match response contains {"error_code": "CE00005"}
実行結果
テストの成功有無が色分けされています。
失敗しているテストは該当場所をクリックすると、なぜ失敗したか詳細がわかるようになっています。
QAチームでは実際どうしているのか!?
- Jenkinsを使って定期的に実行しています。
- 個別のJOBをPipelineに順次実行するようにしています。
- 失敗しているテストがあったらいち早く気づけるため、Slackに通知されるように仕込んでいます。
おわりに
- 一緒にテストを書きたい人
- 一緒にキャンプ行きたい人
を探しています。(自称キャンプ部長です。)
お話しましょう、ぜひ気軽にこちらからご連絡ください! www.wantedly.com