我已经将Junit和CI用于纯粹基于Java的应用程序,它非常有用。 Junit用于通过传递其输入值(参数)来对操作/方法的测试用例进行单元化,并期望返回值应与条件匹配。通常我们测试junit用于基于纯Java的应用程序,该应用程序具有Controller,Service和DAO层。有时使用模拟对象来模拟/代理第三方应用程序。
现在,我有基于Mule的ESB应用程序,它有http连接器,带有raml的api工具包,调度程序,云连接到sfdc,ActiveMQ,smtp,连接到多个数据库的JDBC,datampaper,datewave并继续..
最后,Mule应用程序是一个带有Java / Groovy和其他一些技术的xml文件。 Java组件只占应用程序构建组件的10%(或有时没有)。
我计划与Jenkins持续集成。为此,我需要运行Junit框架来对应用程序进行回归测试。我希望Munit不会使用CI,因为Munit必须用Studio执行,它是用xml文件编写的。
由于构建的应用程序不是完整的基于Java的应用程序(我们可以在其中编写单元测试 - 断言操作及其返回值),因此会出现问题:
此外,构建ESB应用程序以运行不同的进程以集成在一起。将Junit用于基于ESB的应用程序的CI是否是一个很好的架构建议?或者在没有CI和Junit测试的情况下构建,手动测试和在服务器中部署应用程序?
答案 0 :(得分:3)
您似乎对实施Mule ESB应用程序的持续集成提出了许多担忧。我将尝试陈述并回答您在下面的每个问题。如果我不明白,请更新问题,我会相应地修改答案。
我的CI流程是否仅限于基于junit的测试,还是我还可以使用MUnit测试?
如果使用maven自动化构建,则可以在CI过程中包括基于MUnit的测试和基于junit的测试。要运行MUnit测试,请将以下插件添加到POM中:
<plugin>
<groupId>com.mulesoft.munit.tools</groupId>
<artifactId>munit-maven-plugin</artifactId>
<version>1.0.0</version>
<executions>
<execution>
<id>test</id>
<phase>test</phase>
<goals>
<goal>test</goal>
</goals>
</execution>
</executions>
</plugin>
我是否应该花费更多时间和精力为Mule应用程序编写测试而不是纯Java应用程序?
我会回答我建议为Mule应用程序编写的两类测试。
首先,我认为最重要的是功能测试。这些应该是粗粒度,黑盒子和孤立的。它们是用JUnit编写的,基于Mule TCK and the FunctionalTestCase基类。开发这些测试的熟练程度似乎需要一段时间,并且在几个不同的应用程序上经验丰富。一旦掌握了它,并构建了一组你喜欢的支持java库,我希望这些库与“纯java”中的等价文件一样长。
单元测试主要使用MUnit编写,测试流程或子流程使用特定的输入消息。这些似乎占用了与使用junit进行“纯java”相同的开发时间。学习曲线也相当快:对于使用TDD的java开发人员,我希望有几天能够对Mule开发有一个很好的理解。
有没有办法测量我的Mule应用程序测试套件的代码覆盖率?
我还没有看到任何方法来衡量CI流程的覆盖范围。但是,Anypoint Studio can measure coverage在开发时。
考虑到编写自动化测试所需的时间,以及缺乏设计时间重用,花时间手动测试而不是创建自动化测试套件和实施CI流程会更聪明吗?
没有。我已经在许多Mule开发项目和六个团队中实现了与自动化测试的持续集成,这些团队并没有全部响应,100%热情地采用。 :)您在前几个项目中花费的额外开发时间很快就会被遗忘,而软件的使用寿命仍然存在。
答案 1 :(得分:1)
Mule ESB完全基于Java / Spring。如果您将项目设置为具有正确依赖关系的maven项目,那么您可以在Studio之外运行munit测试。
高级培训课程实际上涵盖了这一点。 https://training.mulesoft.com/instructor-led-training/advanced-development-online-37