Slide 1

Slide 1 text

1 Copyright © Acroquest Technology Co., Ltd. All rights reserved. マイクロサービスにおけるテスト自動化 with Karate 2018/12/08 Acroquest Technology Co., Ltd. 鈴木 貴典 システムテスト自動化カンファレンス 2018

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

Acroquestのミッション・ビジョン Copyright © Acroquest Technology Co., Ltd. All rights reserved. 3 テクノロジストチームとして ビジネスの革新的価値創出に挑戦する ビジョン Acroquestの創り出す技術で 地球を感動で進化させる ミッション

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

はじめに Copyright © Acroquest Technology Co., Ltd. All rights reserved. 5 ○:マイクロサービス × :マイクロサービシズ ○:Microservices × :Microservice システムアーキテクチャのひとつで、ソフトウェアアプリケーションを独立して 配置可能な小さなサービスとして開発し、それらを組み合わせて、ひとつの システムを実現する手法。もしくは、そうして開発されたシステム自体のこと。

Slide 6

Slide 6 text

アジェンダ Copyright © Acroquest Technology Co., Ltd. All rights reserved. 6 ① What is Karate? ② なぜ Karate を導入することに至ったか? ③ Karateを採用したポイント ④ Karate の高い利便性

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

空手?

Slide 9

Slide 9 text

出典:BABYMETAL - KARATE (OFFICIAL) - YouTube KARATE?

Slide 10

Slide 10 text

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 10 Karate Web-Services Testing Made Simple.

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

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 13 なぜ Karate を 導入することに至ったか?

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 16 マイクロサービスは 開発も大変だが、テストも大変 出典:A Netflix Guide to Microservices

Slide 17

Slide 17 text

課題だったこと Copyright © Acroquest Technology Co., Ltd. All rights reserved. 17 テストは自動化もしてパスしていたのに シナリオテストしたら、エラーが多発 サービスの依存関係が多く テストを自動化するのが困難 テストエンジニアが テスト自動化するのは結構大変

Slide 18

Slide 18 text

課題だったこと(①APIのシナリオテスト) Copyright © Acroquest Technology Co., Ltd. All rights reserved. 18 ○:API単体の テストはPASS テスト対象 サービス A ×:シナリオで 実行するとERROR テスト対象 サービス A B

Slide 19

Slide 19 text

課題だったこと(②サービスの依存関係) Copyright © Acroquest Technology Co., Ltd. All rights reserved. 19 テスト対象 サービス これは簡単 テスト対象 サービス サービスA サービスB サービスC 実際はこうなる(大変)

Slide 20

Slide 20 text

課題だったこと(③テスト自動化エンジニア不足) Copyright © Acroquest Technology Co., Ltd. All rights reserved. 20 テストスキルも 開発スキルも ある人ってそうは いないですよね?

Slide 21

Slide 21 text

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 21 APIの整合性を保つのって、 大変!

Slide 22

Slide 22 text

Karateを知ったキッカケ Copyright © Acroquest Technology Co., Ltd. All rights reserved. 22

Slide 23

Slide 23 text

Karateを採用したポイント Copyright © Acroquest Technology Co., Ltd. All rights reserved. 23 ③学習コストが低い • 直観的なテストケース記述 • テスト実行/エラー 確認の容易性 • 新人でもハマらず導入 ①シナリオテストが可能 • 連続したテストケース • APIの応答値の利用 ②DSLで記述できる • プログラマでなくても 作成できる • データとテストの分離

Slide 24

Slide 24 text

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 24 Karate の高い利便性

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

①シンプルなテストケース記述 ~シナリオの基本構成~ Copyright © Acroquest Technology Co., Ltd. All rights reserved. 26 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 27

Slide 27 text

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

Slide 28

Slide 28 text

①シンプルなテストケース記述 ~データ記述~ Copyright © Acroquest Technology Co., Ltd. All rights reserved. 28 # 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 29

Slide 29 text

①シンプルなテストケース記述 ~Fuzzy Matching~ Copyright © Acroquest Technology Co., Ltd. All rights reserved. 29 # 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 30

Slide 30 text

②HTTP関連の標準対応 Copyright © Acroquest Technology Co., Ltd. All rights reserved. 30 対象 コマンド 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 31

Slide 31 text

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

Slide 32

Slide 32 text

③プログラミング言語拡張 Copyright © Acroquest Technology Co., Ltd. All rights reserved. 32 * 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 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

④テストダブル Copyright © Acroquest Technology Co., Ltd. All rights reserved. 35 @ignore Feature: 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 36

Slide 36 text

④テストダブル Copyright © Acroquest Technology Co., Ltd. All rights reserved. 36 Cunsumer: APIを呼び出す側 Provider: APIを呼び出される側 Karateが、これらの代替、 もしくは、間に入って、 実行することができる

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

⑥E2E(End-to-End)テストでの利用 Copyright © Acroquest Technology Co., Ltd. All rights reserved. 38 https://twitter.com/ptrthomas/status/1046459965668388866 WebDriverを 利用しての ブラウザ実行も可能 (Se○○nium!?) シナリオを Karateの形式で記述 v0.9.0 New

Slide 39

Slide 39 text

さらに・・・ Copyright © Acroquest Technology Co., Ltd. All rights reserved. 39 ①REST-API/JSON 以外にも対応 • GraphQL • gRPC • WebSocket • バイナリリクエスト/レスポンス ②Karate UI • GUIで、ステップ実行/デバッグ可能 ③JUnit5サポート ④Dynamic Scenario Outline v0.9.0 New

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

Evolve the Earth with Emotion of Technology Copyright © Acroquest Technology Co., Ltd. All rights reserved. 41 Karate で あたなのテストも 楽 できるのでは?

Slide 42

Slide 42 text

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 42 一緒に先端を追及する仲間を募集しています!