2016-11-04 93 views
0

我有异步测试场景。我打电话给我的SUT(被测系统),它返回确认响应。接下来,正确的响应是异步返回的。我配置被指定为接收以下回调响应我的模拟服务器:Citrus Framework异步HTTP测试场景

<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> 

然后我用应该接受回调

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

预期的有效载荷的Java DSL代码,但我得到这样一个例外,执行时测试:

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) 

我应该如何配置HTTP柑橘模拟服务器接收回调请求(预计请求负载进行验证)在异步测试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异步回调请求之前设置变量(标志)

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; 
} 

testToFailthreshold从上述代码的变量应该从Test类进行设置:

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

它允许你控制测试应等待响应的时间(threshold * 0.5秒),并允许您指向测试,如果未收到回叫响应在假定的时期内。

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动作自定义iteratingConditionExpression:

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

这为我做的工作:)

0

您在Citrus服务器组件上同时使用静态响应适配器和receive()操作。这不起作用。静态响应适配器将始终跳入,并且测试中的接收操作永远不会收到任何请求。

如果您想在测试用例中接收来自服务器组件的请求,请结合静态响应适配器删除调度响应适配器。

+0

感谢您的提示。所以我从'citrus-context.xml'中的citrus-http:server id =“receiveCallbackMockService”中删除了'endpoint-adapter =“dispatchingEndpointAdapter”',现在我得到了这样一个异常:'com.consol.citrus.exceptions。 ActionTimeoutException:从通道'receiveCallbackMockService.inbound''接收消息时的操作超时。看起来更好,但不够好:)我很确定,该服务器响应。 – supertramp