システムテスト自動化カンファレンス2018
マイクロサービスにおけるテスト自動化 with Karate
1Copyright © Acroquest Technology Co., Ltd. All rights reserved.マイクロサービスにおけるテスト自動化with Karate2018/12/08Acroquest Technology Co., Ltd.鈴木 貴典システムテスト自動化カンファレンス 2018
View Slide
Copyright © Acroquest Technology Co., Ltd. All rights reserved. 2自己紹介◼ 所属• Acroquest Technology Co., Ltd.◼ 主な業務分野• システムアーキテクト• IoTサービス開発• ビッグデータ処理プラットフォーム• サーバーレス・アーキテクチャ◼ バックグラウンド• エンタープライズ/ミッションクリティカル• SEPG/開発/マネジメント• Java/Python鈴木 貴典シニアテクニカルアーキテクトAcro = 先端をquest = 探究する
Acroquestのミッション・ビジョンCopyright © Acroquest Technology Co., Ltd. All rights reserved. 3テクノロジストチームとしてビジネスの革新的価値創出に挑戦するビジョンAcroquestの創り出す技術で地球を感動で進化させるミッション
「働きがいのある会社(GPTW)」ランキング(従業員25~99人部門)1位 を3回 受賞1位 1位 1位
はじめにCopyright © Acroquest Technology Co., Ltd. All rights reserved. 5○:マイクロサービス× :マイクロサービシズ○:Microservices× :Microserviceシステムアーキテクチャのひとつで、ソフトウェアアプリケーションを独立して配置可能な小さなサービスとして開発し、それらを組み合わせて、ひとつのシステムを実現する手法。もしくは、そうして開発されたシステム自体のこと。
アジェンダCopyright © Acroquest Technology Co., Ltd. All rights reserved. 6① What is Karate?② なぜ Karate を導入することに至ったか?③ Karateを採用したポイント④ Karate の高い利便性
Copyright © Acroquest Technology Co., Ltd. All rights reserved. 7What is Karate?
空手?
出典:BABYMETAL - KARATE (OFFICIAL) - YouTubeKARATE?
Copyright © Acroquest Technology Co., Ltd. All rights reserved. 10KarateWeb-Services Testing Made Simple.
Copyright © Acroquest Technology Co., Ltd. All rights reserved. 11KarateWeb-Services Testing Made Simple.• WebサービスAPIのテストを自動化するオープンソースのテストフレームワーク• BDD(Behavior Driven Development)に属するもので、シナリオテストが可能• Cucumberを元にしており、JavaVM上で実行できるようにしたもの(v0.9より、Cucmber依存はなくなっている)• Garkin記法で、テストシナリオを記述
Copyright © Acroquest Technology Co., Ltd. All rights reserved. 12Karate テストシナリオ
Copyright © Acroquest Technology Co., Ltd. All rights reserved. 13なぜ Karate を導入することに至ったか?
世の中は API-First の時代へCopyright © Acroquest Technology Co., Ltd. All rights reserved. 14• マルチデバイス対応へのニーズ増加• バックエンド側は、REST-APIで呼び出すアーキテクチャが当たり前になってきた
世の中は API-First の時代へCopyright © Acroquest Technology Co., Ltd. All rights reserved. 15• マイクロサービスアーキテクチャ採用増加• システム間連携もREST-APIで実現• API自体がサービスの仕様であり重要性が高まってきた
Copyright © Acroquest Technology Co., Ltd. All rights reserved. 16マイクロサービスは開発も大変だが、テストも大変出典:A Netflix Guide to Microservices
課題だったことCopyright © Acroquest Technology Co., Ltd. All rights reserved. 17テストは自動化もしてパスしていたのにシナリオテストしたら、エラーが多発サービスの依存関係が多くテストを自動化するのが困難テストエンジニアがテスト自動化するのは結構大変
課題だったこと(①APIのシナリオテスト)Copyright © Acroquest Technology Co., Ltd. All rights reserved. 18○:API単体のテストはPASSテスト対象サービスA×:シナリオで実行するとERRORテスト対象サービスAB
課題だったこと(②サービスの依存関係)Copyright © Acroquest Technology Co., Ltd. All rights reserved. 19テスト対象サービスこれは簡単テスト対象サービスサービスAサービスBサービスC実際はこうなる(大変)
課題だったこと(③テスト自動化エンジニア不足)Copyright © Acroquest Technology Co., Ltd. All rights reserved. 20テストスキルも開発スキルもある人ってそうはいないですよね?
Copyright © Acroquest Technology Co., Ltd. All rights reserved. 21APIの整合性を保つのって、大変!
Karateを知ったキッカケCopyright © Acroquest Technology Co., Ltd. All rights reserved. 22
Karateを採用したポイントCopyright © Acroquest Technology Co., Ltd. All rights reserved. 23③学習コストが低い • 直観的なテストケース記述• テスト実行/エラー確認の容易性• 新人でもハマらず導入①シナリオテストが可能 • 連続したテストケース• APIの応答値の利用②DSLで記述できる • プログラマでなくても作成できる• データとテストの分離
Copyright © Acroquest Technology Co., Ltd. All rights reserved. 24Karate の高い利便性
Copyright © Acroquest Technology Co., Ltd. All rights reserved. 25HTTP関連の標準対応負荷テストとの連携シンプルなテストケース記述テストダブルEnd-to-Endテストプログラミング言語拡張
①シンプルなテストケース記述~シナリオの基本構成~Copyright © Acroquest Technology Co., Ltd. All rights reserved. 26Feature: sample karate test scriptBackground:* url 'https://jsonplaceholder.typicode.com'Scenario: get all users and then get the first user by idGiven path 'users'When method getThen status 200And assert response.size() === 10And assert response[0].id == 1And match response[0] contains { id: 1, name: "Leanne Graham" }https://jsonplaceholder.typicode.com/users に対してGETメソッド でコールしてHTTPステータス 200 であることをテストレスポンスの内容をテスト
①シンプルなテストケース記述~テスト実行結果レポート~Copyright © Acroquest Technology Co., Ltd. All rights reserved. 27ステップごとに実行結果が分かる実行時のデータの内容も分かる
①シンプルなテストケース記述~データ記述~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開発者がうれしいヤツ一目で分かりやすい
①シンプルなテストケース記述~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'}パラメータの有無判定 パラメータの型判定
②HTTP関連の標準対応Copyright © Acroquest Technology Co., Ltd. All rights reserved. 30対象 コマンドHTTP urlPathmethodstatusRequest paramheadercookieformmultipartResponse responseStatusresponseHeadersresponseCookiesresponseTimeresponseTimeStampresponseBytesHTTP(REST)のテストで必要となる要素にはほとんど標準で対応しているテストケース作成の効率が良い!* header Authorization = ‘xxxxxxxxxx’Given path 'headers', token
③プログラミング言語拡張Copyright © Acroquest Technology Co., Ltd. All rights reserved. 31* def greeter = function(name){ return 'hello ' + name }* assert greeter('Bob') == 'hello Bob'JavaScript が使える!何か複雑な処理や判定が必要になる場合でも独自関数で対応することが可能になる
③プログラミング言語拡張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") == 1482550761081Java のクラスも実行できる!プロダクトコード/テストコードのクラスなどもテストで使うことができ、効率が上がる
④テストダブルCopyright © Acroquest Technology Co., Ltd. All rights reserved. 33テスト対象サービス依存関係サービス自動化したいけど、よくある面倒なパターンテスト対象のAPI これをどうするか?
④テストダブルCopyright © Acroquest Technology Co., Ltd. All rights reserved. 34テスト対象サービス解決できます。そう、Karateならね。テスト対象のAPI こうできるんです!(テストダブル)
④テストダブルCopyright © Acroquest Technology Co., Ltd. All rights reserved. 35@ignoreFeature: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シナリオ
④テストダブルCopyright © Acroquest Technology Co., Ltd. All rights reserved. 36Cunsumer:APIを呼び出す側Provider:APIを呼び出される側Karateが、これらの代替、もしくは、間に入って、実行することができる
⑤負荷テスト連携Copyright © Acroquest Technology Co., Ltd. All rights reserved. 37Karate GatlingGatlingと連携して負荷テストの実行ができるKarateのシナリオファイルを再利用可能
⑥E2E(End-to-End)テストでの利用Copyright © Acroquest Technology Co., Ltd. All rights reserved. 38https://twitter.com/ptrthomas/status/1046459965668388866WebDriverを利用してのブラウザ実行も可能(Se○○nium!?)シナリオをKarateの形式で記述v0.9.0New
さらに・・・Copyright © Acroquest Technology Co., Ltd. All rights reserved. 39①REST-API/JSON 以外にも対応• GraphQL• gRPC• WebSocket• バイナリリクエスト/レスポンス②Karate UI• GUIで、ステップ実行/デバッグ可能③JUnit5サポート④Dynamic Scenario Outlinev0.9.0New
Karateによるテスト自動化の変化Copyright © Acroquest Technology Co., Ltd. All rights reserved. 40色々なツールを組み合わせて使いこなす単一のツールで幅広く対応
Evolve the Earth with Emotion of TechnologyCopyright © Acroquest Technology Co., Ltd. All rights reserved. 41Karate であたなのテストも 楽 できるのでは?
Copyright © Acroquest Technology Co., Ltd. All rights reserved. 42一緒に先端を追及する仲間を募集しています!