空手道:将动态子响应与父API响应匹配

时间:2020-02-19 14:21:40

标签: karate

我有一个方案,其中父API响应的一部分来自子API。如果子API响应(动态的)只有一个数组元素,则无需与父API响应中的数组元素匹配,if array size > 1那么我需要从病房的索引1与父API响应进行匹配。

* def child =  {"array1":[{"mbr1":{"id":"A1"}},{"mbr2":{"id":"A2"}}]}

子api响应没有特定的顺序,array1可以有"n"个数组元素(mbr1,mbr2,mbr3, etc)

如果子API响应与上面类似,则父API如下所示:

* def parent =  {"parent":{"muid":"1234"},"elg":[{"EID":"E123"},{"members":[{"mbr2":{"id":"A2"}}]}]}

因此,仅在满足上述条件的情况下,才会向父API响应填充父API响应。 如果子API仅返回一个元素,则父API响应将如下所示:

* def parent = {"parent":{"muid":"1234"},"elg":[{"EID":"E123"}]}

那么,如果子级返回200 OK并且子级数组长度> 1,该如何匹配以查看子级是否存在于父级中? 因此,我正在寻找以下情况的解决方案:

if (child responseStatus == 200){
    if (child.array1.length > 1){
        for (i = 1;i <= child.array1.length; i++){
            parent.elg[1].members[i] contains child.arrays1[i]
        }
    }
}  

1 个答案:

答案 0 :(得分:2)

您在这里:

* copy last = child.array1
* remove last[0]
* def multi = {"parent":{"muid":"1234"},"elg":[{"EID":"E123"},{"members":"#(last)"}]}
* def expected = child.array1.length == 1 ? {"parent":{"muid":"1234"},"elg":[{"EID":"E123"}]} : multi
* match parent == expected

现在,我非常确定您(或团队中的其他任何人)将很难理解地球上的工作原理。这带给我我对您的建议。

大多数团队不会进行这种动态复杂的体操运动。那不是您应该进行测试的方式。

您有2种情况。一种情况是您的孩子中有1个元素。还有其他情况。

请编写两个单独的Scenario -s,并确保传递给任何服务的数据均保证返回特定形状。如果您无法执行此操作,则可能意味着它是如此动态,以至于您没有必要进行测试-也许它首先不应该成为验证的重点。

因此您的测试变得简单。

Scenario: first case
# send request1, get child and parent
# match parent == {"parent":{"muid":"1234"},"elg":[{"EID":"E123"}]}

Scenario: second case
# send request2, get child and parent
# match parent == {"parent":{"muid":"1234"},"elg":[{"EID":"E123"},{"members":[{"mbr2":{"id":"A2"}}]}]}

有关如何简化不良测试的另一个示例,请参见:https://stackoverflow.com/a/54126724/143475