SlideShare a Scribd company logo
1Copyright © Acroquest Technology Co., Ltd. All rights reserved.
⼈⽣がときめくAPIテスト⾃動化
with Karate
~ Sparking Joy for API Testing Automation ~
2019/05/16
Acroquest Technology Co., Ltd.
鈴⽊ 貴典
Copyright © Acroquest Technology Co., Ltd. All rights reserved.
2
⾃⼰紹介
n 所属
• Acroquest Technology Co., Ltd.
n 主な業務分野
• システムアーキテクト
• IoTサービス開発
• ビッグデータ処理プラットフォーム
• サーバーレス・アーキテクチャ
n バックグラウンド
• エンタープライズ/ミッションクリティカル
• SEPG/開発/マネジメント
• Java/Python
鈴⽊ 貴典
シニアテクニカルアーキテクト
Acro = 先端を
quest = 探究する
アジェンダ
Copyright © Acroquest Technology Co., Ltd. All rights reserved.
3
① テスト⾃動化における課題
② What is Karate︖
③ Karate によるAPIテストの実施
Copyright © Acroquest Technology Co., Ltd. All rights reserved.
4
テスト⾃動化における
課題
Copyright © Acroquest Technology Co., Ltd. All rights reserved.
5
⾃動化したくてもなかなかできていない
もしくは
コストがかかり過ぎている
本内容の
ターゲット
⾃動化をしたくても、できない主な要因
Copyright © Acroquest Technology Co., Ltd. All rights reserved.
6
No 要因 説明
1 Integration/UIの
テストを作成する
難易度が⾼い
• API単体ではなく、シナリオを構成することが必要
になる。
• E2E(End-to-End)や、複数サービスの連携を⾃
動化するのは、環境(DBやファイルリソースな
ど)などの連携やモック化も必要で、複雑になる。
• 複数のツールなどを組み合わせたり、⾃作するこ
とが必要となる。
2 そもそも、テスト
⾃動化エンジニアがいない
• テストシナリオも設計できて、それを⾃動化でき
るテストエンジニアは少ない。
3 メンテナンスコストが
⾼い
• 連携するコンポーネントの内、どこかが変わった
ら、シナリオを変更する必要が出てくる。
• UIの変更に追随するのが⼤変で、⾃動化途中で挫
折してしまう。
世の中は API-First の時代へ
Copyright © Acroquest Technology Co., Ltd. All rights reserved.
7
• マルチデバイス対応への
ニーズ増加
• バックエンド側は、
REST-APIで呼び出す
アーキテクチャが
当たり前になってきた
世の中は API-First の時代へ
Copyright © Acroquest Technology Co., Ltd. All rights reserved.
8
• マイクロサービス
アーキテクチャ採⽤増加
• システム間連携も
REST-APIで実現
• API⾃体が
サービスの仕様であり
重要性が⾼まってきた
Copyright © Acroquest Technology Co., Ltd. All rights reserved.
9
⾃動化が必要なのは
分かっている。
でも、
できていない、
挫折してしまう。。。
そういった問題を
どうにかしたい︕
Copyright © Acroquest Technology Co., Ltd. All rights reserved.
10
What is Karate?
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記法で、テストシナリオを記述
Copyright © Acroquest Technology Co., Ltd. All rights reserved.
12
Karate テストシナリオ
Karate の強み
Copyright © Acroquest Technology Co., Ltd. All rights reserved.
13
③テストに必要な内容に
幅広く対応できる
①シナリオテストが可能 • 連続した処理のテストが可能で、API単発
ではなく、シナリオテストが実施ができる
• JavaやJSと連携でき、関数の利⽤が可能で、
環境の初期化や⾮同期処理にも対応できる
• シナリオの再利⽤などもでき、応⽤範囲が広い
②学習コストが低い • DSLによる直観的なテストケース記述
• テスト実⾏/エラー確認の容易性
• プログラマでなくても作成できる
• 新⼈でもハマらず導⼊できた
• テストダブル(モック)、性能テスト、UIテスト
などにも対応
• REST-APIだけでく、ファイルアップロード、
GraphQL、gRPC、WebSocket などにも対応
Copyright © Acroquest Technology Co., Ltd. All rights reserved.
14
HTTP関連の
標準対応
負荷テスト
との連携
シンプルな
テストケース
記述
テスト
ダブル
End-to-End
テスト
プログラミング
⾔語拡張
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レベルに
登場
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
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
Copyright © Acroquest Technology Co., Ltd. All rights reserved.
18
Karate による
APIテストの実施
Karateの主な機能
Copyright © Acroquest Technology Co., Ltd. All rights reserved.
19
No 機能 概要
① シンプルなテストケース記述 • シナリオ記述
• テスト実⾏結果の確認
• 効率の良いデータ指定/記述
• Fuzzy Matching/Assertion
② HTTP関連の標準対応 • HTTPに対応した組み込み
パラメータの活⽤
③ プログラミング⾔語拡張 • JavaScriptの関数の利⽤
• Javaコードの呼び出し
④ テストダブル • サーバー側のモック化
※SAPでのフロントエンド開発時に、
バックエンドのモックにも利⽤できる。
⑤ 負荷テスト連携 • Gatlingとの連係
⑥ UIテスト • KarateDriver(WebDriver)による
UI操作⾃動化/キャプチャ
①シンプルなテストケース記述
〜シナリオの基本構成〜
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 であることをテスト
レスポンスの内容をテスト
①シンプルなテストケース記述
〜テスト実⾏結果レポート〜
Copyright © Acroquest Technology Co., Ltd. All rights reserved.
21
ステップごとに
実⾏結果が分かる
実⾏時のデータの
内容も分かる
①シンプルなテストケース記述
〜データ記述〜
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開発者が
うれしいヤツ
⼀⽬で
分かりやすい
①シンプルなテストケース記述
〜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'}
パラメータの有無判定 パラメータの型判定
②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
③プログラミング⾔語拡張
Copyright © Acroquest Technology Co., Ltd. All rights reserved.
25
* def greeter = function(name){ return 'hello ' + name }
* assert greeter('Bob') == 'hello Bob'
JavaScript が使える︕
何か複雑な処理や判定が必要になる場合でも
独⾃関数で対応することが可能になる
③プログラミング⾔語拡張
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 のクラスも実⾏できる︕
プロダクトコード/テストコードのクラスなども
テストで使うことができ、効率が上がる
④テストダブル
Copyright © Acroquest Technology Co., Ltd. All rights reserved.
27
テスト対象
サービス
依存関係
サービス
⾃動化したいけど、よくある⾯倒なパターン
テスト対象のAPI これをどうするか︖
④テストダブル
Copyright © Acroquest Technology Co., Ltd. All rights reserved.
28
テスト対象
サービス
解決できます。そう、Karateならね。
テスト対象のAPI こうできるんです︕
(テストダブル)
④テストダブル
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シナリオ
⑤負荷テスト連携
Copyright © Acroquest Technology Co., Ltd. All rights reserved.
30
Karate Gatling
Gatlingと連携して
負荷テストの実⾏ができる
Karateの
シナリオファイルを
再利⽤可能
⑥UIテスト
Copyright © Acroquest Technology Co., Ltd. All rights reserved.
31
https://twitter.com/ptrthomas/status/1046459965668388866
KarateDriver を
利⽤しての
ブラウザ実⾏も可能
⑥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テスト
Karateによるテスト⾃動化の効率化
Copyright © Acroquest Technology Co., Ltd. All rights reserved.
33
⾊々なツールを組み合わせて
使いこなす
単⼀のツールで
幅広く対応
参考
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/
Evolve	the	Earth	with	Emotion	of	Technology
Copyright © Acroquest Technology Co., Ltd. All rights reserved.
35
Sparking Joy
for API Testing Automation
with Karate !

