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

人生がときめくAPIテスト自動化 with Karate / SparkingJoy-for...

人生がときめくAPIテスト自動化 with Karate / SparkingJoy-for-API-Testing-Automation-with-Karate

Acroquest Technology LTxRT

人生がときめくAPIテスト自動化 with Karate
Sparking Joy for API Testing Automation

Takanori Suzuki

May 16, 2019
Tweet

More Decks by Takanori Suzuki

Other Decks in Technology

Transcript

  1. 1 Copyright © Acroquest Technology Co., Ltd. All rights reserved.

    ⼈⽣がときめくAPIテスト⾃動化 with Karate ~ Sparking Joy for API Testing Automation ~ 2019/05/16 Acroquest Technology Co., Ltd. 鈴⽊ 貴典
  2. Copyright © Acroquest Technology Co., Ltd. All rights reserved. 2

    ⾃⼰紹介 n 所属 • Acroquest Technology Co., Ltd. n 主な業務分野 • システムアーキテクト • IoTサービス開発 • ビッグデータ処理プラットフォーム • サーバーレス・アーキテクチャ n バックグラウンド • エンタープライズ/ミッションクリティカル • SEPG/開発/マネジメント • Java/Python 鈴⽊ 貴典 シニアテクニカルアーキテクト Acro = 先端を quest = 探究する
  3. アジェンダ Copyright © Acroquest Technology Co., Ltd. All rights reserved.

    3 ① テスト⾃動化における課題 ② What is Karate︖ ③ Karate によるAPIテストの実施
  4. Copyright © Acroquest Technology Co., Ltd. All rights reserved. 5

    ⾃動化したくてもなかなかできていない もしくは コストがかかり過ぎている 本内容の ターゲット
  5. ⾃動化をしたくても、できない主な要因 Copyright © Acroquest Technology Co., Ltd. All rights reserved.

    6 No 要因 説明 1 Integration/UIの テストを作成する 難易度が⾼い • API単体ではなく、シナリオを構成することが必要 になる。 • E2E(End-to-End)や、複数サービスの連携を⾃ 動化するのは、環境(DBやファイルリソースな ど)などの連携やモック化も必要で、複雑になる。 • 複数のツールなどを組み合わせたり、⾃作するこ とが必要となる。 2 そもそも、テスト ⾃動化エンジニアがいない • テストシナリオも設計できて、それを⾃動化でき るテストエンジニアは少ない。 3 メンテナンスコストが ⾼い • 連携するコンポーネントの内、どこかが変わった ら、シナリオを変更する必要が出てくる。 • UIの変更に追随するのが⼤変で、⾃動化途中で挫 折してしまう。
  6. 世の中は API-First の時代へ Copyright © Acroquest Technology Co., Ltd. All

    rights reserved. 7 • マルチデバイス対応への ニーズ増加 • バックエンド側は、 REST-APIで呼び出す アーキテクチャが 当たり前になってきた
  7. 世の中は API-First の時代へ Copyright © Acroquest Technology Co., Ltd. All

    rights reserved. 8 • マイクロサービス アーキテクチャ採⽤増加 • システム間連携も REST-APIで実現 • API⾃体が サービスの仕様であり 重要性が⾼まってきた
  8. Copyright © Acroquest Technology Co., Ltd. All rights reserved. 9

    ⾃動化が必要なのは 分かっている。 でも、 できていない、 挫折してしまう。。。 そういった問題を どうにかしたい︕
  9. Copyright © Acroquest Technology Co., Ltd. All rights reserved. 11

    Karate Web-Services Testing Made Simple. • WebサービスAPIのテストを⾃動化する オープンソースのテストフレームワーク • BDD(Behavior Driven Development)に 属するもので、シナリオテストが可能 • Cucumberを元にしており、JavaVM上で 実⾏できるようにしたもの (v0.9より、Cucmber依存はなくなっている) • Garkin記法で、テストシナリオを記述
  10. Karate の強み Copyright © Acroquest Technology Co., Ltd. All rights

    reserved. 13 ③テストに必要な内容に 幅広く対応できる ①シナリオテストが可能 • 連続した処理のテストが可能で、API単発 ではなく、シナリオテストが実施ができる • JavaやJSと連携でき、関数の利⽤が可能で、 環境の初期化や⾮同期処理にも対応できる • シナリオの再利⽤などもでき、応⽤範囲が広い ②学習コストが低い • DSLによる直観的なテストケース記述 • テスト実⾏/エラー確認の容易性 • プログラマでなくても作成できる • 新⼈でもハマらず導⼊できた • テストダブル(モック)、性能テスト、UIテスト などにも対応 • REST-APIだけでく、ファイルアップロード、 GraphQL、gRPC、WebSocket などにも対応
  11. Copyright © Acroquest Technology Co., Ltd. All rights reserved. 14

    HTTP関連の 標準対応 負荷テスト との連携 シンプルな テストケース 記述 テスト ダブル End-to-End テスト プログラミング ⾔語拡張
  12. Copyright © Acroquest Technology Co., Ltd. All rights reserved. 15

    ThoughtWorks Technology Radar GitHub Stars https://star-history.t9t.io/#intuit/karate https://www.thoughtworks.com/radar/languages-and-frameworks/karate 右肩上がりで 増加中 ASSESSレベルに 登場
  13. Karate vs REST-assured Copyright © Acroquest Technology Co., Ltd. All

    rights reserved. 16 No ⽐較ポイント Karate REST-assured 1 Plain Text × (要コンパイル) 2 Parallel Execution △ (Partial) 3 Data Driven Testing (built-in) × (要 TestNG etc.) 4 Environment Switching(Profile) (built-in) × 5 Match full payload in one step × 6 Update JSON payload / object × https://www.slideshare.net/intuit_india/karate-for-complex-webservice-api-testing-by-peter-thomas
  14. Karate vs Cucumber Copyright © Acroquest Technology Co., Ltd. All

    rights reserved. 17 No ⽐較ポイント Karate Cucumber 1 Step Definitions built-in, no Java code needed × 2 Re-Use Feature files from other Features × 3 Dynamic Data-Driven Testing × 4 Parallel Test Execution and Reporting × 5 Option to run routines only once per Feature × https://www.slideshare.net/intuit_india/karate-for-complex-webservice-api-testing-by-peter-thomas
  15. Karateの主な機能 Copyright © Acroquest Technology Co., Ltd. All rights reserved.

    19 No 機能 概要 ① シンプルなテストケース記述 • シナリオ記述 • テスト実⾏結果の確認 • 効率の良いデータ指定/記述 • Fuzzy Matching/Assertion ② HTTP関連の標準対応 • HTTPに対応した組み込み パラメータの活⽤ ③ プログラミング⾔語拡張 • JavaScriptの関数の利⽤ • Javaコードの呼び出し ④ テストダブル • サーバー側のモック化 ※SAPでのフロントエンド開発時に、 バックエンドのモックにも利⽤できる。 ⑤ 負荷テスト連携 • Gatlingとの連係 ⑥ UIテスト • KarateDriver(WebDriver)による UI操作⾃動化/キャプチャ
  16. ①シンプルなテストケース記述 〜シナリオの基本構成〜 Copyright © Acroquest Technology Co., Ltd. All rights

    reserved. 20 Feature: sample karate test script Background: * url 'https://jsonplaceholder.typicode.com' Scenario: get all users and then get the first user by id Given path 'users' When method get Then status 200 And assert response.size() === 10 And assert response[0].id == 1 And match response[0] contains { id: 1, name: "Leanne Graham" } https://jsonplaceholder.typicode.com/users に対して GETメソッド でコールして HTTPステータス 200 であることをテスト レスポンスの内容をテスト
  17. ①シンプルなテストケース記述 〜テスト実⾏結果レポート〜 Copyright © Acroquest Technology Co., Ltd. All rights

    reserved. 21 ステップごとに 実⾏結果が分かる 実⾏時のデータの 内容も分かる
  18. ①シンプルなテストケース記述 〜データ記述〜 Copyright © Acroquest Technology Co., Ltd. All rights

    reserved. 22 # MultilineでのJSON指定 * def jsonData = """ [ {name: 'Bob‘, age: 2}, {name: 'Wild', age: 4}, {name: 'Nyan', age: 3} ] """ * match jsonData == [ {name:'Bob', age:2}, {name:'Wild', age:4}, {name:'Nyan', age:3}] # table指定 * table jsonAsTable | name | age | | 'Bob' | 2 | | 'Wild' | 4 | | 'Nyan' | 3 | * match jsonAsTable == [ {name:'Bob', age:2}, {name:'Wild', age:4}, {name:'Nyan', age:3}] Java開発者が うれしいヤツ ⼀⽬で 分かりやすい
  19. ①シンプルなテストケース記述 〜Fuzzy Matching〜 Copyright © Acroquest Technology Co., Ltd. All

    rights reserved. 23 # present / notpresent * def test = {id: '001’, name: 'Bob'} * match test == {id: '001’, name: '#present’, age: '#notpresent'} # number * def test = {foo: 1} * match test == {foo: '#number'} # string * def test = {foo: 'test'} * match test == {foo: '#string'} # boolean * def test = {foo: true} * match test == {foo: '#boolean'} パラメータの有無判定 パラメータの型判定
  20. ②HTTP関連の標準対応 Copyright © Acroquest Technology Co., Ltd. All rights reserved.

    24 対象 コマンド HTTP url Path method status Request param header cookie form multipart Response responseStatus responseHeaders responseCookies responseTime responseTimeStamp responseBytes HTTP(REST)のテストで 必要となる要素には ほとんど標準で対応している テストケース作成の効率が良い︕ * header Authorization = ‘xxxxxxxxxx’ Given path 'headers', token
  21. ③プログラミング⾔語拡張 Copyright © Acroquest Technology Co., Ltd. All rights reserved.

    25 * def greeter = function(name){ return 'hello ' + name } * assert greeter('Bob') == 'hello Bob' JavaScript が使える︕ 何か複雑な処理や判定が必要になる場合でも 独⾃関数で対応することが可能になる
  22. ③プログラミング⾔語拡張 Copyright © Acroquest Technology Co., Ltd. All rights reserved.

    26 * 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 のクラスも実⾏できる︕ プロダクトコード/テストコードのクラスなども テストで使うことができ、効率が上がる
  23. ④テストダブル Copyright © Acroquest Technology Co., Ltd. All rights reserved.

    27 テスト対象 サービス 依存関係 サービス ⾃動化したいけど、よくある⾯倒なパターン テスト対象のAPI これをどうするか︖
  24. ④テストダブル Copyright © Acroquest Technology Co., Ltd. All rights reserved.

    28 テスト対象 サービス 解決できます。そう、Karateならね。 テスト対象のAPI こうできるんです︕ (テストダブル)
  25. ④テストダブル Copyright © Acroquest Technology Co., Ltd. All rights reserved.

    29 Feature: Test-Double Background: * def uuid = function(){ return java.util.UUID.randomUUID() + '' } Scenario: pathMatches('/v1/cats') * def responseStatus = 201 * def response = { id: '#(uuid())', name: 'Billie' } Scenario: pathMatches('/v1/cats/{uuid}') * def response = { id: '#(uuid())', name: 'Billie' } Scenario: pathMatches('/v1/dogs') * def responseStatus = 201 * def response = { id: '#(uuid())', name: 'Dummy' } Scenario: pathMatches('/v1/dogs/{uuid}') * def response = { id: '#(uuid())', name: 'Dummy' } テストダブルとして動作させる場合のKarateシナリオ
  26. ⑤負荷テスト連携 Copyright © Acroquest Technology Co., Ltd. All rights reserved.

    30 Karate Gatling Gatlingと連携して 負荷テストの実⾏ができる Karateの シナリオファイルを 再利⽤可能
  27. ⑥UIテスト Copyright © Acroquest Technology Co., Ltd. All rights reserved.

    31 https://twitter.com/ptrthomas/status/1046459965668388866 KarateDriver を 利⽤しての ブラウザ実⾏も可能
  28. ⑥UIテスト Copyright © Acroquest Technology Co., Ltd. All rights reserved.

    32 Feature: browser automation Background: * configure driver = { type: 'chrome' } # * configure driver = { type: 'chromedriver' } # * configure driver = { type: 'geckodriver' } # * configure driver = { type: 'safaridriver' } # * configure driver = { type: 'mswebdriver' } Scenario: Google search Given driver 'https://google.com’ And driver.input("input[name=q]", 'karate dsl') When driver.submit("input[name=btnI]") Then match driver.location == 'https://github.com/intuit/karate' * def bytes = driver.screenshot() * eval karate.embed(bytes, 'image/png') KarateDriverを利⽤したUIテスト
  29. Karateによるテスト⾃動化の効率化 Copyright © Acroquest Technology Co., Ltd. All rights reserved.

    33 ⾊々なツールを組み合わせて 使いこなす 単⼀のツールで 幅広く対応
  30. 参考 Copyright © Acroquest Technology Co., Ltd. All rights reserved.

    34 1. Karate for Complex Web-Service API Testing (Peter Thomas) • https://www.slideshare.net/intuit_india/karate-for-complex-webservice-api-testing-by-peter-thomas 2. Karate - Web-Service API Testing Made Simple (Peter Thomas) • https://www.slideshare.net/VodqaBLR/karate-webservice-api-testing-made-simple 3. Karate: RESTful Testing (SreeCharan Shroff) • https://www.youtube.com/watch?v=LJJmSXJJTaY 4. Webinar on Micro-services Testing With Karate | HackerEarth Webinar • https://www.youtube.com/watch?v=YWK4J3lhFw4 5. マイクロサービスにおけるテスト⾃動化 with Karate (Takanori Suzuki) • https://www.slideshare.net/takanorig/microservices-test-automation-with-karate/
  31. Evolve the Earth with Emotion of Technology Copyright © Acroquest

    Technology Co., Ltd. All rights reserved. 35 Sparking Joy for API Testing Automation with Karate !