【问题标题】:Karate API Testing - Sorting Validation Scenario空手道 API 测试 - 排序验证场景
【发布时间】:2021-07-16 21:50:00
【问题描述】:

我有一个请求会产生以下响应:

{
"totalRows": 10,
"colDefs": [
    {
        "entityAttributeId": "somestring",
        "headerName": "somestring",
        "field": "someNumber",
        "entityPath": "",
        "entityId": "somestring"
    },
    {
        "entityAttributeId": "somestring",
        "headerName": "somestring",
        "field": "someNumber",
        "entityPath": "somestring",
        "entityId": "somestring"
    },
    {
        "entityAttributeId": "somestring",
        "headerName": "somestring",
        "field": "1",
        "entityPath": "",
        "entityId": "somestring"
    },
    {
        "entityAttributeId": "somestring",
        "headerName": "somestring",
        "field": "3",
        "entityPath": "somestring",
        "entityId": "somestring"
    }
],
"rowData": [
    {
        "1": "",
        "2": "s",
        "3": "1939EX",
        "4": "",
        "rowMeta": {
            "text/inthisform": {
                "someid": "1939EX"
            },
            "somestring": {
                "somestring": ""
            }
        }
    },
    {
        "1": "",
        "2": ",
        "3": "1939A2",
        "4": "",
        "rowMeta": {
            "text/inthisform": {
                "someid": "1939A2"
            },
            "somestring": {
                "somestring": "somevalue"
            }
        }
    },
    {
        "1": "",
        "2": "",
        "3": "1939A1",
        "4": "",
        "rowMeta": {
            "text/inthisform": {
                "someid": "1939A1"
            },
            "somestring": {
                "somevalue": "value"
            }
        }
    },

    {
        "1": "",
        "2": "",
        "3": "193901",
        "4": "",
        "rowMeta": {
            "sometext/inthisform": {
                "somevalue": "193901"
            },
            "somevalue": {
                "somevalue": "value"
            }
        }
    }
]
}

现在我需要对该字段值应用排序功能。“sometext/inthisform”:{ “一些值”:“193901” }, 在 Java 中,我可以轻松地做到这一点,方法是将此响应存储为一个数组并对其进行排序,然后通过我的排序功能响应进行比较。

对于空手道,我不知道如何前进。

我正在尝试以下选项: 而 def temp = ListDataSet_Response.rowMeta.rowData[*].3

或 而 def temp = ListDataSet_Response.rowMeta.sometext/inthisform.somevalue

存储数组列表值。由于空手道没有给出任何编译或任何类型的错误信息,我不知道在这种情况下如何进行?

总结:我想将字段的值存储到一个数组中,并希望对其应用排序。应用排序后,我想将这个新的排序数组与我的特征排序数组响应进行比较。

【问题讨论】:

    标签: karate


    【解决方案1】:

    我通过这种方式找到了解决方案:

    1. 借助 jsonpath 存储 JSONArray 值:

      而 def temp = $ListDataSet_Response.rowData[*].3

    2. 直接在功能文件本身中调用排序函数。

    功能文件中添加的这些行背景

    * def ArrayList = Java.type('java.util.ArrayList')
    * def Collections = Java.type('java.util.Collections')
    

    为按升序排序添加了这些行:创建列表并将此临时变量(存储的响应)的值添加到该列表中。稍后,对该列表应用排序。

    And def listAsAscending = new ArrayList()
    * eval for(var i = 0; i < sometextid.length; i++) listAsAscending.add(sometextid[i])
    * eval Collections.sort(listAsAscending, java.lang.String.CASE_INSENSITIVE_ORDER)
    * print listAsAscending
    

    降序也是如此:

    And def listAsDescending = new ArrayList()
    * eval for(var i = 0; i < sometextid.length; i++) listAsDescending.add(sometextid[i])
    * eval Collections.sort(listAsDescending, Collections.reverseOrder())
    * print listAsDescending
    

    要比较列表,稍后与我的排序 API 响应:

    * match sortedTemp == listAsAscending
    * match sortedTemp == listAsDescending
    

    【讨论】:

      【解决方案2】:

      请参考这个甚至涉及不区分大小写排序的示例。从空手道进入 Java 很容易,尤其是对于像这样的复杂用例:

      Scenario: case-insensitive sort
          * def ArrayList = Java.type('java.util.ArrayList')
          * def Collections = Java.type('java.util.Collections')
      
          * def json = [{ v: 'C' }, { v: 'b' }, { v: 'A' }]
          * def actual = $json[*].v
          * match actual == ['C', 'b', 'A']
          * def list = new ArrayList()
          * eval for (var i = 0; i < actual.length; i++) list.add(actual[i])
          * match list == ['C', 'b', 'A']
          * eval Collections.sort(list, java.lang.String.CASE_INSENSITIVE_ORDER)
          * match list == ['A', 'b', 'C']
      

      由于你的例子太复杂,我无法给出具体答案,请参考:https://stackoverflow.com/help/mcve

      如需更简洁的方式表达上述代码,请参考实际示例,您可以将部分代码移至 JS 中:https://github.com/intuit/karate/blob/master/karate-junit4/src/test/java/com/intuit/karate/junit4/demos/sort-array.feature

      编辑:Karate 1.0 引入了一个原生的 karate.sort() API,在文档中搜索它。

      【讨论】:

      • 我现在可以在空手道中使用这些行获取数组:并且 def temp = $ListDataSet_Response.rowData[*].3。输出为:15:35:49.918 [打印] [“193902”,“193903”,“193961”,“1939A2”,“193962”,“193946”,“1939EX”,“193959”,“1939A1”, “193901”]。现在我需要按升序和降序对这个输出进行排序。希望,现在很清楚了。
      • 当我通过这个输出时 [ "193902", "193903", "193961", "1939A2", "193962", "193946", "1939EX", "193959", "1939A1 ", "193901" ] 到我编写逻辑以执行排序的 java 类,它抛出此错误:无法将 net.minidev.json.JSONArray 转换为 [Ljava.lang.Object 或无法转换为 [Ljava. lang.String
      • 所以以下代码行按升序对输出进行了排序:and def list = new ArrayList() * eval for(var i = 0; i
      • 抱歉无法理解/阅读此类信息。您可以尝试按照此流程操作或等待其他人帮助您:github.com/intuit/karate/wiki/How-to-Submit-an-Issue
      • @PeterThomas 在空手道 1.0 中,当我尝试使用键对给定的响应进行排序时,空手道会在排序后删除重复的条目。这是设计使然吗?
      猜你喜欢
      • 1970-01-01
      • 2020-06-05
      • 1970-01-01
      • 2022-12-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 2023-02-10
      • 2018-02-15
      相关资源
      最近更新 更多