More Related Content

PDF
MQTTとAMQPと.NET
PDF
Javaのログ出力: 道具と考え方
PDF
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
PDF
ドメイン駆動設計サンプルコードの徹底解説
PDF
コンテナの作り方「Dockerは裏方で何をしているのか?」
PPTX
世界一わかりやすいClean Architecture
PDF
Apache Airflow 概要(Airflowの基礎を学ぶハンズオンワークショップ 発表資料)
PDF
PostgreSQLアンチパターン
MQTTとAMQPと.NET
Javaのログ出力: 道具と考え方
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ドメイン駆動設計サンプルコードの徹底解説
コンテナの作り方「Dockerは裏方で何をしているのか?」
世界一わかりやすいClean Architecture
Apache Airflow 概要(Airflowの基礎を学ぶハンズオンワークショップ 発表資料)
PostgreSQLアンチパターン

What's hot (20)

PDF
イミュータブルデータモデル(世代編)
PDF
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
PDF
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
PDF
Webアプリを並行開発する際のマイグレーション戦略
PPTX
本当は恐ろしい分散システムの話
PDF
こんなに使える!今どきのAPIドキュメンテーションツール
PPTX
MongoDBが遅いときの切り分け方法
PDF
こわくない Git
PDF
DockerとPodmanの比較
PDF
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022
PDF
イミュータブルデータモデル(入門編)
PDF
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
PDF
Pythonによる黒魔術入門
PDF
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
PDF
Dockerからcontainerdへの移行
PDF
Unified JVM Logging
PDF
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割
PDF
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PDF
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
PDF
Dockerfile を書くためのベストプラクティス解説編
イミュータブルデータモデル(世代編)
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
Webアプリを並行開発する際のマイグレーション戦略
本当は恐ろしい分散システムの話
こんなに使える!今どきのAPIドキュメンテーションツール
MongoDBが遅いときの切り分け方法
こわくない Git
DockerとPodmanの比較
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022
イミュータブルデータモデル(入門編)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Pythonによる黒魔術入門
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
Dockerからcontainerdへの移行
Unified JVM Logging
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
Dockerfile を書くためのベストプラクティス解説編
Ad

