【问题标题】:Karate API Testing - How do we extract values from Content-Type: text/html kind of response?空手道 API 测试 - 我们如何从 Content-Type: text/html 类型的响应中提取值?
【发布时间】:2018-12-13 09:45:31
【问题描述】:

我有一个在正文中包含 graphQL 查询的请求。

当我发布它时,它会返回一个带有Content-Type →text/html; charset=utf-8 和其他一些常用标题的响应。 txt/html 响应通常包括两件事:

  1. ColDefs 作为第一行
  2. 第二行的元数据

现在我需要验证 ColDefs 是否始终出现在第一行。第二行包含元数据。

如何确保响应的第一行始终包含 colDefs 而第二行包含元数据信息?

回应:

{
    "colDefs": [{
        "entityAttributeId": "abc",
        "headerName": "xyz",
        "field": "2",
        "entityPath": "",
        "entityId": "mna"
    }, {
        "entityAttributeId": "abc",
        "headerName": "abc",
        "field": "3",
        "entityPath": "abc",
        "entityId": "abc"
    }
        
]
} {
    "1": "1000",
    "2": "abc",
    "3": "abc",
    "4": 12,
    "5": "6457.T",
    "6": "123",
    "7": "abc"
} {
    "1": "123",
    "2": "abc",
    "3": "abc",
    "4": 123,
    "5": "123",
    "6": "",
    "7": "abc"
} 

当我尝试打印空手道响应时,它没有打印第二行(元数据)内容,它只是打印 colDefs。

空手道反应:

{
    "colDefs": [{
        "entityAttributeId": "abc",
        "headerName": "xyz",
        "field": "2",
        "entityPath": "",
        "entityId": "mna"
    }, {
        "entityAttributeId": "abc",
        "headerName": "abc",
        "field": "3",
        "entityPath": "abc",
        "entityId": "abc"
}

复制步骤:

网址:一些网址

Headers: Content-Type = 'application/json'

(在空手道功能中明确发送),

请求正文

{
"query": "query($someid: [String]) {some(someid:$someid) {someid someNm someVariable {someVariable someVariableid otherVariable{ otherVariable1 { variable CUSIP issuer { someVariable2 }}}}}}",
        "variables": {
            "someid": ["1090"]
        },
        "includeMetadata": false
    }       
    
Response Header:  Connection →keep-alive
Content-Length →86488
Content-Type →text/html; charset=utf-8
   

响应正文:

{
    "colDefs": [{
        "entityAttributeId": "abc",
        "headerName": "xyz",
        "field": "2",
        "entityPath": "",
        "entityId": "mna"
    }, {
        "entityAttributeId": "abc",
        "headerName": "abc",
        "field": "3",
        "entityPath": "abc",
        "entityId": "abc"
    }
        
]
} {
    "1": "1000",
    "2": "abc",
    "3": "abc",
    "4": 12,
    "5": "6457.T",
    "6": "123",
    "7": "abc"
} {
    "1": "123",
    "2": "abc",
    "3": "abc",
    "4": 123,
    "5": "123",
    "6": "",
    "7": "abc"
} 

空手道反应:

{
    "colDefs": [{
        "entityAttributeId": "abc",
        "headerName": "xyz",
        "field": "2",
        "entityPath": "",
        "entityId": "mna"
    }, {
        "entityAttributeId": "abc",
        "headerName": "abc",
        "field": "3",
        "entityPath": "abc",
        "entityId": "abc"
}

【问题讨论】:

  • 然后匹配 response.colDefs == "coldef"。这行得通。但是元数据验证呢?如何到达那里?打印响应仅显示 colDefs。
  • @PeterThomas 如何打印空手道的整个文本/html 响应?看起来它只保存了部分响应,这是一种 json。
  • 完成。我们现在可以从这里开始吗?
  • 我很困惑?响应是 HTML 吗?您可以粘贴响应的确切文本形式吗?空手道不会神奇地将 html 转换为 json。
  • 用其他细节更新了相关细节。

标签: karate web-api-testing


【解决方案1】:

很明显,您的响应不是有效的 JSON 格式,而且是某种专有格式 - 期望空手道为您神奇地转换它是期望过高 :)

我建议您编写一些 Java 代码来进行自定义验证。这里发生的事情是空手道尽力而为 - 能够将一半的响应解析为 JSON 并放弃其余的。你真的应该欣赏这一点:)

由于空手道还将原始响应的副本保存为字节(从 0.9.0 版本开始),您可以这样做:

* string temp = responseBytes

现在请使用一些 Java 代码或自定义字符串解析 - 并对 temp 执行任何您的要求,这将是一个 Java String。我不得不说这看起来是一个设计得很糟糕的 API。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    相关资源
    最近更新 更多