如何自动化integration testing?我使用JUnit进行其中一些测试。这是解决方案之一还是完全错误的?你有什么建议?
答案 0 :(得分:42)
我使用JUnit进行了大量的集成测试。当然,集成测试可能意味着许多不同的事情。对于更多系统级集成测试,我更喜欢让脚本从外部驱动我的测试过程。
对于使用http和数据库并且我想验证整个堆栈的应用程序,这种方法适用于我:
Hypersonic or H2
作为数据库的替代品(这最适合ORM)@BeforeSuite
或同等数据库初始化数据库(再次:使用ORM最简单)@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上写了article about Embedded Integration Tests with Jetty and JWebUnit。
答案 1 :(得分:16)
JUnit有效。没有限制将其限制为仅进行单元测试。我们使用JUnit,Maven和CruiseControl来进行CI。
可能有专门用于集成测试的工具,但我认为它们的用处取决于您要集成的系统组件类型。 JUnit适用于非UI类型测试。
答案 2 :(得分:5)
使用Maven构建项目时,我对TestNG有了更多的好运,因为它有@BeforeSuite
和@AfterSuite
个操作。这是有用的,因为如果任何集成测试失败,Maven将不会执行'post-integration-test`。这不是Ant的问题,所以我只是偏爱使用jUnit。
在任何一种情况下,将测试分割为TestNG和jUnit都有助于集成测试。
答案 3 :(得分:2)
在我们的工作中,我们的集成测试解决方案有三个主要部分:
最终结果是,大多数人从不担心集成测试:它只是发生了。另一方面,单元测试是每个人的首要任务。 JUnit使构建测试变得容易,但良好的测试总是需要思考和开发时间。
答案 4 :(得分:1)
是的,您可以使用junit进行集成测试,但这取决于您需要的集成测试类型。
测试servlet:
测试弹簧应用程序:
但是纯粹的Junit有它的极限。测试用户界面是一种典型案例。您可以将selenium用于Web应用程序,soapui用于Web服务或其他适当的工具。
但无论您使用什么,都应该可以将它整合到您的连续构建中(巡航控制,团队城市或其他任何方式)。
答案 5 :(得分:0)
当然! 我们结合使用JUnit,ANT任务来运行它们,并使用Hudson进行持续集成测试。像魅力一样。
答案 6 :(得分:0)
建议取决于您的申请和目标。
我在JUnit中编写了集成测试,但我也看到人们使用HtmlUnit(JUnit扩展),Selenium,Watir,Fit / Fitness,甚至是WinRunner和Silk等商业工具。
请告诉我们有关您的域名和测试目标的更多信息,您可以获得更好的答案。
答案 7 :(得分:0)
JUnit有一个非常好的扩展名为Jitr。
Jitr是一个JUnit集成测试运行器,它允许您的Web应用程序集成测试轻松地在与测试相同的JVM中的轻量级Web容器上运行。
有关详细信息,请访问其网站:http://www.jitr.org/
答案 8 :(得分:0)
2012年更新:虽然可以使用JUnit(并从CI支持中获益)但JWebUnit和Selenium似乎正在吞噬整合测试的思想。
答案 9 :(得分:-1)
我认为自动化和集成测试不能很好地协同作用。在每次测试之前,最基本的问题是环境设置。需要更多集成型测试更大的设置。
我对集成层测试自动化的看法:http://blog.aplikacja.info/2012/03/whats-wrong-with-automated-integration-tests/