我们可以使用JUNIT进行自动集成测试吗?

时间:2008-11-12 18:03:33

标签: java unit-testing integration-testing

如何自动化integration testing?我使用JUnit进行其中一些测试。这是解决方案之一还是完全错误的?你有什么建议?

10 个答案:

答案 0 :(得分:42)

我使用JUnit进行了大量的集成测试。当然,集成测试可能意味着许多不同的事情。对于更多系统级集成测试,我更喜欢让脚本从外部驱动我的测试过程。

对于使用http和数据库并且我想验证整个堆栈的应用程序,这种方法适用于我:

  1. 在内存模式下使用Hypersonic or H2作为数据库的替代品(这最适合ORM)
  2. 使用@BeforeSuite或同等数据库初始化数据库(再次:使用ORM最简单)
  3. 使用Jetty启动进程内Web服务器。
  4. 每次测试
  5. @Before,清除数据库并使用必要的数据初始化
  6. 使用JWebUnit执行对Jetty的HTTP请求
  7. 这为您提供了集成测试,无需任何数据库或应用程序服务器设置即可运行,并且可以从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)

在我们的工作中,我们的集成测试解决方案有三个主要部分:

  1. CruiseControl是我们持续整合方法的基础。
  2. 我们的CruiseControl配置会在任何人签到Subversion后的3分钟内开始快速测试。这里发生的测试是“一切还在编译吗?”并且“单元测试是否仍然通过?”。 JUnit显然是回答第二个问题的主要推动者。
  3. 每小时,它都会启动一个更大的构建,构建我们在各种部署平台上使用的在线帮助和安装程序。此步骤验证了“我们是否仍然为每个目标平台提供可部署产品?”的更大问题。
  4. 最终结果是,大多数人从不担心集成测试:它只是发生了。另一方面,单元测试是每个人的首要任务。 JUnit使构建测试变得容易,但良好的测试总是需要思考和开发时间。

答案 4 :(得分:1)

是的,您可以使用junit进行集成测试,但这取决于您需要的集成测试类型。

测试servlet:

  • 设置servlet上下文和配置
  • 使用模拟servlet请求进行测试(Spring支持此功能,但您也可以使用EasyMock或自己的模拟)

测试弹簧应用程序:

  • 使用AbstractDependencyInjectionSpringContextTests来设置上下文
  • 测试有线bean
  • 在使用数据库进行测试时,还有AbstractDependencyInjectionSpringContextTests的子类支持事务处理。

但是纯粹的Junit有它的极限。测试用户界面是一种典型案例。您可以将selenium用于Web应用程序,soapui用于Web服务或其他适当的工具。

但无论您使用什么,都应该可以将它整合到您的连续构建中(巡航控制,团队城市或其他任何方式)。

答案 5 :(得分:0)

当然! 我们结合使用JUnit,ANT任务来运行它们,并使用Hudson进行持续集成测试。像魅力一样。

答案 6 :(得分:0)

建议取决于您的申请和目标。

我在JUnit中编写了集成测试,但我也看到人们使用HtmlUnit(JUnit扩展),Selenium,W​​atir,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/