当前位置: 首页 > 知识库问答 >
问题:

如何使用Karate工具和特性文件比较包含数组的两个JSON对象

韩寒
2023-03-14
  • 所有文件都在同一个目录中。

title-update-request.json

{id: 12, name: 'Old Hello', config:[{username: 'qwe', password: 'tyu'},{username: 'abc', password: 'xyz'}]}

title-update-response.json

{id: 12, name: 'New Hello', config:[{username: 'qwe', password: 'tyu'},{username: 'abc', password: 'xyz'}]}
{id: 00, name: 'Old Hello', config:[{username: 'qwe', password: 'tyu'},{username: 'abc', password: 'xyz'}]}
{Error: 'not found', Message: 'The provided Book is not found.'}
Feature: CRUD operation on the book records.

Background:
        * def signIn = call read('classpath:login.feature')
        * def accessToken = signIn.accessToken
        * url baseUrl

 Scenario: Change title of book in the single book-record.
    * json ExpResObject = read('classpath:/book-records/title-update-response.json')
    * json ReqObject = read('classpath:/book-records/title-update-request.json')
    * call read('classpath:/book-records/update.feature') { Token: #(accessToken), ReqObj: #(ReqObject), ResObj: #(ExpResObject), StatusCode: 200 }

  Scenario: Change title of book in the non-existing book-record.
    * json ExpResObject = read('classpath:/book-records/title-update-error-request.json')
    * json ReqObject = read('classpath:/book-records/title-update-error-response.json')
    * call read('classpath:/book-records/update.feature') { Token: #(accessToken), ReqObj: #(ReqObject), ResObj: #(ExpResObject), StatusCode: 400 }
Scenario: Update single book-record.
    Given path '/book-record'
    And header Authorization = 'Bearer ' + __arg.Token
    And header Content-Type = 'application/json'
    And request __arg.ReqObj
    When method put
    Then status __arg.StatusCode
    And response == __arg.ExpectedResponse
{name: 'New Hello', config:[{username: 'abc', password: 'xyz'},{username: 'qwe', password: 'tyu'}]}

场景2的实际API响应是:

 {Error: 'not found', Message: 'The provided Book is not found.'}

问题:我应该如何验证update.feature文件中的响应,因为问题是如果我使用#^^config进行更改,这将不适用于方案:2并且响应==_arg.ExpectedResponse不适用于方案:1?

共有1个答案

薛烨霖
2023-03-14

这是典型的测试过度工程。如果有人告诉你测试需要“重用”,请不要听那个人的话。

你有两个场景,一个快乐的路径和一个消极的路径。我在下面提供你应该如何写负路径,剩下的由你决定。

Scenario: Change title of book in the non-existing book-record.
Given path 'book-record'
And header Authorization = 'Bearer ' + accessToken
And request {id: 00, name: 'Old Hello', config:[{username: 'qwe', password: 'tyu'},{username: 'abc', password: 'xyz'}]}
When method put
Then status 400
And response == {Error: 'not found', Message: 'The provided Book is not found.'} 

看有多干净?在测试中不需要“极端”重用。如果您仍然坚持想要一个超级通用的可重用的特性文件来处理所有的边缘情况,那么您只是给自己带来了麻烦。看看您现有的测试变得多么不可读!!

 类似资料:
  • 使用intuit/空手道的API测试之一, 预期的JSON是: API响应有两种可能。 第一个可能的实际JSON: 第二种可能的实际JSON: 同样,阵列元素的序列在实际响应中是不同的,因此遵循响应验证的方法随机抛出错误。 和响应== 有时错误被抛出为:错误:{Actual:response.config[0].abc,应为:response.config[0].qwe} 有时会抛出错误:错误:{

  • 问题内容: 我有这个间隔,当前每5秒执行一次ajax请求。我对声明有疑问。我的代码总是输入它,并且两个json值完全相同,为什么它认为它们不同? 编辑 这是控制台输出(虚线是分隔请求,它不在实际输出中) 问题答案: 不能保证以相同的方式序列化JSON对象,也不能保证属性以相同的顺序进行序列化,使用并不是测试对象相等性的好方法。 一个更好的例子是这样的函数(前一段时间在互联网上找到,希望我能感谢原始

  • URL 1-- 如何比较响应1和响应2? 响应2将有额外的属性,因此不能直接使用匹配命令 响应1{名称:你好,国家: ABCD}响应2{名称:你好,国家: ABCD,国家: xyz} 只想比较名称和国家属性,而不想硬编码比较,如匹配响应1。name==response2。名称 将来可能会添加额外的属性,并且不希望频繁修改脚本 或 是否有方法从空手道传递对JavaScript函数的响应并执行比较 比

  • 问题内容: 我想比较两个JavaScript对象数组,以查看它们是否相同。每个数组中的对象可能不会(并且很可能不会)以相同的顺序排列。每个数组最多只能有10个对象。我以为jQuery可以解决这个问题,但是我在网上找不到很多。 我知道可以使用简单的嵌套解决方案,但是有我不知道的内置函数吗? 谢谢。 问题答案: 有一个简单的方法… 如果以上返回true,则即使元素的顺序不同,两个数组也相同。 注意:仅

  • 我使用Nodejs,有一个对象包含一个object数组(API请求的结果)和一个简单的值数组。 它们看起来是这样的: 如何将包含对象数组的对象与简单数组进行比较? 我要找的是,从简单数组中获取ID,并将它们与另一个“复杂”对象进行比较,以检索属性以及简单数组中的相应ID和另一个对象属性,然后将结果存储在一个对象数组中。 简单来说,我希望有这样的结果: 当从API请求中检索“复杂”对象时,我尝试了以

  • 问题内容: 我有两个像这样的对象数组: 我想知道数组是否相等。我定义的是相等的,因为array1中的每个值都与array2中该位置的值相同。因此,这两个数组将相等。 为什么最好找出这两个数组是否相等? 不是一个很深的等式,所以它是行不通的,我不知道是否遍历每个元素并进行比较是解决此问题的最佳,最有效的方法。有没有人有更好的建议? 编辑:我需要一个可以放入嵌套数组的等于。 问题答案: 使用。这项功能

  • 使用RestAssured,我试图比较两个JSON对象。 示例:第一个JSON来自excel,我将其作为字符串读取并存储 第二个 JSON 是返回响应对象的响应,该响应对象实际上是一个 JSON 我想将这两者作为JSON对象进行比较,因为当我将响应转换为String并尝试进行比较时,如果JSON模式的顺序发生变化,我的断言就会失败。 我尝试了将字符串转换成JSON的方法,但是没有找到任何方法。有人

  • 问题内容: 对于我的单元测试,我想检查两个数组是否相同。简化示例: 这是行不通的,因为。最好的进行方法是什么? 问题答案: 或者您可以使用或用: 编辑 由于您正在使用它进行单元测试,因此裸露(而不是将其包装成get )可能更自然。