その1では、Webサービスのテストツールである Karate の簡単な紹介をしました。
その2は、宣言通りポーリングが必要なケースについて紹介したいと思います。
手軽にポーリングを試せるWebサービスがなかったので、以下のようなシナリオでポーリングを組み込んだテストをしたいと思います。
- 「Karate を使ったWebサービス テスト その1」の情報を取得し、いいね数を記録
- 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"
さぁ、「いいね」を押してみましょう。
テストが成功するはずです。
もう一度実行して、放置するとテストが失敗します。
この方法を使うことで、たとえば「仮想マシンの起動命令を行い、ある程度の時間が経った後に起動状態になることを確認」といったテストがかけるようになります。
最後に
まだまだ使っていない機能も多いので、引き続き使ってみて記事も追加していこうかなと思います。