Karate を使ったWebサービス テスト その2


その1では、Webサービスのテストツールである Karate の簡単な紹介をしました。

その2は、宣言通りポーリングが必要なケースについて紹介したいと思います。

手軽にポーリングを試せるWebサービスがなかったので、以下のようなシナリオでポーリングを組み込んだテストをしたいと思います。

  1. Karate を使ったWebサービス テスト その1」の情報を取得し、いいね数を記録
  2. 10秒おきに情報を取得し、「記録したいいね数」から増えると成功。60秒を超えるとテスト失敗。

詳細

今回追加したのは以下の2ファイルです。

GetItem.feature

与えられたidを元に投稿記事を取得する再利用のためのfeature
ignoreをつけないと、これもテストだと勘違いされ実行されますが、id が定義されていないのでエラーになります。

@ignore
Feature: Get item
Background:
* url urlBase

Scenario: Get item

Given path "items", id
And header Accept = 'application/json'
When method get
Then status 200

polling.feature

polling のテストfeature

JavaScript 関数を定義し、その中でGetItem.featureを使ってpollingする処理を書いています。
また、シナリオの最初でも、現在のいいね数を取得するために、GetItem.feature を使います。
シナリオ中に書く場合と、JavaScript 関数中では呼び方が微妙に違うので注意が必要です。

@polling
Feature: Karate sample2

Background:
* url urlBase
* def waitUntil =   ------------(1) 10秒おきに投稿詳細を取得し、options.desired_countを越えた時点で0を返却するJavaScript 関数
"""
function(options) {
    karate.log(options.item_id);
    for (var i=0; i< 6 ;i++) {
        java.lang.Thread.sleep(10000);
        var result = karate.call('./libs/GetItem.feature', {id: options.item_id}); 
        var item = result.response;
        if (item.likes_count >= options.desired_count){
            karate.log('いいねが押されたよ');
            return 0;
        }
        karate.log('waiting...');
    }
    return -1;
}
"""


Scenario: Wait 

* def item_id = '90c9a093384375f9beca'
* def result = call read('./libs/GetItem.feature') {id: #(item_id)} ------------(2) GetItem.featureを利用して、投稿詳細を取得。
* def current = result.response.likes_count
* print 'current likes_count: ' + current
* def target = current + 1 
* def ret = call waitUntil {item_id: #(item_id),  desired_count: #(target) }  ------------(3) Background で定義したポーリングする関数を呼びます。
* match ret == 0

実行してみる

ソースは以下です

gradle clean test -Dcucumber.options="--tags @polling"

さぁ、「いいね」を押してみましょう。
テストが成功するはずです。
もう一度実行して、放置するとテストが失敗します。

この方法を使うことで、たとえば「仮想マシンの起動命令を行い、ある程度の時間が経った後に起動状態になることを確認」といったテストがかけるようになります。

最後に

まだまだ使っていない機能も多いので、引き続き使ってみて記事も追加していこうかなと思います。