Similar to 人生がときめくAPIテスト自動化 with Karate (20)

PDF
Karateによる UI Test Automation 革命
PDF
React Native GUIDE
PDF
インメモリーで超高速処理を実現する場合のカギ
PDF
Indy(Invokedynamic) and Bytecode DSL and Brainf*ck
PDF
マイクロサービスにおけるテスト自動化 with Karate
PDF
グラフデータベースNeo4Jでアセットダウンロードの構成管理と最適化
PPTX
オタク×Node.js勉強会
PDF
Kanazawa.js.Next
PDF
Ingest node scripting_deep_dive
PDF
XML-RPC : Pythonが「電池付属」と呼ばれる理由
PDF
関西Php勉強会のlimeの話
PDF
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
PDF
2015 0228 OpenStack swift; GMO Internet Services
PDF
ネットワーク自動化、なに使う? ~自動化ツール紹介~(2017/08/18追加開催)
PDF
ネットワーク自動化、なに使う? ~自動化ツール紹介~ (2017/07/21開催)
PDF
20180109 titech lecture_ishizaki_public
PDF
Uniform indexing load with cluster reroute api
PDF
Gradleどうでしょう
PDF
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
PDF
20211209 lt runtime_field
Karateによる UI Test Automation 革命
React Native GUIDE
インメモリーで超高速処理を実現する場合のカギ
Indy(Invokedynamic) and Bytecode DSL and Brainf*ck
マイクロサービスにおけるテスト自動化 with Karate
グラフデータベースNeo4Jでアセットダウンロードの構成管理と最適化
オタク×Node.js勉強会
Kanazawa.js.Next
Ingest node scripting_deep_dive
XML-RPC : Pythonが「電池付属」と呼ばれる理由
関西Php勉強会のlimeの話
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
2015 0228 OpenStack swift; GMO Internet Services
ネットワーク自動化、なに使う? ~自動化ツール紹介~(2017/08/18追加開催)
ネットワーク自動化、なに使う? ~自動化ツール紹介~ (2017/07/21開催)
20180109 titech lecture_ishizaki_public
Uniform indexing load with cluster reroute api
Gradleどうでしょう
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
20211209 lt runtime_field
Ad

More from Takanori Suzuki (8)

