2016-11-04 7 views
0

У меня сценарий асинхронного тестирования. Я вызываю свой SUT (System Under Test) и возвращает ответ подтверждения. Затем правильный ответ возвращается асинхронно. Я настроил мой макет сервер, назначенный для получения ответа обратного вызова, как показано ниже:Сценарий тестирования асинхронного сценария Citrus Framework

<citrus-http:server id="receiveCallbackMockService" 
     port="${server.port}" 
     auto-start="true" 
     timeout="10000" 
     endpoint-adapter="dispatchingEndpointAdapter" /> 

<citrus:dispatching-endpoint-adapter id="dispatchingEndpointAdapter" 
     mapping-key-extractor="mappingKeyExtractor" 
     mapping-strategy="mappingStrategy"/> 


<bean id="mappingKeyExtractor" class="com.consol.citrus.endpoint.adapter.mapping.HeaderMappingKeyExtractor"> 
    <property name="headerName" value="#{T(com.consol.citrus.http.message.HttpMessageHeaders).HTTP_REQUEST_URI}"/> 
</bean> 

<bean id="mappingStrategy" 
    class="com.consol.citrus.endpoint.adapter.mapping.SimpleMappingStrategy"> 
    <property name="adapterMappings"> 
     <map> 
      <entry key="/callback" value-ref="responseAdapter"/> 
     </map> 
    </property> 
</bean> 

<citrus:static-response-adapter id="responseAdapter"> 
</citrus:static-response-adapter> 

Затем я использую Java DSL код, который должен получить ожидаемый полезный груз на обратный вызов

receive(receiveCallbackMockService) 
    .payload(new ClassPathResource("/async/callbackExpectedRequest01.xml")); 

, но я получаю такое исключение при выполнении тест:

14:25:43,516 ERROR  citrus.Citrus| TEST FAILED HELLO_ASYNC_01: output 039 <com.mycompany.myproject> Nested exception is: 
com.consol.citrus.exceptions.CitrusRuntimeException: Unable to create endpoint for static endpoint adapter type 'class com.consol.citrus.endpoint.adapter.RequestDispatchingEndpoint 
Adapter' 
     at com.consol.citrus.endpoint.adapter.StaticEndpointAdapter.getEndpoint(StaticEndpointAdapter.java:35) 
     at com.consol.citrus.server.AbstractServer.createConsumer(AbstractServer.java:200) 
     at com.consol.citrus.actions.ReceiveMessageAction.receive(ReceiveMessageAction.java:146) 
     at com.consol.citrus.actions.ReceiveMessageAction.doExecute(ReceiveMessageAction.java:125) 
     at com.consol.citrus.actions.AbstractTestAction.execute(AbstractTestAction.java:42) 
     at com.consol.citrus.dsl.actions.DelegatingTestAction.doExecute(DelegatingTestAction.java:54) 
     at com.consol.citrus.actions.AbstractTestAction.execute(AbstractTestAction.java:42) 
     at com.consol.citrus.TestCase.executeAction(TestCase.java:214) 
     at com.consol.citrus.TestCase.doExecute(TestCase.java:142) 
     at com.consol.citrus.actions.AbstractTestAction.execute(AbstractTestAction.java:42) 
     at com.consol.citrus.Citrus.run(Citrus.java:254) 
     at com.consol.citrus.dsl.testng.TestNGCitrusTest.invokeTestMethod(TestNGCitrusTest.java:124) 
     at com.consol.citrus.dsl.testng.TestNGCitrusTestDesigner.invokeTestMethod(TestNGCitrusTestDesigner.java:73) 
     at com.consol.citrus.dsl.testng.TestNGCitrusTest.run(TestNGCitrusTest.java:100) 
     at com.consol.citrus.dsl.testng.TestNGCitrusTest.run(TestNGCitrusTest.java:58) 
     at org.testng.internal.MethodInvocationHelper.invokeHookable(MethodInvocationHelper.java:209) 
     at org.testng.internal.Invoker.invokeMethod(Invoker.java:639) 
     at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:820) 
     at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1128) 
     at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:129) 
     at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:112) 
     at org.testng.TestRunner.privateRun(TestRunner.java:782) 
     at org.testng.TestRunner.run(TestRunner.java:632) 
     at org.testng.SuiteRunner.runTest(SuiteRunner.java:366) 
     at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:361) 
     at org.testng.SuiteRunner.privateRun(SuiteRunner.java:319) 
     at org.testng.SuiteRunner.run(SuiteRunner.java:268) 
     at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) 
     at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86) 
     at org.testng.TestNG.runSuitesSequentially(TestNG.java:1244) 
     at org.testng.TestNG.runSuitesLocally(TestNG.java:1169) 
     at org.testng.TestNG.run(TestNG.java:1064) 
     at org.apache.maven.surefire.testng.TestNGExecutor.run(TestNGExecutor.java:132) 
     at org.apache.maven.surefire.testng.TestNGDirectoryTestSuite.executeMulti(TestNGDirectoryTestSuite.java:224) 
     at org.apache.maven.surefire.testng.TestNGDirectoryTestSuite.execute(TestNGDirectoryTestSuite.java:113) 
     at org.apache.maven.surefire.testng.TestNGProvider.invoke(TestNGProvider.java:146) 
     at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:286) 
     at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:240) 
     at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:121) 

