Mais conteúdo relacionado
Semelhante a マイクロサービスにおけるテスト自動化 with Karate (20)
マイクロサービスにおけるテスト自動化 with Karate
- 1. 1Copyright © Acroquest Technology Co., Ltd. All rights reserved.
マイクロサービスにおけるテスト自動化
with Karate
2018/12/08
Acroquest Technology Co., Ltd.
鈴木 貴典
システムテスト自動化カンファレンス 2018
- 2. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
2
自己紹介
◼ 所属
• Acroquest Technology Co., Ltd.
◼ 主な業務分野
• システムアーキテクト
• IoTサービス開発
• ビッグデータ処理プラットフォーム
• サーバーレス・アーキテクチャ
◼ バックグラウンド
• エンタープライズ/ミッションクリティカル
• SEPG/開発/マネジメント
• Java/Python
鈴木 貴典
シニアテクニカルアーキテクト
Acro = 先端を
quest = 探究する
- 5. はじめに
Copyright © Acroquest Technology Co., Ltd. All rights reserved.
5
○:マイクロサービス
× :マイクロサービシズ
○:Microservices
× :Microservice
システムアーキテクチャのひとつで、ソフトウェアアプリケーションを独立して
配置可能な小さなサービスとして開発し、それらを組み合わせて、ひとつの
システムを実現する手法。もしくは、そうして開発されたシステム自体のこと。
- 6. アジェンダ
Copyright © Acroquest Technology Co., Ltd. All rights reserved.
6
① What is Karate?
② なぜ Karate を導入することに至ったか?
③ Karateを採用したポイント
④ Karate の高い利便性
- 10. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
10
Karate
Web-Services Testing Made Simple.
- 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記法で、テストシナリオを記述
- 14. 世の中は API-First の時代へ
Copyright © Acroquest Technology Co., Ltd. All rights reserved.
14
• マルチデバイス対応への
ニーズ増加
• バックエンド側は、
REST-APIで呼び出す
アーキテクチャが
当たり前になってきた
- 15. 世の中は API-First の時代へ
Copyright © Acroquest Technology Co., Ltd. All rights reserved.
15
• マイクロサービス
アーキテクチャ採用増加
• システム間連携も
REST-APIで実現
• API自体が
サービスの仕様であり
重要性が高まってきた
- 16. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
16
マイクロサービスは
開発も大変だが、テストも大変
出典:A Netflix Guide to Microservices
- 17. 課題だったこと
Copyright © Acroquest Technology Co., Ltd. All rights reserved.
17
テストは自動化もしてパスしていたのに
シナリオテストしたら、エラーが多発
サービスの依存関係が多く
テストを自動化するのが困難
テストエンジニアが
テスト自動化するのは結構大変
- 23. Karateを採用したポイント
Copyright © Acroquest Technology Co., Ltd. All rights reserved.
23
③学習コストが低い • 直観的なテストケース記述
• テスト実行/エラー
確認の容易性
• 新人でもハマらず導入
①シナリオテストが可能 • 連続したテストケース
• APIの応答値の利用
②DSLで記述できる • プログラマでなくても
作成できる
• データとテストの分離
- 25. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
25
HTTP関連の
標準対応
負荷テスト
との連携
シンプルな
テストケース
記述
テスト
ダブル
End-to-End
テスト
プログラミング
言語拡張
- 26. ①シンプルなテストケース記述
~シナリオの基本構成~
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 であることをテスト
レスポンスの内容をテスト
- 28. ①シンプルなテストケース記述
~データ記述~
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開発者が
うれしいヤツ
一目で
分かりやすい
- 29. ①シンプルなテストケース記述
~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'}
パラメータの有無判定 パラメータの型判定
- 30. ②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
- 31. ③プログラミング言語拡張
Copyright © Acroquest Technology Co., Ltd. All rights reserved.
31
* def greeter = function(name){ return 'hello ' + name }
* assert greeter('Bob') == 'hello Bob'
JavaScript が使える!
何か複雑な処理や判定が必要になる場合でも
独自関数で対応することが可能になる
- 32. ③プログラミング言語拡張
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 のクラスも実行できる!
プロダクトコード/テストコードのクラスなども
テストで使うことができ、効率が上がる
- 35. ④テストダブル
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シナリオ
- 36. ④テストダブル
Copyright © Acroquest Technology Co., Ltd. All rights reserved.
36
Cunsumer:
APIを呼び出す側
Provider:
APIを呼び出される側
Karateが、これらの代替、
もしくは、間に入って、
実行することができる
- 39. さらに・・・
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
- 41. Evolve the Earth with Emotion of Technology
Copyright © Acroquest Technology Co., Ltd. All rights reserved.
41
Karate で
あたなのテストも 楽 できるのでは?