问题涉及处理空单元格并在“示例”中使用 null。
我们的测试数据是从具有各种组合的 CSV 文件中读取的,并非所有值都始终出现在列中(特别是与响应值进行比较的基准)。
比较需要有条件:
是的,当您使用 CSV 文件时,预处理会有点困难,以便按照您期望的方式处理空值。但这是可能的,请注意,下面的所有示例都可以在本地尝试,只需将它们剪切并粘贴到本地/功能文件中即可。
首先让我们看看如何在“正常”
Examples
块中执行此操作,然后看看差异:
Feature: using nulls and inline json
Scenario Outline:
Given url 'https://reqres.in/api'
And path 'register'
And request { email: '#(email)', password: '#(password)' }
When method post
Then status 400
* print response
* match response == errorResponse
Examples:
| email! | password! | errorResponse! |
| null | null | { error: 'Missing email or username' } |
| 'aa' | 'bb' | { error: 'Note: Only defined users succeed registration' } |
请注意 列名称如何添加后缀
!
,以便正确处理 null
等内容,而不是默认的 ''
或空字符串。但是当您使用 CSV 作为数据源时,您需要手动进行预处理。幸运的是,通过使用@setup
场景:,这很容易
Feature: converting empty cells to null from a csv
@setup
Scenario:
* def raw = read('examples.csv')
* def convert = x => x || null
* def data = raw.map(x => ({ email: convert(x.email), password: convert(x.password), error: x.error }))
Scenario Outline:
Given url 'https://reqres.in/api'
And path 'register'
And request { email: '#(email)', password: '#(password)' }
When method post
Then status 400
* print response
* match response == { error: '#(error)' }
Examples:
| karate.setup().data |
对于上面的例子,
examples.csv
的内容如下:
email,password,error
,,Missing email or username
aa,bb,Note: Only defined users succeed registration
为了完整起见,空手道世界中“循环”的另一种方式是这样:
Feature: looping over a json array converted from a csv
Scenario:
* def raw = read('examples.csv')
* def convert = x => x || null
* def data = raw.map(x => ({ email: convert(x.email), password: convert(x.password), error: x.error }))
* call read('@register') data
@ignore @register
Scenario:
Given url 'https://reqres.in/api'
And path 'register'
And request { email: '#(email)', password: '#(password)' }
When method post
Then status 400
* print response
* match response == { error: '#(error)' }