📜  MuleSoft-使用MUnit进行测试(1)

📅  最后修改于: 2023-12-03 15:03:03.829000             🧑  作者: Mango

MuleSoft-使用MUnit进行测试

什么是MUnit?

MUnit是MuleSoft的测试框架,它能够对Mule应用程序进行单元测试、集成测试和端对端测试以及模拟测试,首页地址:https://www.mulesoft.com/platform/munit

MUnit的优势
  1. 轻松编写测试代码,MUnit提供了基于Java的DSL,使得测试代码能够以更简洁、易于理解的方式进行编写。

  2. 支持多种测试类型,包括单元测试、集成测试和模拟测试,让测试人员能够全面、高效地检查应用程序的各个方面。

  3. 集成Mule运行时,可以在Mule平台上快速创建、运行和验证测试用例,以及对应的Mock服务调用。

如何使用MUnit?
1. 安装MUnit

首先需要确保在Mule项目中正确添加了MUnit的依赖项,例如:

<dependency>
  <groupId>org.mule.modules</groupId>
  <artifactId>mule-module-munit</artifactId>
  <version>${munit.version}</version>
  <scope>test</scope>
</dependency>

在使用MUnit之前,还需要确保已经正确安装了Anypoint Studio和Mule运行时。

2. 创建测试用例

MUnit测试用例通常由几个部分组成:

  1. Mule配置文件:用于设定Mule中使用的连接器、端点和数据映射等配置。

  2. 测试流程:用于定义测试流程和消息封装,以及对输出流的校验等操作。

  3. MUnit测试语句:用于检查Mule应用程序是否符合我们的预期。

例如:

<munit:config name="munit" doc:name="MUnit configuration" />
<flow name="testFlow">
    <http:listener config-ref="HTTP_Listener_Configuration" path="/test" doc:name="HTTP" />
    <set-payload value="#['hello, world!']" doc:name="Set Payload" />
    <logger level="INFO" doc:name="Logger" />
</flow>

<munit:test name="testFlowTest" description="Test">
    <munit:set payload="#['test data']" doc:name="Set Message Payload" />
    <flow-ref name="testFlow" doc:name="Flow Reference" />
    <munit:assert-payload-equals expectedValue="hello, world!" doc:name="Assert Payload Equals" />
</munit:test>

该测试用例包含了一个流,其中的组件将一个固定的字符串输出到控制台上。然后MUnit运行该流程,将一个新的字符串插入到流程中,并检查流程输出的字符串是否与我们预期的字符串相同。如果检查通过,则测试用例通过。稍后会对这里进行详细的讲解。

3. 运行测试用例

测试用例创建完成后,我们需要在Mule鼠标上右键,然后选择“Run MUnit Suite”菜单项以验证测试结果。测试工具将读取Munit配置文件,并执行在Munit测试语句中指定的所有测试,然后返回测试结果。

MUnit测试语句
  • MUnit基础验证器

常用的MUnit基础验证器有:

  1. assert-truth:当Mule出现任何null或false值时,抛出一个validation异常, 然后中断测试流程。

  2. assert-true:断言此值为true, 如果该值不是true,则抛出validation异常,然后中断测试流程。

  3. assert-false:断言此值为false, 如果该值不是false,则抛出validation异常,然后中断测试流程。

  4. assert-not-null: 断言此值不为null, 如果该值是null,则抛出validation异常,然后中断测试流程。

  5. assert-null:断言此值为null, 如果该值不是null,则抛出validation异常,然后中断测试流程。

例如:

<munit:verify-throws message="unexpected message" exception="java.lang.RuntimeException" doc:name="Verify Throws" >
<message-processor-chain>
    <expression-component>throw new RuntimeException()</expression-component>
</message-processor-chain>
</munit:verify-throws>

该测试用例包含一个verify-throws块,用于验证抛出异常的条件是否合法。MUnit会读取该块中的代码,验证代码是否会引发RuntimeException异常。

  • 消息验证器

MUnit提供了许多消息验证器,以验证消息的内容、属性、日期等等,包括:

  1. assert-payload-equals:比较预期和接收消息的负载内容是否相等。

  2. assert-not-empty:如果发现负载中存在空值,则抛出validation异常,然后中断测试流程。

  3. assert-object-same:比较两个负载对象是否相同。

  4. assert-xml-payload:验证xmlpayload。

例如:

<munit:assert-payload-equals expectedValue="Hello, World!" doc:name="Assert Payload Equals" />

该测试用例包含assert-payload-equals块,用于验证Mule的输出是否符合预期。MUnit会比较预期输出和实际输出的内容,如果不同,则抛出validation异常,然后中断测试流程。

  • MUnit Mocking

MUnit还提供了Mocking功能,它允许我们模拟与外部系统的交互、可测试性以及按预期返回结果的情况。例如,模拟HTTP的GET请求或模拟数据库连接器。MUnit的Mocking使用Mockito的mocks。

<munit:mock-when messageProcessor="http:outbound-endpoint" doc:name="Mock Endpoint">
            <munit:then-return messageProcessor="http:outbound-endpoint" ><![CDATA[#[payload]]]></munit:then-return>
</munit:mock-when>

该测试用例中的mock-when和then-return块就是Mocking的一部分。在这个例子中,我们模拟了一个http:outbound-endpoint,然后释放persistent连接,这样我们就可以模拟许多与外部连接器交互的情况了。