Spring TestContext Framework和Jboss Arquillian之间的区别

时间:2011-02-07 14:42:53

标签: unit-testing spring integration-testing

我公司在过去7年中开发了一个中/大型Web应用程序。该应用程序使用Spring Framework(3.0),Hibernate(3.x)和Struts(1.x)等。不幸的是,我们没有使用任何类型的自动测试。现在我们需要添加它们以避免回归错误并开始更好的开发生命周期。 按照这项艰苦工作的最佳实践,我读到我们可以从烟雾测试开始,然后在添加单元测试之前进行集成测试。 所以我的问题是:关于集成测试(在容器中),这是Spring TestContextFramework和JBoss Arquillian之间的区别?我读过Arquillian将在它的最终版本中支持Spring(http://community.jboss.org/message/563768)。一旦稳定,我会有一些使用它的好处吗?

谢谢, 斯特凡诺。

3 个答案:

答案 0 :(得分:1)

我从未使用过Arquillian,但它似乎专注于EJB测试,重点是部署到活动容器。如果您的应用程序基于Spring(+ Hibernate),则Spring Test支持可能是最佳选择。

在测试用例中,您可以使用模拟的内存数据库启动应用程序上下文的一部分(只有一小部分或几乎整个应用程序)。你不需要一个正在运行的容器,因为Spring大多是独立的。测试Struts 1.x动作更难,但我猜Arquillian也不会帮助你。

此外,如果您担心软件稳定性,Arquillian现在似乎是Alpha版本。但我肯定会给它一个机会,我必须测试基于EJB的应用程序。对于Spring应用程序,使用上下文缓存,测试中的事务划分等.TestContext Framework是最佳选择。

附注:考虑使用TestNG而不是JUnit,因为它使用TestContext播放得更好,例如:你可以在setup /拆除方法中访问Spring bean(在JUnit中是静态的)。

答案 1 :(得分:1)

我自己是Arquillian用户,但我建议您坚持使用Spring的解决方案。虽然最终它将与容器无关,但现在努力的重点是Java EE。你的工作似乎很难,我暂时不推荐Aquillian。

但是,为了消除一些困惑,您可以在Arquillian上运行嵌入式测试。它可以引导嵌入的Glassfish或JBoss AS服务器,并使用“真实的东西”而不是模拟或替代实现来运行测试。 JPA,拦截器,JTA,XA数据源,JMS,JSF,Servlet。所有可用 - 包括电池;)

或者,您可以在后台启动JBoss实例并远程运行测试。 Arquillian负责部署/测试/取消部署周期 - 而且速度非常快!

答案 2 :(得分:1)

我从未使用过任何一种,但这是我对文件的总结:

## Spring Integration Tests ##

Spring允许执行一些集成测试,而无需部署到应用程序服务器

Spring对单元测试集成测试的支持由 Spring TestContext Framework 提供,它与使用中的测试框架无关(JUnit, TestNG等。)。

TestContext Framework提供:

  •   

    一致加载Spring ApplicationContextWebApplicationContext以及缓存这些上下文。 [1]

  •   

    可选择通过配置测试类的实例   依赖注入。 [2]

  • 为事务测试提供事务管理:框架将为每个测试创建和回滚事务。

  • 提供了抽象类,可以由开发人员扩展,以便轻松编写JUnit或TestNG测试用例类。

## Arquillian ##

Arquillian在真实运行时环境中运行集成测试,其生命周期由Arquillian管理。 实际上,使用Arquillian,您的集成测试要么在容器内执行,要么作为客户端与容器进行交互。

容器可能是:

  • 嵌入式或远程Servlet容器(例如,Tomcat,Jetty),
  • Java EE应用程序服务器(例如,GlassFish,JBoss AS,Embedded GlassFish),
  • Java SE CDI环境
  • 或提供的任何其他容器实现

Arquillian:

  • 管理容器的生命周期(开始/停止),

  • 将依赖类和资源的测试类捆绑到一个 可部署档案,

  • 增强了测试类(例如,解析@Inject,@ EJB和@Resource 注射),

  • 部署存档以进行测试(部署/取消部署),

  • 捕获结果和失败。

#如何运作

Arquillian为JUnit和TestNG提供了一个自定义测试运行器。

  1. 运行测试时,此自定义测试运行器将检测@RunWith Arquillian声明。
  2. 因此,自定义测试运行器将测试执行生命周期的控制权从单元测试框架(JUnit或TestNG)转移到Arquillian。

  3. 对于每个测试用例:

    1. Arquillian将使用ShrinkWrap创建"微档案"。 ShrinkWrap允许的类路径控制使Arquillian能够以声明方式定义一个自定义Java EE归档,它封装了测试类及其相关资源,但仅此而已!这使您可以对测试内容以及执行测试时可用的资源进行细粒度控制。
    2. Arquillian部署每个"微档案"对于目标容器(在maven配置文件中配置),我逐一假设。
    3. 然后协商执行测试方法并使用与服务器的远程通信捕获测试结果。
    4. 最后,Arquillian取消部署测试档案。