Karate 空手道框架重试,直到无法按预期工作

Karate 空手道框架重试,直到无法按预期工作,karate,Karate,我正在使用JUnit的空手道框架 使用此功能: Given path 'save_token' And request """ { "token": "test_token" } """ And retry until response.tokens == """ [ "test_token" ] """ When method POST 我有一个例外: java.lang.ArrayIndexOutOfBoundsException: 1 at com.intuit.ka

我正在使用JUnit的空手道框架

使用此功能:

Given path 'save_token'
And request
"""
{
  "token": "test_token"
}
"""
And retry until response.tokens ==
"""
[
    "test_token"
]
"""
When method POST
我有一个例外:

java.lang.ArrayIndexOutOfBoundsException: 1
    at com.intuit.karate.core.MethodMatch.convertArgs(MethodMatch.java:60)
    at com.intuit.karate.core.Engine.executeStep(Engine.java:141)
    at com.intuit.karate.core.ScenarioExecutionUnit.execute(ScenarioExecutionUnit.java:171)
当response.tokens列表为空时:

{
    "tokens": []
}
我不明白为什么==在这种情况下不起作用(它应该返回false,并继续重试)

提前谢谢

表达式必须是纯JavaScript,并且不支持特殊的空手道匹配关键字,如
contains
,并且您不能像尝试那样进行“深度相等”,因为在JS中也不可能这样

编辑:在0.9.6中。此后,您可以在JS中进行复杂的
匹配

还请注意,不支持JsonPath,这意味着
*
不能出现在表达式中

因此,如果您的响应是
{“tokens”:[“value1”]}
,则可以执行以下操作:

And retry until response.tokens.contains('value1')
或:

要进行实验,可以尝试以下表达式:

* def response = { "tokens": [ "value1" ] }
* assert response.tokens.contains('value1')
在运行时,您可以使用JS处理轮询时响应尚未就绪的情况:

And retry until response.tokens && response.tokens.length
编辑:下面显示了执行上述操作的更优雅的方法,因为
karate.get()
优雅地处理JS或JsonPath计算失败并返回
null

And retry until karate.get('response.tokens.length')
或者,如果您正在处理XML,则可以使用
karate.xmlPath()
API:

And retry until karate.xmlPath(response, '//result') == 5
如果你真的想使用空手道的
match
语法,你可以使用:

请注意,如果您有更复杂的逻辑,则始终可以将其包装为可重用函数:

* def isValid = function(x){ return karate.match(x, { tokens: '##[_ > 0]' }).pass }
# ...
And retry until isValid(response)
最后,如果上述任何一项都不起作用,则始终可以切换到自定义轮询例程:

编辑:有关如何使用
karate.filter()
代替JsonPath的示例,请参见此答案:

编辑:在0.9.6版以后的版本中,空手道可以在JS中进行
匹配
,这可以简化上面的一些操作:

表达式必须是纯JavaScript,并且不支持特殊的空手道匹配关键字,例如
包含
,并且您不能像尝试的那样进行“深度相等”,因为这在JS中也是不可能的

编辑:在0.9.6中。此后,您可以在JS中进行复杂的
匹配

还请注意,不支持JsonPath,这意味着
*
不能出现在表达式中

因此,如果您的响应是
{“tokens”:[“value1”]}
,则可以执行以下操作:

And retry until response.tokens.contains('value1')
或:

要进行实验,可以尝试以下表达式:

* def response = { "tokens": [ "value1" ] }
* assert response.tokens.contains('value1')
在运行时,您可以使用JS处理轮询时响应尚未就绪的情况:

And retry until response.tokens && response.tokens.length
编辑:下面显示了执行上述操作的更优雅的方法,因为
karate.get()
优雅地处理JS或JsonPath计算失败并返回
null

And retry until karate.get('response.tokens.length')
或者,如果您正在处理XML,则可以使用
karate.xmlPath()
API:

And retry until karate.xmlPath(response, '//result') == 5
如果你真的想使用空手道的
match
语法,你可以使用:

请注意,如果您有更复杂的逻辑,则始终可以将其包装为可重用函数:

* def isValid = function(x){ return karate.match(x, { tokens: '##[_ > 0]' }).pass }
# ...
And retry until isValid(response)
最后,如果上述任何一项都不起作用,则始终可以切换到自定义轮询例程:

编辑:有关如何使用
karate.filter()
代替JsonPath的示例,请参见此答案:


编辑:在0.9.6版以后的版本中,空手道可以在JS中进行
匹配
,这可以简化上面的一些操作:

什么类型的对象是response.tokens,您可以应用contains()方法?我在寻找javascript数组文档,它们使用includes()。我正在寻找类似containsAll()的东西。它实际上是一个java
列表。也许您只需要执行此操作
,然后重试,直到karate.match(响应,{tokens:'#(^^^预期)})。pass
-请参阅docsGreat中的“包含快捷方式”。最后一个问题,如何中断重试直到表达式?行太长,enter不起作用。我知道我可以编写一个单独的函数,但我想用几行表达式将其放在那里。@Italkthewind您不能。但请记住,“开源”;p可以应用contains()方法的response.tokens是哪种类型的对象?我在寻找javascript数组文档,它们使用includes()。我正在寻找类似containsAll()的东西。它实际上是一个java
列表。也许您只需要执行此操作
,然后重试,直到karate.match(响应,{tokens:'#(^^^预期)})。pass
-请参阅docsGreat中的“包含快捷方式”。最后一个问题,如何中断重试直到表达式?行太长,enter不起作用。我知道我可以编写一个单独的函数,但我想用几行表达式将其放在那里。@Italkthewind您不能。但请记住,“开源”;P