Slide 1

Slide 1 text

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. 鈴⽊ 貴典

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 4 テスト⾃動化における 課題

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 10 What is Karate?

Slide 11

Slide 11 text

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記法で、テストシナリオを記述

Slide 12

Slide 12 text

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 12 Karate テストシナリオ

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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レベルに 登場

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 18 Karate による APIテストの実施

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

①シンプルなテストケース記述 〜シナリオの基本構成〜 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 であることをテスト レスポンスの内容をテスト

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

①シンプルなテストケース記述 〜データ記述〜 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開発者が うれしいヤツ ⼀⽬で 分かりやすい

Slide 23

Slide 23 text

①シンプルなテストケース記述 〜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'} パラメータの有無判定 パラメータの型判定

Slide 24

Slide 24 text

②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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

③プログラミング⾔語拡張 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 のクラスも実⾏できる︕ プロダクトコード/テストコードのクラスなども テストで使うことができ、効率が上がる

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

④テストダブル 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シナリオ

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

⑥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テスト

Slide 33

Slide 33 text

Karateによるテスト⾃動化の効率化 Copyright © Acroquest Technology Co., Ltd. All rights reserved. 33 ⾊々なツールを組み合わせて 使いこなす 単⼀のツールで 幅広く対応

Slide 34

Slide 34 text

参考 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/

Slide 35

Slide 35 text

Evolve the Earth with Emotion of Technology Copyright © Acroquest Technology Co., Ltd. All rights reserved. 35 Sparking Joy for API Testing Automation with Karate !