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

如何验证与yml文件空手道结构响应[重复]

詹甫
2023-03-14

最近我第一次开始与空手道和Yaml合作。我能够验证所有答案数据都在同一水平上的简单回答结构。但现在我不得不验证一个更复杂的结构,我花了很多时间都没有成功。

当我执行GET请求时,我会收到下一个答案:

[
    {
        "factories": [
            {
                "id": 1,
                "scopes": [
                    {
                        "id": null,
                        "name": "name 1",
                        "expireD": 10,
                        "isExpired": true
                    }
                ],
                "companyName": "TEST",
            },
            {
                "id": 2,
                "scopes": [
                    {
                        "id": null,
                        "name": "name 2",
                        "expireD": 7,
                        "isExpired": true
                    }
                ],
                "companyName": "TEST2",
            }
        ],
        "scopeId": null
    }
]

空手道规则中没有直接的结构验证。它位于如下所示的yml文件中:

operationId: getTest
statusCode: 200
params:
body: null
matchResponse: true
responseMatches:
  scopeId: '##number'
  factories:
    companyName: '#string'
    id: '#number'
    scopes:
      expireD: '#number'
      name: '#string'
      id: '#null'
      isExpired: '#boolean'

我检查了结构大约100次,当我到达这里时,我一直有相同的错误:

* match response contains responseMatches

错误是下一个:$[1]。工厂|数据类型不匹配(列表:映射)

我尝试使用match-each,逐个忽略结构,以查看哪个结构失败,并将验证减少为#数组,但它不起作用。

任何帮助都将受到欢迎。谢谢你。

共有2个答案

徐涵亮
2023-03-14

最后,找到了一个解决方案。空手道文档提供了一个关于如何使用它来定义可以用作类型的数据结构的想法。我以前试过,但在responseMatches部分之前添加了。yml文件如下所示:

operationId: getTest
statusCode: 200
params:
body: null
matchResponse: true
responseMatches:
  scopeId: '##number'
  factories: '#[_ <= 5] factoryStructure'

factoryStructure:
    companyName: '#string'
    id: '#number'
    scopes: '#[] scopeStructure'

scopesStructure:
  expireD: '#number'
  name: '#string'
  id: '#null'
  isExpired: '#boolean'
阮桐
2023-03-14

我真的建议不要使用YAML,尤其是在测试/验证场景中。但最后是你的决定。

这里是一个节省时间的提示,您可以打印出YAML的值,并查看哪里出了问题。我不知道YAML(并尽可能避免),但在几次失败的尝试后,我做了一个猜测,并设法在正确的位置插入了一个-(显然还有许多其他方法),使一些YAML成为JSON数组-这就是您想要的。

* text foo =
"""
operationId: getTest
statusCode: 200
params:
body: null
matchResponse: true
responseMatches:
  scopeId: '##number'
  factories:
    -
      companyName: '#string'
      id: '#number'
      scopes:
        expireD: '#number'
        name: '#string'
        id: '#null'
        isExpired: '#boolean'
"""
* yaml foo = foo
* print foo

尝试上面的方法,看看它与您的示例有什么不同。

 类似资料:
  • 我一直在验证下面的回答。 当我使用空手道发出获取请求时,我会得到以下响应,我想验证它。 我试过: 它说它不是字符串。你能帮我确认一下这个请求吗?

  • 我想要帮助验证API响应使用空手道框架。我有相互“独立”的应用编程接口。当我打那个特定的API得到了不同参数的响应(没有单一的匹配从请求参数和响应参数)。 现在我想验证响应参数值。 示例:请求:“方法”帖子 学校名称:“abcd”注册日期:“1:10:2010” 回复:原则名称:“pqrs”原则电子邮件idpqrs@gmail.com 现在我想验证“主名称”不应该为空 我已经像这样实现了,但它不起

  • 我试图验证非json格式的错误响应体。我尝试了使用模式以及使用包含匹配的关键字。这对我不起作用。 在post调用中观察到多个匹配时从API返回的实际响应: 我的空手道特点: 尝试*匹配实际的[0] == '#(^partSchema)'也从https://gist.github.com/ptrthomas/2a1e30bcb4d782279019b3d5c10b3ed1。不工作

  • 我需要验证存储在两个不同文件中的2个json响应。我正在阅读它们并进行比较。但是我得到一个错误的和有几个元素不匹配。只有当我将json存储在文件中并在我的功能文件中读取时,才会出现此问题。 Json文件1:Test.Json Json文件2:Test1.Json 现在,我使用下面的代码来匹配两个json文件。 下面是错误响应。

  • 我正在使用空手道验证GET请求的整个json响应。 下面是来自请求的json响应示例(我只为items显示了两个元素) 以下是我试图验证的方式: 但是,我得到了一个断言错误:

  • 我需要验证一个JSON响应(如下所示),并检查JSON数组中是否有任何一个项的日期为createdDate。 “createdDate”实际上是作为时间戳返回的,但我没有实际值。我唯一需要验证的是今天的日期。项目的顺序也不保证。我查看了https://intuit.github.io/karate/指定的javascript宏,但它没有我正在尝试做的示例。请让我知道任何建议。