Как вы автоматизируете интеграционное тестирование? Я использую JUnit для некоторых из этих тестов. Это одно из решений или совершенно неправильно? Что вы предлагаете?
Можем ли мы использовать JUNIT для тестирования автоматизированной интеграции?
Ответ 1
Работает JUnit. Нет ограничений, которые ограничивают его только модульными испытаниями. Мы используем JUnit, Maven и CruiseControl для выполнения CI.
Могут быть инструменты, специфичные для тестирования интеграции, но я думаю, что их полезность зависит от того, какие типы компонентов системы вы интегрируете. JUnit отлично работает для тестирования типа UI.
Ответ 2
Я использовал JUnit для проведения комплексного тестирования. Интеграционное тестирование может, конечно, означать много разных вещей. Для более сложных тестов интеграции на уровне системы я предпочитаю, чтобы сценарии приводили мой процесс тестирования извне.
Вот подход, который хорошо подходит для приложений, использующих http и базы данных, и я хочу проверить весь стек:
- Используйте
Hypersonic or H2
в режиме памяти в качестве замены базы данных (это лучше всего подходит для ORM) - Инициализировать базу данных в
@BeforeSuite
или эквивалентном (снова: проще всего с ORM) - Используйте Jetty для запуска веб-сервера в процессе.
-
@Before
каждый тест, очистить базу данных и инициализировать необходимыми данными - Используйте
JWebUnit
для выполнения HTTP-запросов к Jetty
Это дает вам интеграционные тесты, которые могут запускаться без какой-либо настройки сервера базы данных или приложений, и который выполняет стек с http down. Поскольку он не имеет зависимости от внешних ресурсов, этот тест отлично работает на сервере сборки.
Вот код, который я использую:
@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.
Ответ 3
При использовании Maven для создания проекта мне повезло с TestNG, поскольку он имеет @BeforeSuite
и @AfterSuite
. Это полезно, потому что Maven не выполнит "пост-интеграционный тест", если какой-либо из тестов интеграции завершится с ошибкой. Не проблема с Ant, поэтому я просто использую jUnit из предпочтения с ней.
В любом случае сегментирование тестов, как и TestNG, так и jUnit, также полезно для тестов интеграции.
Ответ 4
В нашей работе наше тестовое решение для интеграции имеет три основные части:
- CruiseControl является основой нашей методологии непрерывной интеграции.
- Наша конфигурация CruiseControl запускает сборку быстрых тестов в течение 3 минут после того, как кто-либо проверит Subversion. Тесты, которые происходят здесь, "все ли еще компилируются?" и "все ли модульные тесты все еще проходят?". JUnit, очевидно, является основным посредником в ответе на другие вопросы.
- Каждый час он запускает большую сборку, которая создает интерактивную справку и инсталляторы, которые мы используем на разных платформах развертывания. Этот шаг проверяет более обширные вопросы: "У нас еще есть продукт для развертывания для каждой из наших целевых платформ?"
Конечным результатом является то, что большинство людей здесь никогда не беспокоятся об интеграционном тестировании: это просто происходит. С другой стороны, тестирование единиц является приоритетом для всех. JUnit позволяет легко создавать тесты, хотя хорошие тесты всегда потребуют мысли и времени разработки.
Ответ 5
Да, вы можете использовать junit для тестов интеграции, но это зависит от типа теста интеграции, который вам нужен.
Тестирование сервлета:
- настроить контекст сервлета и конфигурацию
- выполните тесты с использованием mock-запросов сервлетов (Spring имеет поддержку для этого, но вы также можете использовать EasyMock или свои собственные mocks)
Тестирование приложения spring:
- использовать AbstractDependencyInjectionSpringContextTests для настройки контекста
- проверить проводные beans
- существуют также подклассы AbstractDependencyInjectionSpringContextTests, поддерживающие обработку транзакций при тестировании с помощью базы данных.
Но у чистого Юнита есть предел. Тестирование пользовательских интерфейсов является типичным случаем. Вы можете использовать селен для веб-приложений, soapui для веб-сервисов или других соответствующих инструментов.
Но что бы вы ни использовали, его можно было бы интегрировать в вашу непрерывную сборку (круиз-контроль, город команды или что-то еще).
Ответ 6
Конечно! Мы используем комбинацию задач JUnit, ANT для их запуска, а Hudson для продолжения интеграционных тестов. Работает как шарм.
Ответ 7
Предложение зависит от вашего приложения и вашей цели.
Я написал интеграционные тесты в JUnit, но я также видел, что люди используют HtmlUnit (расширение JUnit), Selenium, Watir, Fit/Fitness и даже коммерческие инструменты, такие как WinRunner и Silk.
Так расскажите нам немного больше о своем домене и целях ваших тестов, и вы, вероятно, сможете получить лучший ответ.
Ответ 8
Существует очень хорошее расширение для JUnit, называемое Jitr.
Jitr является JUnit Integration Test Runner, и он позволяет вашим тестам интеграции веб-приложений легко работать с легким веб-контейнером в той же JVM, что и ваши тесты.
Подробнее см. на сайте: http://www.jitr.org/
Ответ 9
Обновление за 2012 год: в то время как JUnit может использоваться (и выгоды от поддержки CI) JWebUnit и Selenium, по-видимому, едят мозговой штурм для тестирования интеграции.
Ответ 10
Я думаю, что тесты автоматизации и интеграции плохо сочетаются. Самая основная проблема - настройка среды перед каждым тестом. Требуется более крупная установка для тестирования типа интеграции.
Мои мысли о автоматизации тестирования на уровне интеграции: http://blog.aplikacja.info/2012/03/whats-wrong-with-automated-integration-tests/