【问题标题】:Mule Functional Tests - totally confusedMule 功能测试 - 完全糊涂
【发布时间】:2012-11-16 14:15:47
【问题描述】:

我们有一个 Mule 应用程序,它有 6 个或 7 个流,每个流大约有 5 个组件。 这是设置。 我们将 JMS 请求发送到 ActiveMQ 队列。骡听着。根据消息的内容,我们将其转发到相应的流。

 <flow name="MyAPPAutomationFlow" doc:name="MyAPPAutomationFlow">
      <composite-source>
            <jms:inbound-endpoint queue="MyAPPOrderQ" connector-ref="Active_MQ_1" doc:name="AMQ1 Inbound Endpoint"/>
            <jms:inbound-endpoint queue="MyAPPOrderQ" connector-ref="Active_MQ_2" doc:name="AMQ2 Inbound Endpoint"/>
      </composite-source>
        <choice doc:name="Choice">
            <when expression="payload.getProcessOrder().getOrderType().toString().equals(&quot;ANC&quot;)" evaluator="groovy">
                <processor-chain>
                    <flow-ref name="ProcessOneFLow" doc:name="Go to ProcessOneFLow"/>
                </processor-chain>
            </when>
            <when....
            ...........


         </choice>
    </flow>


 <flow name="ProcessOneFLow" doc:name="ProcessOneFLow">
        <vm:inbound-endpoint exchange-pattern="one-way" path="ProcessOneFLow" responseTimeout="10000" mimeType="text/xml" doc:name="New Process Order"/>
        <component doc:name="Create A">
            <spring-object bean="createA"/>
        </component>
        <component doc:name="Create B">
            <spring-object bean="createB"/>
        </component>
        <component doc:name="Create C">
            <spring-object bean="createC"/>
        </component>
        <component doc:name="Create D">
            <spring-object bean="createD"/>
        </component>    
</flow>


 <spring:beans>

    <spring:import resource="classpath:spring/service.xml"/>
    <spring:bean id="createA" name="createA" class="my.app.components.CreateAService"/>
    <spring:bean id="createB" name="createB" class="my.app.components.CreateBService"/>
    <spring:bean id="createC"  name="createC" class="my.app.components.CreateCService"/>
    <spring:bean id="createD" name="createD" class="my.app.components.CreateDService"/>
            ......
            ......
 </spring:beans>

现在我不确定如何使用它们编写功能测试。

我浏览了 Mule 网站上的功能测试文档,但那里的测试非常简单。

功能测试不应该使用 DAO 或服务层进行实际的后端更新,还是它只是您模拟服务层的单元测试的扩展?

我的想法是——它可以接收一个请求并使用内存中的 Mule 服务器将请求-响应从一个组件传递到另一个组件。 另请注意,我们的任何流都没有出站端点,因为它们大多是 Fire 和 Forget 类型的流,状态更新由组件执行的数据库更新管理。

另外,为什么我需要为测试创建单独的 mule config xml 文件?如果我没有测试将实际部署在 Live 上的流 xml,那么这个测试的意义何在?如果我只是为测试创建单独的 xml 配置,这在某种程度上违背了我的目的...... 能否请一些专家解释一下,并指出与我们正在使用的测试类似的示例测试。

PS:Mule 内部的组件依赖于外部系统,如 web 服务、数据库等。对于功能测试,我们是否需要运行这些组件,还是应该模拟这些服务/数据库访问?

【问题讨论】:

  • 在回复这个之前,你对这个答案stackoverflow.com/a/13609415/387927有什么看法?
  • 嗨,大卫。感谢您对该主题的回答。
  • 嗨,大卫。如果您能在此线程中回答问题.. 期待您的解释

标签: esb mule


【解决方案1】:

https://blog.codecentric.de/en/2015/01/mule-esb-testing-part-13-unit-functional-testing/

https://developer.mulesoft.com/docs/display/current/Functional+Testing 请参考此链接 如您所见,这是一个扩展 FunctionalMunitSuite 类的普通 JUnit 测试。 在测试中我们需要做两件事:

准备 MuleEvent 对象作为我们流程的输入。我们可以通过使用提供的 testEvent(Object payload) 方法来做到这一点。 执行 runFlow(String flowName, MuleEvent event) 方法,指定要测试的流名称和我们在第一步中创建的事件。

【讨论】:

  • 请不要在答案中使用链接。当链接断开时,您的答案将变得毫无用处...尝试使用链接中的信息写一个有意义的答案。
【解决方案2】:

对您的 Mule 应用程序进行功能测试与测试任何依赖于外部资源(如数据库或 JMS 代理)的应用程序没有什么不同,因此您需要使用与标准应用程序相同的技术。

通常这意味着使用内存实现将资源存根,例如用于数据库的 HSQLDB 或用于 JMS 的瞬态 ActiveMQ 内存代理。对于 Mule 应用程序,这意味着将您的配置模块化,以便在单独的文件中定义“实时”传输,您可以在测试时将其替换为包含内存中变体的文件。

要验证 Mule 与资源的交互是否正确,您可以使用其 Java 客户端(例如 JDBC 或 JMS)直接读取资源,如果您想确保纯粹的非 Mule 客户端没有问题,这很好读取 Mule 发送的内容,或使用 MuleClient 从这些资源中读取或创建使用这些资源并将消息传递给 &lt;test:component&gt; 的流。

仅供参考Mule in Action, second edition 的第 12 章解释和演示了这些不同的技术。

【讨论】:

  • 谢谢大卫。好吧,在我们的应用程序中,我们使用 spring jdbc 连接到 DB,还使用 ​​Spring Webservices 连接到外部 Web 服务,而不是依赖于 Mule。你认为我们应该如何处理这种情况?您还可以回答为什么需要为测试编写单独的 mule-config xmls 吗?我们是否不能像我们正在测试的那样测试实际的生产配置 xml。创建单独的文件有点违背目的
  • 使用 Spring 推荐的任何技术来测试使用 Spring JDBC 和 webservice 的 bean,这与 Mule 无关。如果您打算针对生产基础架构运行测试,则使用单个文件,但您需要将这些消息标记为测试消息,否则您将弄乱生产数据。不,它不会破坏任何目的:孤立地测试是有价值的,例如证明流、它们包含的转换器等......按预期运行。
  • 谢谢大卫。当我说针对生产基础设施运行测试时,我指的是在生产中部署的相同流文件。然而,在运行测试时,我将排除外部服务和数据库,并指向相同的测试版本而不是 Live 源。我在 Mule 文档中注意到他们将流 xml 文件复制到一个新的测试文件中并在它们上编写测试。例如,将来如果我更改实际的流 xml 文件,我还需要将相同的更改复制到另一个测试文件中。人们会期望在同一段代码上运行测试和 Live,即流配置文件
  • 重新阅读我的答案:您只需将传输配置提取到另一个配置文件中,并在测试时将其替换为存根。对于测试和产品,包含所有流程的配置保持不变。
  • 是的。这就是我现在所做的。谢谢大卫
猜你喜欢
  • 2016-12-17
  • 2013-12-31
  • 1970-01-01
  • 1970-01-01
  • 2015-12-28
  • 1970-01-01
  • 2020-02-28
  • 1970-01-01
  • 2018-05-03
相关资源
最近更新 更多