Как следует настроить Citrus HTTP Mock сервера для получения запросов обратного вызова (и проверить его с ожидаемой полезной нагрузки запроса) в асинхронном тест scenari о?

ответ

0

Только что нашел время, чтобы поделиться своим решением. Прежде всего, есть сообщение (http://citrus.895196.n3.nabble.com/Citrus-to-act-as-a-mock-server-td4023066.html), в котором говорится: «Что вам нужно, это автономный симулятор, который ждет входящих запросов и отправляет заранее определенные ответные сообщения. Это не основное внимание Citrus в качестве тестовой среды». , Но я нашел обходной путь:

1) Используйте глобальную переменную в качестве флага говорит нам, сделал запрос асинхронной прибыть из SUT:

Spring контекст:

<bean id="globalVariables" class="com.consol.citrus.variables.GlobalVariables"></bean> 

Java код:

@Autowired 
private GlobalVariables globalVariables 

и до начала ожидания запроса запроса обратного вызова SUT async установить значение (флаг)

globalVariables.getVariables().put("SUTcallbackStatus", "waiting"); 

2) продлить IteratingConditionExpression - переопределить evaluate метод, как показано ниже:

@Override 
public boolean evaluate(int index, TestContext context) { 

    if(index > threshold){ 
     testToFail.fail("The async message didn't arrived to the mock server."); 
     return false; 
    } 

    if(globalVariables.getVariables().get("SUTcallbackStatus").equals("received")){ 
     return false; 
    } 

    return true; 
} 

testToFail и threshold переменные из выше кода должны быть установлены из класса Test:

myIteratingConditionExpression.setThreshold(50); 
myIteratingConditionExpression.setTestToFail(this); 

Это позволяет вам как долго тест должен ждать ответа (threshold * 0.5 сек) и позволяет указать тест, который должен быть провалит в случае отсутствия ответа на обратный вызов se в предполагаемом периоде.

3) Расширение StaticResponseEndpointAdapter - переопределения ниже метода

@Override 
public Message handleMessageInternal(Message message) { 

    globalVariables.getVariables().put("SUTcallbackStatus", "received"); 
    return super.handleMessageInternal(message); 
} 

и использовать этот адаптер в качестве притворного сервисного адаптера:

<citrus-http:server id="asyncResponseMockService" 
    port="${server.callback.port}" 
    auto-start="true" 
    timeout="10000" 
    endpoint-adapter="myResponseAdapter" /> 

4) Затем, в тестовом классе - начать ждем асинхронный запрос обратного вызова - просто используйте iterate действие с пользовательским итерационным кодом. Выражение:

iterate(sleep(0.5)).condition(myIteratingConditionExpression); 

Это делает работу для меня :)

0

В то же время вы используете операции «static-response-adapter» и receive() на компоненте сервера Citrus. Это не работает. Адаптер статического ответа всегда будет переключаться, и операция приема в вашем тесте никогда не получит никакого запроса.

Пожалуйста, удалите адаптер ответа отправителя в сочетании с адаптером статического ответа, если вы хотите получать запросы от этого серверного компонента в тестовом примере.

+0

Спасибо за подсказку. Поэтому я удалил 'endpoint-adapter =" dispatchingEndpointAdapter "из' citrus-http: server id = "receiveCallbackMockService" 'в' citrus-context.xml', и теперь я получаю такое исключение: 'com.consol.citrus.exceptions. ActionTimeoutException: тайм-аут действия при получении сообщения с канала 'receiveCallbackMockService.inbound''. Выглядит лучше, но не достаточно хорошо :) Я уверен, что сервер отвечает. – supertramp