Vuelva a intentar el marco de Karate hasta que no funcione como se esperaba

Resuelto italktothewind asked hace 5 años • 1 respuestas

Estoy usando el marco Karate con JUnit.

Usando esta característica:

Given path 'save_token'
And request
"""
{
  "token": "test_token"
}
"""
And retry until response.tokens ==
"""
[
    "test_token"
]
"""
When method POST

Tengo esta excepción:

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)

Cuando la lista de tokens de respuesta está vacía:

{
    "tokens": []
}

No entiendo por qué == no funciona en este caso (debería devolver falso y seguir intentando).

¡Gracias de antemano!

italktothewind avatar Apr 24 '19 06:04 italktothewind
Aceptado

La retry untilexpresión tiene que ser JavaScript puro y las palabras clave especiales de coincidencia de Karate, como containsno son compatibles, y no puedes hacer "iguales profundos" como lo estás intentando, ya que eso tampoco es posible en JS.

EDITAR: en 0.9.6. en adelante puedes hacer un complejo matchen JS: https://stackoverflow.com/a/50350442/143475

También tenga en cuenta que JsonPath no es compatible, lo que significa *que ..no puede aparecer en la expresión.

Entonces, si tu respuesta es { "tokens": [ "value1" ] }, puedes hacer esto:

And retry until response.tokens.includes('value1')

O:

And retry until response.tokens[0] == 'value1'

Para experimentar, puedes probar expresiones como esta:

* def response = { "tokens": [ "value1" ] }
* assert response.tokens.includes('value1')

En tiempo de ejecución, puede usar JS para encargarse de las condiciones cuando la respuesta aún no está lista durante el sondeo:

And retry until response.tokens && response.tokens.length

EDITAR: en realidad, a continuación se muestra una forma más elegante de hacer lo anterior, porque karate.get()maneja con elegancia un error de evaluación de JS o JsonPath y devuelve null:

And retry until karate.get('response.tokens.length')

O si trabaja con XML, puede utilizar la karate.xmlPath()API:

And retry until karate.xmlPath(response, '//result') == 5

Y si realmente quieres utilizar el poder de matchla sintaxis de Karate, puedes utilizar la API JS :

And retry until karate.match(response, { tokens: '##[_ > 0]' }).pass

Tenga en cuenta que si tiene una lógica más compleja, siempre puede incluirla en una función reutilizable:

* def isValid = function(x){ return karate.match(x, { tokens: '##[_ > 0]' }).pass }
# ...
And retry until isValid(response)

Finalmente, si nada de lo anterior funciona, siempre puedes cambiar a una rutina de sondeo personalizada:polling.feature

EDITAR: consulte también esta respuesta para ver un ejemplo de cómo usarlo karate.filter()en lugar de JsonPath: https://stackoverflow.com/a/60537602/143475

Peter Thomas avatar Apr 24 '2019 05:04 Peter Thomas