PDF
SORACOM S+Cameraを利用して在庫チェックをやってみた
PDF
ServerlessConf Tokyo2018 サーバーレスなシステムのがんばらない運用監視
PDF
IoT時代におけるストリームデータ処理と急成長の Apache Flink
PDF
デブサミ2014-Stormで実現するビッグデータのリアルタイム処理プラットフォーム ~ストリームデータ処理から機械学習まで~
PDF
SQiP2012 - 質問表の活用によるプロジェクトの早期リスク検出
DOC
5WCSQ(CFP) - Quality Improvement by the Real-Time Detection of the Problems
DOC
5WCSQ(CFP) - Quality Improvement by the Real-Time Detection of the Problems
PDF
5WCSQ - Quality Improvement by the Real-Time Detection of the Problems
SORACOM S+Cameraを利用して在庫チェックをやってみた
ServerlessConf Tokyo2018 サーバーレスなシステムのがんばらない運用監視
IoT時代におけるストリームデータ処理と急成長の Apache Flink
デブサミ2014-Stormで実現するビッグデータのリアルタイム処理プラットフォーム ~ストリームデータ処理から機械学習まで~
SQiP2012 - 質問表の活用によるプロジェクトの早期リスク検出
5WCSQ(CFP) - Quality Improvement by the Real-Time Detection of the Problems
5WCSQ(CFP) - Quality Improvement by the Real-Time Detection of the Problems
5WCSQ - Quality Improvement by the Real-Time Detection of the Problems

