Можем ли мы использовать 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/