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選!開発者が語る各ツールの特徴と魅力
  2. Copyright © Acroquest Technology Co., Ltd. All rights reserved. 2

    自己紹介 ◼ 所属 • Acroquest Technology 株式会社 ◼ 主な業務分野 • システムアーキテクト • クラウドサービス開発 • IoT/AI 鈴木 貴典 シニアテクニカルアーキテクト Acro = 先端を quest = 探究する
  3. Karateは、テスト自動化の対応範囲の広さが魅力 Copyright © Acroquest Technology Co., Ltd. All rights reserved.

    4 Unified Test Automation Platform ① APIテスト ② API Mock(テストダブル) ③ UIテスト ④ 性能テスト
  4. Karateのテストシナリオ Copyright © Acroquest Technology Co., Ltd. All rights reserved.

    5 ⚫ Gherkin記法で テストケースを記述 ⚫ BDD(Behavior Driven Development)の概念で、 シナリオテストが可能 ⚫ テスト構造が分かりやすく、 内容の理解やテストケース のメンテナンスが容易
  5. 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シナリオをまとめて実行
  6. 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との 連係 ③ 学習コストが 低い ⚫ 直感的なテストケースの 記述 • 新人でもハマらず 導入できている事例多数 ⚫ プログラマでなくても 作成できる ⚫ デバッグ可能 ⚫ 分かりやすい 結果レポート
  7. Karateの主な機能 Copyright © Acroquest Technology Co., Ltd. All rights reserved.

    8 ① シンプルな テストケース記述 ② ローコード スキーマ ③ データ駆動テスト 対応 ④ プログラミング 言語拡張 ⑤ テストダブル ⑥ IDEサポート • シナリオ定義/シナリオ再利用 • 分かりやすいテスト実行 レポート • HTTP標準サポート • Assertion • Fuzzy Matching • テストデータと テストシナリオの分離 • Loop処理 • JavaScript関数の呼び出し • Javaコードの呼び出し • APIのモック化 • VS Code プラグイン • IntelliJ プラグイン • デバッグなども可能
  8. ①シンプルなテストケース記述 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処理
  9. ①シンプルなテストケース記述 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の呼び出しができる
  10. ②ローコード・スキーマ 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
  11. ③データ駆動テスト対応 Copyright © Acroquest Technology Co., Ltd. All rights reserved.

    12 Scenario Outline: データ駆動テストーサンプルシナリオ Given path 'api/v1/circuits/<name>.json' When method get Then match $.MRData.CircuitTable.Circuits[0].Location.country == '<country>’ Examples: | name | country | | monza | Italy | | spa | Belgium | | sepang | Malaysia | テーブル形式で 複数データを指定 動的パラメータ
  12. ④プログラミング言語拡張 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 のクラスも実行できる! 何か複雑な処理や判定が必要になる場合でも、独自関数で対応可能
  13. ⑤テストダブル Copyright © Acroquest Technology Co., Ltd. All rights reserved.

    14 自動化したいけど、よくある面倒なパターン テスト対象 サービス 依存関係 サービス テスト対象のAPI テスト対象 サービス テスト対象のAPI テストダブル (API Mock) Karateを使えば、このような構成ができます これをどうするか?
  14. ⑥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のプラグインを利用することで、効率的なテストケース作成が可能
  15. 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