我们可以使用JUNIT进行自动化集成测试吗?
2022-09-01 02:31:13
如何自动执行集成测试?我使用JUnit进行其中一些测试。这是解决方案之一还是完全错误?你有什么建议?
我使用JUnit进行了大量的集成测试。当然,集成测试可能意味着许多不同的事情。对于更多的系统级集成测试,我更喜欢让脚本从外部驱动我的测试过程。
对于使用http和数据库的应用程序,这里有一种非常适合我的方法,我想验证整个堆栈:
Hypersonic or H2
@BeforeSuite
@Before
每次测试,清除数据库并使用必要的数据进行初始化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进行嵌入式集成测试的文章。
JUnit工作。没有任何限制将其限制为仅作为单元测试。我们使用JUnit,Maven和CruiseControl来做CI。
可能有一些工具是专门用于集成测试的,但我认为它们的有用性取决于您正在集成的系统组件类型。JUnit 将适用于非 UI 类型测试。