我们可以使用 JUNIT 进行自动化集成测试吗?
-
08-07-2019 - |
题
你如何实现自动化 集成测试?我使用 JUnit 进行其中一些测试。这是解决方案之一还是完全错误?你有什么建议?
解决方案
JUnit有效。没有限制将其限制为仅进行单元测试。我们使用JUnit,Maven和CruiseControl来进行CI。
可能有专门用于集成测试的工具,但我认为它们的用处取决于您要集成的系统组件类型。 JUnit适用于非UI类型测试。
其他提示
我使用JUnit进行了大量的集成测试。当然,集成测试可能意味着许多不同的事情。对于更多系统级集成测试,我更喜欢让脚本从外部驱动我的测试过程。
对于使用http和数据库并且我想验证整个堆栈的应用程序,这种方法适用于我:
- 在内存模式下使用
Hypersonic或H2
作为数据库的替代品(这最适合ORM) - 在
@BeforeSuite
或同等程序中初始化数据库(再次:使用ORM最简单) - 使用Jetty启动进程内Web服务器。
-
@Before
每次测试,清除数据库并用必要的数据初始化 - 使用
JWebUnit
执行对Jetty的HTTP请求
醇>
这为您提供了集成测试,无需任何数据库或应用程序服务器设置即可运行,并且可以从http向下运行堆栈。由于它不依赖于外部资源,因此该测试在构建服务器上运行良好。
这里有一些我使用的代码:
@BeforeClass
public static void startServer() throws Exception {
System.setProperty("hibernate.hbm2ddl.auto", "create");
System.setProperty("hibernate.dialect", "...");
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setJdbcUrl("jdbc:hsqldb:mem:mytest");
new org.mortbay.jetty.plus.naming.Resource(
"jdbc/primaryDs", dataSource);
Server server = new Server(0);
WebAppContext webAppContext = new WebAppContext("src/main/webapp", "/");
server.addHandler(webAppContext);
server.start();
webServerPort = server.getConnectors()[0].getLocalPort();
}
// From JWebUnit
private WebTestCase tester = new WebTestCase();
@Before
public void createTestContext() {
tester.getTestContext().setBaseUrl("http://localhost:" + webServerPort + "/");
dao.deleteAll(dao.find(Product.class));
dao.flushChanges();
}
@Test
public void createNewProduct() throws Exception {
String productName = uniqueName("product");
int price = 54222;
tester.beginAt("/products/new.html");
tester.setTextField("productName", productName);
tester.setTextField("price", Integer.toString(price));
tester.submit("Create");
Collection<Product> products = dao.find(Product.class);
assertEquals(1, products.size());
Product product = products.iterator().next();
assertEquals(productName, product.getProductName());
assertEquals(price, product.getPrice());
}
对于那些想要了解更多信息的人,我写了关于在Java.net上使用Jetty和JWebUnit进行嵌入式集成测试的文章。
使用Maven构建项目时,我对 TestNG 有了更多的运气,因为它有 @BeforeSuite
和 @AfterSuite
操作。这是有用的,因为如果任何集成测试失败,Maven将不会执行'post-integration-test`。这不是Ant的问题,所以我只是偏爱使用jUnit。
在任何一种情况下,将测试分割为TestNG和jUnit都有助于集成测试。
在我们的工作中,我们的集成测试解决方案有三个主要部分:
- CruiseControl 是我们持续集成方法的基础。
- 我们的CruiseControl配置会在任何人登录 Subversion 后3分钟内开始快速测试。这里发生的测试是“一切还在编译吗?”并且“单元测试是否仍然通过?”。 JUnit 显然是回答第二个问题的主要推动者。
- 每小时,它都会启动一个更大的构建,构建我们在各种部署平台上使用的在线帮助和安装程序。此步骤验证了“我们是否仍为每个目标平台提供可部署产品?”这一更大的问题? 醇>
最终结果是,大多数人从不担心集成测试:它只是发生了。另一方面,单元测试是每个人的首要任务。 JUnit使构建测试变得容易,但良好的测试总是需要思考和开发时间。
是的,您可以使用 junit 进行集成测试,但这取决于您需要的集成测试类型。
测试 Servlet:
- 设置 servlet 上下文和配置
- 使用模拟 servlet 请求进行测试(Spring 支持这一点,但您也可以使用 EasyMock 或您自己的模拟)
测试弹簧应用程序:
- 使用 AbstractDependencyInjectionSpringContextTests 设置上下文
- 测试有线 bean
- 还有 AbstractDependencyInjectionSpringContextTests 的子类支持在使用数据库进行测试时的事务处理。
但纯粹的 Junit 有其局限性。测试用户界面是一个典型的案例。您可以将 selenium 用于 Web 应用程序、soapui 用于 Web 服务或其他适当的工具。
但无论您使用什么,都应该可以将其集成到您的连续构建中(巡航控制、团队城市或其他)。
当然! 我们结合使用JUnit,ANT任务来运行它们,并使用 Hudson 进行持续集成测试。像魅力一样。
该建议取决于您的应用和目标。
我已经在 JUnit 中编写了集成测试,但我也看到人们使用 HtmlUnit(JUnit 扩展)、Selenium、Watir、Fit/Fitness,甚至像 WinRunner 和 Silk 这样的商业工具。
因此,请告诉我们更多有关您的领域和测试目标的信息,您可能会得到更好的答案。
JUnit有一个非常好的扩展名为Jitr。
Jitr是一个JUnit集成测试运行器,它允许您的Web应用程序集成测试轻松地在与测试相同的JVM中的轻量级Web容器上运行。
有关详细信息,请访问其网站: http://www.jitr.org/
2012年更新:虽然可以使用JUnit(并从CI支持中获益)但JWebUnit和Selenium似乎正在吞噬整合测试的思想。
我认为自动化和集成测试不能很好地协同作用。在每次测试之前,最基本的问题是环境设置。需要更多集成型测试更大的设置。
我对集成层测试自动化的看法: http://blog.aplikacja.info/2012/03/whats-wrong-with-automated-integration-tests/