karateを使ったAPIテストの自動化

こんにちは。QAチームのhanです。

LiquidのQAチームでは、リリースをする度に実施する回帰テストを、正確且つ迅速な結果を得るために、テスト自動化を推進しております。
今回はkarateというテストフレームワークを使ったAPIテストの一例を紹介させて頂きます。

karateとは?

  • Gherkinの文法を自然言語に近い形で記述できるテストフレームワーク
  • 学習コストが低い、プログラミング経験がない人も使える(と思っています!)
  • テスト記述方法が直観的で、結果も見やすい(と思っています!)

詳細はこちらで確認できます。 github.com

サンプルコードを実行して、どんなものなのか確認して見ましょう

1.Quickstartを参考にプロジェクト作成します。

f:id:liquid-tech:20210705225727p:plain

2.プロジェクトが作成されたので、中を確認して見るとexamplesがあったのでとりあえず実行して見ます。

f:id:liquid-tech:20210705230103p:plain f:id:liquid-tech:20210705231008p:plain f:id:liquid-tech:20210705230856p:plain

3. ビルドが成功すると、このようにhtml形式でファイル出力されるのでブラウザで確認できます。

f:id:liquid-tech:20210705231330p:plain f:id:liquid-tech:20210705231604p:plain

サンプルコードは実行できたので、テストを書いて見ましょう!

例えば、以下のような仕様と接続情報があるとします。

チケット購入システムにてチケットを購入した人の申請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 の 451104905710351104905710
  • 存在しない申請IDでは、error_code のCE00004CE00005
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"}
実行結果
  • テストの成功有無が色分けされています。 f:id:liquid-tech:20210707225210p:plain

  • 失敗しているテストは該当場所をクリックすると、なぜ失敗したか詳細がわかるようになっています。 f:id:liquid-tech:20210707225158p:plain

QAチームでは実際どうしているのか!?

  • Jenkinsを使って定期的に実行しています。
  • 個別のJOBをPipelineに順次実行するようにしています。
  • 失敗しているテストがあったらいち早く気づけるため、Slackに通知されるように仕込んでいます。

f:id:liquid-tech:20210705235142p:plain f:id:liquid-tech:20210707223258p:plain

おわりに

  • 一緒にテストを書きたい人
  • 一緒にキャンプ行きたい人

を探しています。(自称キャンプ部長です。)

お話しましょう、ぜひ気軽にこちらからご連絡ください! www.wantedly.com