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

有帮助吗?

解决方案

JUnit有效。没有限制将其限制为仅进行单元测试。我们使用JUnit,Maven和CruiseControl来进行CI。

可能有专门用于集成测试的工具,但我认为它们的用处取决于您要集成的系统组件类型。 JUnit适用于非UI类型测试。

其他提示

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

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

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

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

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

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

测试 Servlet:

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

测试弹簧应用程序:

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

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

但无论您使用什么,都应该可以将其集成到您的连续构建中(巡航控制、团队城市或其他)。

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

该建议取决于您的应用和目标。

我已经在 J​​Unit 中编写了集成测试,但我也看到人们使用 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/

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top