空手道框架重试,直到不能按预期工作
Karate framework retry until not working as expected
我正在使用 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.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": []
}
我不明白为什么 == 在这种情况下不起作用(它应该 return false,然后继续重试)。
提前致谢!
retry until
表达式必须是纯 JavaScript 并且不支持特殊的空手道匹配关键字,例如 contains
,并且您不能像这样进行“深度等于”你是如何尝试的,因为这在 JS 中也是不可能的。
编辑:在 0.9.6 中。之后你可以在 JS 中做一个复杂的 match
:
另请注意,不支持 JsonPath,这意味着 *
或 ..
不能出现在表达式中。
因此,如果您的回答是 { "tokens": [ "value1" ] }
,您可以这样做:
And retry until response.tokens.includes('value1')
或:
And retry until response.tokens[0] == 'value1'
要进行实验,您可以尝试这样的表达式:
* def response = { "tokens": [ "value1" ] }
* assert response.tokens.includes('value1')
在运行时,您可以在轮询时使用 JS 处理响应尚未准备好的情况:
And retry until response.tokens && response.tokens.length
编辑:实际上,执行上述操作的一种更优雅的方法如下所示,因为 karate.get()
优雅地处理了 JS 或 JsonPath 评估失败并且 returns null
:
And retry until karate.get('response.tokens.length')
或者如果你正在处理 XML,你可以使用 karate.xmlPath()
API:
And retry until karate.xmlPath(response, '//result') == 5
如果你真的想使用空手道 match
语法的强大功能,你可以使用 JS API:
And retry until karate.match(response, { tokens: '##[_ > 0]' }).pass
请注意,如果您有更复杂的逻辑,您始终可以将其包装到可重用的函数中:
* def isValid = function(x){ return karate.match(x, { tokens: '##[_ > 0]' }).pass }
# ...
And retry until isValid(response)
最后,如果上述 none 有效,您可以随时切换到自定义轮询例程:polling.feature
编辑:另请参阅此答案,了解如何使用 karate.filter()
而不是 JsonPath 的示例:
编辑:从0.9.6版本开始,空手道可以在JS中做一个match
,这可以简化上面的一些:
我正在使用 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.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": []
}
我不明白为什么 == 在这种情况下不起作用(它应该 return false,然后继续重试)。
提前致谢!
retry until
表达式必须是纯 JavaScript 并且不支持特殊的空手道匹配关键字,例如 contains
,并且您不能像这样进行“深度等于”你是如何尝试的,因为这在 JS 中也是不可能的。
编辑:在 0.9.6 中。之后你可以在 JS 中做一个复杂的 match
:
另请注意,不支持 JsonPath,这意味着 *
或 ..
不能出现在表达式中。
因此,如果您的回答是 { "tokens": [ "value1" ] }
,您可以这样做:
And retry until response.tokens.includes('value1')
或:
And retry until response.tokens[0] == 'value1'
要进行实验,您可以尝试这样的表达式:
* def response = { "tokens": [ "value1" ] }
* assert response.tokens.includes('value1')
在运行时,您可以在轮询时使用 JS 处理响应尚未准备好的情况:
And retry until response.tokens && response.tokens.length
编辑:实际上,执行上述操作的一种更优雅的方法如下所示,因为 karate.get()
优雅地处理了 JS 或 JsonPath 评估失败并且 returns null
:
And retry until karate.get('response.tokens.length')
或者如果你正在处理 XML,你可以使用 karate.xmlPath()
API:
And retry until karate.xmlPath(response, '//result') == 5
如果你真的想使用空手道 match
语法的强大功能,你可以使用 JS API:
And retry until karate.match(response, { tokens: '##[_ > 0]' }).pass
请注意,如果您有更复杂的逻辑,您始终可以将其包装到可重用的函数中:
* def isValid = function(x){ return karate.match(x, { tokens: '##[_ > 0]' }).pass }
# ...
And retry until isValid(response)
最后,如果上述 none 有效,您可以随时切换到自定义轮询例程:polling.feature
编辑:另请参阅此答案,了解如何使用 karate.filter()
而不是 JsonPath 的示例:
编辑:从0.9.6版本开始,空手道可以在JS中做一个match
,这可以简化上面的一些: