見出し画像

APIテスト自動化ツール「Karate」現場ですぐに使える実装パターン8選(後編)

前編では現場ですぐ使用できる実装パターン8選中の4パターンを紹介させて頂きました。後編では残り4パターンを紹介していこうと思います。


実装パターン8選

【パターン5】別ファイル(feature)呼び出し

5つ目は別ファイルにあるテストシナリオを呼び出す方法です。
使用頻度の高い処理を共通部品として用意しておき、任意のテストシナリオから呼び出したいときに使用します。
サンプルではユーザ情報を登録するAPIを、別ファイル(feature)に用意しメインシナリオから呼び出してみます。

#userInfoRegister.feature
@ignore
Feature: User Info Register
  Background:
    * url baseUrl

  Scenario: ユーザ情報登録
    Given path '/userInfoRegister'
    And request { id: 'A001', name: '太郎' }
    When method post

    Then status 200
    And match response == '#object'
    And match response.result == 'success'

別ファイルとして用意したコードのポイントはignoreタグを付けておくことです。 こうすることでテスト実行対象とはならず呼び出したいタイミングでのみ動作させることが可能です。

# sample.feature
Feature: Karate Sample
  Background:
    * url baseUrl

Scenario: 別featureファイル呼び出し
    * def userInfoRegister = karate.callSingle('userInfoRegister.feature')

呼出し元となるテストシナリオでは、karate.callSingle() を使用し、呼び出したいfeatureファイル名を 指定し呼び出します。

では実行してみます。

正常にuserInfoRegister.featureを呼び出せていますね。

【パターン6】Javaクラスの呼び出し

6つ目はJavaで実装したクラスを呼び出す方法です。
テスト実装を進めていくと、Karateの機能やJavaScriptではうまく実装できない箇所が意外に出てきます。
そんなときは Java側で処理を行い、それを呼び出す形にします。
まずはJava側。
今回は文字列を大文字(Upper)に変換するメソッドを用意します。

// strUtils.java
package scenarios;

public class strUtils {

    /*
        文字列を大文字に変換する
     */
    public static String upper(String str) {
        String result = str.toUpperCase();
        return result;
    }
}
# sample.feature
Feature: Karate Sample
  Background:
    * url baseUrl

Scenario: Java呼び出し
    * def strUtils = Java.type('scenarios.strUtils')

    Given path '/retrunArgValue'
    And param arg = 'apple'
    When method get

    Then status 200
    * def upperStr = strUtils.upper(response.item)
    And match upperStr == 'APPLE'

テストシナリオ側では、以下の流れでJavaの処理を呼び出します。
1)Java.type() で読み込みたいJavaクラスを指定
2)変数.upper(文字列) でJavaメソッドを呼び出す
3)戻り値を変数に格納(upperStr)する
これで、かゆいところにも手が届くようになるのでとっても便利です。

【パターン7】タグ付けによるテスト実行制御

7つ目はタグによるテスト実行制御の方法です。 Karateではテストシナリオ内のタグ機能をサポートしています。
正常系、異常系、機能名などテストシナリオに紐付けておくことで、タグごとでのテスト実行などが可能になります。
タグを指定する場合は、Scenarioの前に@(アットマーク)を付けて指定します。
今回は正常パターンの意味合いで「@normal」としてみましょう。


package scenarios;

import com.intuit.karate.Results;
import com.intuit.karate.Runner;
import com.intuit.karate.junit5.Karate;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class ScenarioRunner {
    @Karate.Test
    Karate runSuccess() { return Karate.run().tags("@normal").relativeTo(getClass()); }
}

実行する際は、tagsメソッドにて対象としたいタグ名を指定します。
※「~@normal」とすると実行対象外にすることも可能です。

【パターン8】テストシナリオの並行実行

最後は並行でテストを実行する方法です。
これまでのテスト実行時に使用していたKarate.run()は、直列実行となりテスト時間がかかります。
実業務では可能な限りテスト実行時間を短縮させたいため、基本的には並行実行で行っていきます。
さっそく実際に実装を見てみましょう。

    // 並行処理
    @Test
    public void runParallelTest() {
        Results results = Runner.path("classpath:scenarios").parallel(5);
        assertEquals(0, results.getFailCount(), results.getErrorMessages());
    }

ポイントは2点。
1)Runner.path()にテスト実行したいクラスパスを指定
2)parallel()に並行数を指定
となります。サンプルでは並行数は5を指定したため5スレッドでのテスト実行となります。

終わりに

現場ですぐに使える実装パターン8選、いかがだったでしょうか。もちろん今回ご紹介したパターンが正解というわけではありませんが、Karate初心者やもっと使いこなしたいという方への一助なればと思っています。

・参考:https://github.com/karatelabs/karate

__________________________________

執筆者プロフィール:柏木 雄介
医療分野での業務システム開発・導入経験を経て、2020年にSHIFTへ入社。
QA活動やテスト自動化を担当しながら、アーキテクト目指して日々奮闘中。
趣味は、ゲームとサッカー(ジュビロ磐田サポ)。
最近ハマっているのは洗車。

お問合せはお気軽に
https://service.shiftinc.jp/contact/

SHIFTについて(コーポレートサイト)
https://www.shiftinc.jp/

SHIFTのサービスについて(サービスサイト)
https://service.shiftinc.jp/

SHIFTの導入事例
https://service.shiftinc.jp/case/

お役立ち資料はこちら
https://service.shiftinc.jp/resources/

SHIFTの採用情報はこちら
https://recruit.shiftinc.jp/career/