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

マイクロサービスにおけるテスト自動化 with Karate / Microservices-Testing-Automation-with-Karate

マイクロサービスにおけるテスト自動化 with Karate / Microservices-Testing-Automation-with-Karate

システムテスト自動化カンファレンス2018

マイクロサービスにおけるテスト自動化 with Karate

Takanori Suzuki

December 08, 2018
Tweet

More Decks by Takanori Suzuki

Other Decks in Technology

Transcript

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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開発者が
    うれしいヤツ
    一目で
    分かりやすい

    View full-size slide

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

    View full-size slide

  29. ②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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  37. ⑥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

    View full-size slide

  38. さらに・・・
    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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide