LoginSignup
3
1

More than 5 years have passed since last update.

KarateによるAPIのシナリオテスト自動化 #06 Assertions-Contains

Posted at

はじめに

前回(#05 Assertions-Matching)は、Karate における Assert の仕方について確認しました。
ただ、Assert に関する機能は豊富で、前回だけでは書き切れなかった内容があるため、前回分と今回分の2回に分けて説明したいと思います。

Assertの仕方

Contains Matching

通常のmatch ==コマンドは、完全一致ですが、match containsコマンドは、テスト対象データの部分一致を確認できます。

Scenario: Contains Matching

* def test = {id: '001', first_name: 'John', last_name: 'Smith', age: 20}

# contains / not contains
* match test contains {id:'001'}
* match test contains {first_name: 'John', last_name: 'Smith'}
* match test !contains {foo: '001'}
* match test contains only {id: '001', first_name: 'John', last_name: 'Smith', age: 20}
* match test contains only {age: 20, first_name: 'John', last_name: 'Smith', id: '001'}

# array
* def testArray = [1, 2, 3]

* match testArray contains 1
* match testArray contains [1, 2]
* match testArray !contains 4
* match testArray !contains [4, 5]
* match testArray contains only [1, 2, 3]

# marker
* def test = {id: '001', name: { first: 'John', last: 'Smith' }, age: 20}
* match test contains {id: '#string', name: '#notnull', age: '#number'}

match containsコマンドは、JSONデータはもちろん、通常の変数や配列でも利用できますし、Markerとの組み合わせてでも利用できます。
!contains(対象を含まない場合)やcontains only(対象のみを含む場合)などの使い方もあります。

karate06_contains_matching.png

JSON Path によるチェック

これまで、JSON形式のデータによるチェックは説明してきていますが、JSON形式だけでなく、JSON Pathを使ったチェックも可能です。

Scenario: JSON Path

* def jsonData = 
"""
{
  name: 'Billie',
  kittens: [
    { id: 23, name: 'Bob' },
    { id: 42, name: 'Wild' }
  ]
}
"""

* match jsonData.kittens[*].id == [23, 42]

# 'contains' for JSON arrays
* match jsonData.kittens[*].id contains 23
* match jsonData.kittens[*].id contains [23, 42]

# nested objects within JSON arrays
* match jsonData.kittens contains [{ id: 42, name: 'Wild' }, { id: 23, name: 'Bob' }]

この例では、複数要素をまたがるパラメータのチェックや、ネストされたパラメータをチェックしています。
もちろん、 JSON Pathは、match containsコマンドだけでなく、通常のmatchコマンドでも利用できます。

karate06_json-path.png

個別の要素のチェック

match eachコマンドを利用すると、配列などの複数要素の要素に対して、まとめて個別の要素をチェックすることが可能です。
型や範囲などを、一度にチェックするのに便利なコマンドです。

Scenario: Validate every element

* def arrayData = {foo: [{bar: 1, baz: 'a'}, {bar: 2, baz: 'b'}, {bar: 3, baz: 'c'}]}

# validate each element
* match each arrayData.foo == {bar: '#number', baz: '#string'}

# 'contains' with 'each'
* match each arrayData.foo contains {bar: '#number'}
* match each arrayData.foo contains {bar: '#? _ > 0'}

karate06_each.png

スキーマのチェック

matchコマンドでは、テスト対象データの型や値だけでなく、スキーマによるチェックも可能です。
ここでは、配列を対象に説明しますが、配列の要素数や、配列の中の型などのチェックが可能です。

Scenario: Schema Validation

* def foo = ['bar', 'baz']

# should be an array
* match foo == '#[]'

# should be an array of size 2
* match foo == '#[2]'

# should be an array of strings with size 2
* match foo == '#[2] #string'

# should be null or an array of strings
* match foo == '##[] #string'

# each array element should have a 'length' property with value 3
* match foo == '#[]? _.length == 3'

# should be an array of strings each of length 3
* match foo == '#[] #string? _.length == 3'

karate06_schema_validation.png

まとめ

Assertの仕方として、前回(#05 Assertions-Matching)の内容から、さらに応用した記述方法を確認しました。
これらの記法を覚えておくと、効率よくテスト実行結果の確認をできますね。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1