人生がときめくAPIテスト自動化 with Karate

  • 1. 1Copyright © 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. 4 テスト⾃動化における 課題
  • 5. Copyright © Acroquest Technology Co., Ltd. All rights reserved. 5 ⾃動化したくてもなかなかできていない もしくは コストがかかり過ぎている 本内容の ターゲット
  • 6. ⾃動化をしたくても、できない主な要因 Copyright © Acroquest Technology Co., Ltd. All rights reserved. 6 No 要因 説明 1 Integration/UIの テストを作成する 難易度が⾼い • API単体ではなく、シナリオを構成することが必要 になる。 • E2E(End-to-End)や、複数サービスの連携を⾃ 動化するのは、環境(DBやファイルリソースな ど)などの連携やモック化も必要で、複雑になる。 • 複数のツールなどを組み合わせたり、⾃作するこ とが必要となる。 2 そもそも、テスト ⾃動化エンジニアがいない • テストシナリオも設計できて、それを⾃動化でき るテストエンジニアは少ない。 3 メンテナンスコストが ⾼い • 連携するコンポーネントの内、どこかが変わった ら、シナリオを変更する必要が出てくる。 • UIの変更に追随するのが⼤変で、⾃動化途中で挫 折してしまう。
  • 7. 世の中は API-First の時代へ Copyright © Acroquest Technology Co., Ltd. All rights reserved. 7 • マルチデバイス対応への ニーズ増加 • バックエンド側は、 REST-APIで呼び出す アーキテクチャが 当たり前になってきた
  • 8. 世の中は API-First の時代へ Copyright © Acroquest Technology Co., Ltd. All rights reserved. 8 • マイクロサービス アーキテクチャ採⽤増加 • システム間連携も REST-APIで実現 • API⾃体が サービスの仕様であり 重要性が⾼まってきた
  • 9. Copyright © Acroquest Technology Co., Ltd. All rights reserved. 9 ⾃動化が必要なのは 分かっている。 でも、 できていない、 挫折してしまう。。。 そういった問題を どうにかしたい︕
  • 10. Copyright © Acroquest Technology Co., Ltd. All rights reserved. 10 What is Karate?
  • 11. 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記法で、テストシナリオを記述
  • 12. Copyright © Acroquest Technology Co., Ltd. All rights reserved. 12 Karate テストシナリオ
  • 13. Karate の強み Copyright © Acroquest Technology Co., Ltd. All rights reserved. 13 ③テストに必要な内容に 幅広く対応できる ①シナリオテストが可能 • 連続した処理のテストが可能で、API単発 ではなく、シナリオテストが実施ができる • JavaやJSと連携でき、関数の利⽤が可能で、 環境の初期化や⾮同期処理にも対応できる • シナリオの再利⽤などもでき、応⽤範囲が広い ②学習コストが低い • DSLによる直観的なテストケース記述 • テスト実⾏/エラー確認の容易性 • プログラマでなくても作成できる • 新⼈でもハマらず導⼊できた • テストダブル(モック)、性能テスト、UIテスト などにも対応 • REST-APIだけでく、ファイルアップロード、 GraphQL、gRPC、WebSocket などにも対応
  • 14. Copyright © Acroquest Technology Co., Ltd. All rights reserved. 14 HTTP関連の 標準対応 負荷テスト との連携 シンプルな テストケース 記述 テスト ダブル End-to-End テスト プログラミング ⾔語拡張
  • 15. 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レベルに 登場
  • 16. 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
  • 17. 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
  • 18. Copyright © Acroquest Technology Co., Ltd. All rights reserved. 18 Karate による APIテストの実施
  • 19. Karateの主な機能 Copyright © Acroquest Technology Co., Ltd. All rights reserved. 19 No 機能 概要 ① シンプルなテストケース記述 • シナリオ記述 • テスト実⾏結果の確認 • 効率の良いデータ指定/記述 • Fuzzy Matching/Assertion ② HTTP関連の標準対応 • HTTPに対応した組み込み パラメータの活⽤ ③ プログラミング⾔語拡張 • JavaScriptの関数の利⽤ • Javaコードの呼び出し ④ テストダブル • サーバー側のモック化 ※SAPでのフロントエンド開発時に、 バックエンドのモックにも利⽤できる。 ⑤ 負荷テスト連携 • Gatlingとの連係 ⑥ UIテスト • KarateDriver(WebDriver)による UI操作⾃動化/キャプチャ
  • 20. ①シンプルなテストケース記述 〜シナリオの基本構成〜 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 であることをテスト レスポンスの内容をテスト
  • 21. ①シンプルなテストケース記述 〜テスト実⾏結果レポート〜 Copyright © Acroquest Technology Co., Ltd. All rights reserved. 21 ステップごとに 実⾏結果が分かる 実⾏時のデータの 内容も分かる
  • 22. ①シンプルなテストケース記述 〜データ記述〜 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開発者が うれしいヤツ ⼀⽬で 分かりやすい
  • 23. ①シンプルなテストケース記述 〜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'} パラメータの有無判定 パラメータの型判定
  • 24. ②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
  • 25. ③プログラミング⾔語拡張 Copyright © Acroquest Technology Co., Ltd. All rights reserved. 25 * def greeter = function(name){ return 'hello ' + name } * assert greeter('Bob') == 'hello Bob' JavaScript が使える︕ 何か複雑な処理や判定が必要になる場合でも 独⾃関数で対応することが可能になる
  • 26. ③プログラミング⾔語拡張 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 のクラスも実⾏できる︕ プロダクトコード/テストコードのクラスなども テストで使うことができ、効率が上がる
  • 27. ④テストダブル Copyright © Acroquest Technology Co., Ltd. All rights reserved. 27 テスト対象 サービス 依存関係 サービス ⾃動化したいけど、よくある⾯倒なパターン テスト対象のAPI これをどうするか︖
  • 28. ④テストダブル Copyright © Acroquest Technology Co., Ltd. All rights reserved. 28 テスト対象 サービス 解決できます。そう、Karateならね。 テスト対象のAPI こうできるんです︕ (テストダブル)
  • 29. ④テストダブル 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シナリオ
  • 30. ⑤負荷テスト連携 Copyright © Acroquest Technology Co., Ltd. All rights reserved. 30 Karate Gatling Gatlingと連携して 負荷テストの実⾏ができる Karateの シナリオファイルを 再利⽤可能
  • 31. ⑥UIテスト Copyright © Acroquest Technology Co., Ltd. All rights reserved. 31 https://twitter.com/ptrthomas/status/1046459965668388866 KarateDriver を 利⽤しての ブラウザ実⾏も可能
  • 32. ⑥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テスト
  • 33. Karateによるテスト⾃動化の効率化 Copyright © Acroquest Technology Co., Ltd. All rights reserved. 33 ⾊々なツールを組み合わせて 使いこなす 単⼀のツールで 幅広く対応
  • 34. 参考 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/
  • 35. Evolve the Earth with Emotion of Technology Copyright © Acroquest Technology Co., Ltd. All rights reserved. 35 Sparking Joy for API Testing Automation with Karate !