4 votes

Services asynchrones de SoapUI (mocking)

Nous utilisons SoapUI pour simuler des services web afin de tester notre application (APP) avant d'avoir accès aux vrais services web.

La création d'un service fantaisie synchrone qui retournera une réponse prédéfinie est simple. Cependant, je dois simuler des asynchrone où l'APP envoie une requête, le SoapUI répond immédiatement avec une confirmation (par exemple SUCCESS) et ensuite après un intervalle prédéfini le SoapUI rappellera notre application (l'APP agit alors comme un serveur). J'ai réussi à le faire en utilisant un scénario de test où la première étape est MockResponse, puis le délai et enfin MockRequest (pour appeler notre application).

Ce qui précède fonctionne bien mais j'aimerais le faire en le scriptant directement dans la réponse Mock pour éviter d'utiliser des cas de test. J'ai réussi à écrire le script qui, lorsqu'un Mock Service reçoit une demande, déclenche le callback.

def project = result.mockOperation.mockService.project
// The API documentation doesn't say what finish is supposed to do but I try (doesn't help)
result.finish()
// Request that will be returned back - THE CALLBACK
def request = project.interfaces["LocationServicesOperation"].operations["ackLocation"].getRequestByName("Request 1")
sleep(4000)
request.submit(new com.eviware.soapui.impl.wsdl.WsdlSubmitContext(  ), false)

Le problème avec la méthode ci-dessus est qu'elle déclenche le rappel AVANT d'envoyer la réponse à la demande initiale. J'ai essayé d'utiliser le traitement des événements dans SoapUI PRO mais je n'arrive pas à le faire fonctionner. Dans Wireshark, je peux voir la communication comme ceci :

1) APP request -> SoapUI 
2) SoapUI callback -> APP
3) APP confirms 2) -> SoapUI 
4) SoapUI confirms 1) -> APP

Cependant, elle doit l'être :

1) APP request -> SoapUI 
2) SoapUI confirms 1) -> APP
3) SoapUI callback -> APP
4) APP confirms 2) -> SoapUI 

Le code ci-dessus est en fait issu de l'événement MockRunListener.onMockResult dans SoapUI Pro. le result.finish() ne fait pas l'affaire.

Merci pour tous les conseils !

2voto

poisson Points 898

J'ai finalement trouvé une solution à http://www.eviware.com/forum/viewtopic.php?f=5&t=3542&p=12474&hilit=asynchronous#p12474

L'astuce consistait, au lieu d'envoyer la requête directement à partir de la réponse script, à ajouter la requête de rappel à un test, puis à appeler le test. Cela fera en sorte que le mock runner envoie d'abord la réponse à la demande et après cela, exécute le cas de test.

L'avantage est que le scénario de test est déclenché dynamiquement et ne doit pas être exécuté en permanence.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X