我公司在过去7年中开发了一个中/大型Web应用程序。该应用程序使用Spring Framework(3.0),Hibernate(3.x)和Struts(1.x)等。不幸的是,我们没有使用任何类型的自动测试。现在我们需要添加它们以避免回归错误并开始更好的开发生命周期。 按照这项艰苦工作的最佳实践,我读到我们可以从烟雾测试开始,然后在添加单元测试之前进行集成测试。 所以我的问题是:关于集成测试(在容器中),这是Spring TestContextFramework和JBoss Arquillian之间的区别?我读过Arquillian将在它的最终版本中支持Spring(http://community.jboss.org/message/563768)。一旦稳定,我会有一些使用它的好处吗?
谢谢, 斯特凡诺。
答案 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
ApplicationContext
和WebApplicationContext
以及缓存这些上下文。 [1]
可选择通过配置测试类的实例 依赖注入。 [2]
为事务测试提供事务管理:框架将为每个测试创建和回滚事务。
提供了抽象类,可以由开发人员扩展,以便轻松编写JUnit或TestNG测试用例类。
## Arquillian ##
Arquillian在真实运行时环境中运行集成测试,其生命周期由Arquillian管理。 实际上,使用Arquillian,您的集成测试要么在容器内执行,要么作为客户端与容器进行交互。
容器可能是:
Arquillian:
管理容器的生命周期(开始/停止),
将依赖类和资源的测试类捆绑到一个 可部署档案,
增强了测试类(例如,解析@Inject,@ EJB和@Resource 注射),
部署存档以进行测试(部署/取消部署),
捕获结果和失败。
#如何运作/ strong>
Arquillian为JUnit和TestNG提供了一个自定义测试运行器。
@RunWith Arquillian
声明。因此,自定义测试运行器将测试执行生命周期的控制权从单元测试框架(JUnit或TestNG)转移到Arquillian。
对于每个测试用例: