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

放心:如何在JSON中使用嵌套属性找到元素并验证其他属性

包德业
2023-03-14

我在“放心”方面的经验有限。我们有很多测试,我通常可以在google中找到示例,或者失败,但当我尝试匹配匿名数组中元素的嵌套属性,并验证属性上下(堂兄弟?)时,我会陷入困境。

示例 JSON:

[  
   {  
      "id":1,
      "type":{  
         "typeId":3,
         "name":"LPM"
      },
      "status":{  
         "id":1,
         "price":1.20,
         "source":172,
         "valid":0
      }
   },
   {  
      "id":2,
      "type":{  
         "typeId":2,
         "name":"ST"
      },
      "status":{  
         "id":10,
         "price":1.20,
         "source":172,
         "valid":0
      }
   }
]

我正在使用放心,我想在列表中找到type.name等于LPM的元素,然后仅验证该元素的status.pricestatus.sourcestatus.id

当我最初开始验证响应时,数组中只能有一个项目,因此我使用了:

response.then()
        .assertThat()
        .body("size", greaterThan(0))
        .body("[0].type.name", equalToIgnoringCase("LPM"))
        .body("[0].status.id", equalTo(statusId))
        .body("[0].status.source", equalTo(sourceId))
        .body("[0].status.price", equalTo(price));

但是,这不再保证工作,因为数组中可能有多个元素,并且顺序不保证。

我已将我的身体检查修改为:

response.then()
        .assertThat()
        .body("size", greaterThan(0))
        .body("type.name", hasItem("LPM"))
        .body("status.id", hasItem(statusId))
        .body("status.source", hasItem(sourceId))
        .body("status.price", hasItem(price));

这足以使测试通过,但这会带来风险,即具有 type.name LPM 的元素的 status.idstatus.sourcestatus.price 可能不正确,但这不会被检测到,因为它们将与具有 type.name ST 的元素进行匹配。

所以我希望能够找到具有LPM的元素,因为它是type.name,我可以保证只有一个,然后对于status.idstatus.sourcestatus.price,只检查该元素,即不是ST元素。

我试图修改我的正文匹配器以找到我需要的type.name的元素,但我无法让它工作,因为我不知道如何返回树,穿过和向下,检查同一元素中的其他属性:

response.then()
        .assertThat()
        .body("size", greaterThan(0))
        .body("$.findAll (it.type.name = LPM}.status.id ", hasItem(statusId))
        .body("$.findAll (it.type.name = LPM}.status.source", hasItem(sourceId))
        .body("$.findAll (it.type.name = LPM}.status.price", hasItem(price));

此外,即使这样做有效,它也要搜索树3次,而实际上一次就可以完成。

我的中间匹配现在已经通过了这个测试,但是我想把它做好。我知道我可以将元素放入List中并从那里解决它,但是为了与我们的其他示例保持一致,我宁愿不这样做,尽管我目前看不到其他选择。

我已经尝试在留档中找到我正在尝试做的事情的例子,多个放心的教程和例子,但是我没有,所以总是有可能这实际上是不可能的。如果没有,我很乐意教育Don它背后的理论。

感谢任何帮助。

共有1个答案

傅阳
2023-03-14

有一种方法可以做到这一点:

...
then().
        root("find {it.type.name == '%s'}.status").
        body("id", withArgs("LPM"), is(1)).
        body("price", withArgs("LPM"), is(1.20f)).
        body("source", withArgs("LPM"), is(172)).
        body("id", withArgs("ST"), is(10));

(显然,您也可以将Args提取到变量中,以避免重复)。

find 是 Groovy 查找与谓词匹配的第一个元素的方法({it.type.name == '%s'}),findAll 将始终返回一个列表。

root 指示 REST 放心使用后续期望中使用的“根路径”(参见文档)。

 类似资料:
  • 问题内容: 屏幕上有很多单选按钮。选择单选按钮时,其属性为选中。如果未选择单选按钮,则不存在选中的属性。我想创建一个方法,如果该元素不存在,它将通过。 我正在使用Selenium WebDriver和Java。我知道我可以使用来检索属性。我只是不确定如何验证属性不存在,以及如何在不存在属性时通过测试(如果存在则失败)。 选中单选按钮时 未选中单选按钮时 我要在不存在选中属性的情况下通过测试 问题答

  • 问题内容: 这是使用PHP生成的json 这样做显然行不通。我在其他文章中读到,需要为这种数据结构创建一个orderBy函数。我无法创建该功能。谁能告诉我解决此问题的正确方法是什么? 问题答案: 这些类型的数据操作我希望将它们保留在适当的角度对象中,因此,我将创建自定义过滤器,如下所示: 重要提示: 我建议您使用自定义过滤器,因为出于个人喜好,我不喜欢在控制器或其他对象上加载我可以在其他对象上分离

  • 样本数据 我使用AJV 6.10.0来验证我的数据,但我认为我有一个错误的模式定义。带Ajv选项: 实际上,我有6个错误,警告每个属性的其他属性 在验证allOf(姓名和电话)中的第一个对象时,验证在(地址、邮政编码、城市和州)中发现错误 如果我删除了第一个allOf对象(姓名、电话)的附加属性,在验证地址架构的过程中,验证会在(姓名和电话)上发现错误 如何解决模式定义

  • 问题内容: 在Python Selenium模块中,一旦有了对象,我可以使用以下命令获取其任何属性的值: 如果命名的属性不存在,则返回。 我的问题是,如何获取元素具有的所有属性的列表?似乎没有或方法。 我正在为Python使用Selenium模块的2.44.0版本。 问题答案: 这是 不可能的 使用硒webdriver的API,但你可以_执行JavaScript代码_来获取所有属性: 演示: 为了

  • 问题内容: 我正在尝试查找具有Attribute的元素。好吧,我可以在Selenium中找到具有Id,tagName,Xpath和所有其他预定义方法的元素。但是,我正在尝试编写一种方法,该方法将给定属性名称和值作为输入专门返回WebElement。 假设XPath不是一个选择,还有其他更好的方法吗? 问题答案: 您可以使用CSS轻松完成此任务。 公式为: 所以如果有的话 您可以使用以下方法找到它:

  • 我正在尝试查找具有属性的元素。我可以在Selenium中找到Id、tagName、Xpath和所有其他预定义方法的元素。但是,我正在尝试编写一个方法,专门返回WebElement,给定属性名和值作为输入。 假设XPath不是一个选项,还有其他更好的方法吗?