Upgrade to Pro — share decks privately, control downloads, hide ads and more …

KarateによるBDDベースのAPIテスト / BDD based API-Testing with Karate

KarateによるBDDベースのAPIテスト / BDD based API-Testing with Karate

「APIテストツール4選!開発者が語る各ツールの特徴と魅力」でのKarateに関する発表資料
https://trident-qa.connpass.com/event/299308/

Takanori Suzuki

November 30, 2023
Tweet

More Decks by Takanori Suzuki

Other Decks in Technology

Transcript

  1. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    Karate による
    BDDベースのAPIテスト
    2023/11/30
    Acroquest Technology Co., Ltd.
    鈴木 貴典
    1
    MagicPod社主催:APIテストツール4選!開発者が語る各ツールの特徴と魅力

    View full-size slide

  2. Copyright © Acroquest Technology Co., Ltd. All rights reserved. 2
    自己紹介
    ◼ 所属
    • Acroquest Technology 株式会社
    ◼ 主な業務分野
    • システムアーキテクト
    • クラウドサービス開発
    • IoT/AI
    鈴木 貴典
    シニアテクニカルアーキテクト Acro = 先端を
    quest = 探究する

    View full-size slide

  3. 「働きがいのある会社(GPTW)」
    ランキング(従業員25~99人部門)
    1位 を
    3回 受賞
    1位 1位 1位

    View full-size slide

  4. Karateは、テスト自動化の対応範囲の広さが魅力
    Copyright © Acroquest Technology Co., Ltd. All rights reserved. 4
    Unified
    Test Automation
    Platform
    ① APIテスト
    ② API Mock(テストダブル)
    ③ UIテスト
    ④ 性能テスト

    View full-size slide

  5. Karateのテストシナリオ
    Copyright © Acroquest Technology Co., Ltd. All rights reserved. 5
    ⚫ Gherkin記法で
    テストケースを記述
    ⚫ BDD(Behavior Driven
    Development)の概念で、
    シナリオテストが可能
    ⚫ テスト構造が分かりやすく、
    内容の理解やテストケース
    のメンテナンスが容易

    View full-size slide

  6. Karateによるテスト実行+実行結果
    Copyright © Acroquest Technology Co., Ltd. All rights reserved. 6
    java -jar karate.jar my-test.feature
    java -jar karate.jar some/folder
    https://karatelabs.github.io/karate/karate-netty/#standalone-jar
    テスト実行結果のHTMLレポートも
    分かりやすい
    単一のバイナリだけで
    実行可能
    単一のKarateシナリオを実行
    複数のKarateシナリオをまとめて実行

    View full-size slide

  7. Karate を選択したポイント
    Copyright © Acroquest Technology Co., Ltd. All rights reserved. 7

    テスト対象の
    カバーの広さ
    ⚫ 様々なAPIに対応
    • REST-API
    JSON, YAML, XML, Text,
    CSV, Bytes
    • GraphQL
    • WebSockets
    • gRPC
    ⚫ APIモック
    (テストダブル)
    ⚫ 性能テスト
    ⚫ UIテスト

    柔軟なDSLでの
    テストシナリオ
    ⚫ API単発ではなく
    シナリオテストが可能
    ⚫ シナリオを分割して
    再利用なども可能
    ⚫ Request/Response、
    Assert処理に対する
    豊富な機能群
    ⚫ Java/JavaScriptとの
    連係

    学習コストが
    低い
    ⚫ 直感的なテストケースの
    記述
    • 新人でもハマらず
    導入できている事例多数
    ⚫ プログラマでなくても
    作成できる
    ⚫ デバッグ可能
    ⚫ 分かりやすい
    結果レポート

    View full-size slide

  8. Karateの主な機能
    Copyright © Acroquest Technology Co., Ltd. All rights reserved. 8

    シンプルな
    テストケース記述

    ローコード
    スキーマ

    データ駆動テスト
    対応

    プログラミング
    言語拡張

    テストダブル

    IDEサポート
    • シナリオ定義/シナリオ再利用
    • 分かりやすいテスト実行
    レポート
    • HTTP標準サポート
    • Assertion
    • Fuzzy Matching
    • テストデータと
    テストシナリオの分離
    • Loop処理
    • JavaScript関数の呼び出し
    • Javaコードの呼び出し
    • APIのモック化 • VS Code プラグイン
    • IntelliJ プラグイン
    • デバッグなども可能

    View full-size slide

  9. ①シンプルなテストケース記述
    Copyright © Acroquest Technology Co., Ltd. All rights reserved. 9
    Feature: cats end-point
    Background:
    * url demoBaseUrl
    * configure logPrettyRequest = true
    * configure logPrettyResponse = true
    Scenario: create and retrieve a cat
    # create a new cat
    Given path 'cats’
    And request { name: 'Billie' }
    When method post
    Then status 200
    And match response ==
    {id:'#number', name:'Billie'}
    * def id = response.id
    シナリオの開始
    リクエストの定義(Given)
    +送信(When)
    レスポンスの確認(Then)
    →Assert処理

    View full-size slide

  10. ①シンプルなテストケース記述
    Copyright © Acroquest Technology Co., Ltd. All rights reserved. 10
    Feature: cats end-point
    Background:
    * url demoBaseUrl
    * configure logPrettyRequest = true
    * configure logPrettyResponse = true
    Scenario: create and retrieve a cat
    # create a new cat
    Given path 'cats’
    And request { name: 'Billie' }
    When method post
    Then status 200
    And match response ==
    {id:'#number', name:'Billie'}
    * def id = response.id
    # get by id
    Given path 'cats’, id
    When method get
    Then status 200
    And match response ==
    {id:’#(id)', name:'Billie'}
    リクエストやレスポンスの内容を利用して、
    連続したAPIの呼び出しができる

    View full-size slide

  11. ②ローコード・スキーマ
    Copyright © Acroquest Technology Co., Ltd. All rights reserved. 11
    # match(一致)
    * match myJson == {a:'1', b:2}
    # match contains(含む)
    * def foo = {bar:1, baz:'hello', ban:'world'}
    * match foo contains {bar: 1}
    # パラメータの有無
    * def test = {id:'001’, name:'Bob'}
    • match test == {id:'001’, name:'#present’, age:'#notpresent’}
    # 範囲
    * def date = {month:3}
    • match date == {month:'#? _ > 0 && _ < 13’}
    # データの型
    * def test = {foo:1, bar:‘baz’}
    * match test == {foo:'#number’, bar:’#string’}
    リクエストやレスポンス、アサーションの処理で必要となる
    スキーマの処理を、標準で多数サポート
    アサーション
    Fuzzy Matching

    View full-size slide

  12. ③データ駆動テスト対応
    Copyright © Acroquest Technology Co., Ltd. All rights reserved. 12
    Scenario Outline: データ駆動テストーサンプルシナリオ
    Given path 'api/v1/circuits/.json'
    When method get
    Then match $.MRData.CircuitTable.Circuits[0].Location.country == '’
    Examples:
    | name | country |
    | monza | Italy |
    | spa | Belgium |
    | sepang | Malaysia |
    テーブル形式で
    複数データを指定
    動的パラメータ

    View full-size slide

  13. ④プログラミング言語拡張
    Copyright © Acroquest Technology Co., Ltd. All rights reserved. 13
    * def greeter = function(name){ return 'hello ' + name }
    * assert greeter('Bob') == 'hello Bob'
    JavaScript が使える!
    * def dateStringToLong =
    """
    function(s) {
    var SimpleDateFormat = Java.type('java.text.SimpleDateFormat');
    var sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
    return sdf.parse(s).time;
    }
    """
    * assert dateStringToLong("2016-12-24T03:39:21.081+0000") == 1482550761081
    Java のクラスも実行できる!
    何か複雑な処理や判定が必要になる場合でも、独自関数で対応可能

    View full-size slide

  14. ⑤テストダブル
    Copyright © Acroquest Technology Co., Ltd. All rights reserved. 14
    自動化したいけど、よくある面倒なパターン
    テスト対象
    サービス
    依存関係
    サービス
    テスト対象のAPI
    テスト対象
    サービス
    テスト対象のAPI テストダブル
    (API Mock)
    Karateを使えば、このような構成ができます
    これをどうするか?

    View full-size slide

  15. ⑥IDEサポート
    Copyright © Acroquest Technology Co., Ltd. All rights reserved. 15
    VS Code IntelliJ
    ※ Karate Labs 公式プラグイン(一部有償)
    https://www.karatelabs.io/vs-code https://www.karatelabs.io/intellij
    IDEのプラグインを利用することで、効率的なテストケース作成が可能

    View full-size slide

  16. One More
    Copyright © Acroquest Technology Co., Ltd. All rights reserved. 16
    Karateのテストシナリオは
    DSLのため、
    生成AIとの連携も効果的!
    自然言語のテキストや
    OpenAPIの定義などから、
    Karateのテストシナリオを
    自動生成することが可能!
    https://acro-engineer.hatenablog.com/entry/2023/08/30/110000

    View full-size slide

  17. これであなたも
    Karate道

    View full-size slide