5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

FUJITSUAdvent Calendar 2017

Day 20

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

Posted at

その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"

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

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

最後に

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

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?