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

2022-09-01 02:31:13

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


答案 1

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

对于使用http和数据库的应用程序,这里有一种非常适合我的方法,我想验证整个堆栈:

  1. 在内存模式下用作数据库的替代品(这最适合 ORM)Hypersonic or H2
  2. 初始化数据库或等效项(再次:使用 ORM 最容易)@BeforeSuite
  3. 使用 Jetty 启动进程内 Web 服务器。
  4. @Before每次测试,清除数据库并使用必要的数据进行初始化
  5. 用于执行对 Jetty 的 HTTP 请求JWebUnit

这为您提供了集成测试,这些测试可以在不设置任何数据库或应用程序服务器的情况下运行,并且可以从 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进行嵌入式集成测试的文章


答案 2

JUnit工作。没有任何限制将其限制为仅作为单元测试。我们使用JUnit,Maven和CruiseControl来做CI。

可能有一些工具是专门用于集成测试的,但我认为它们的有用性取决于您正在集成的系统组件类型。JUnit 将适用于非 UI 类型测试。


推荐