Я использовал JUnit для большого количества интеграционных тестов. Конечно, интеграционное тестирование может означать много разных вещей. Для других тестов интеграции на системном уровне я предпочитаю, чтобы скрипты управляли процессом тестирования извне.
Вот подход, который мне подходит для приложений, использующих http и базы данных, и я хочу проверить весь стек:
- Использование
Hypersonic or H2
в режиме в памяти в качестве замены базы данных (лучше всего подходит для ORM)
- Инициализировать базу данных в
@BeforeSuite
или эквивалентном (опять же: проще всего с ORM)
- Используйте Jetty для запуска внутрипроцессного веб-сервера.
@Before
каждый тест, очистка базы данных и инициализация с необходимыми данными
- Используйте
JWebUnit
для выполнения HTTP-запросов к Jetty
Это дает вам интеграционные тесты, которые могут выполняться без какой-либо настройки базы данных или сервера приложений и которые осуществляют стек с 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());
}
Для тех, кто хотел бы узнать больше, я написал статью о встроенных тестах интеграции с Jetty и JWebUnit на Java.net.