Можем ли мы использовать JUNIT для автоматического тестирования интеграции? - PullRequest
37 голосов
/ 12 ноября 2008

Как вы автоматизируете интеграционное тестирование ? Я использую JUnit для некоторых из этих тестов. Это одно из решений или это совершенно неправильно? Что вы предлагаете?

Ответы [ 10 ]

42 голосов
/ 12 ноября 2008

Я использовал JUnit для большого количества интеграционных тестов. Конечно, интеграционное тестирование может означать много разных вещей. Для других тестов интеграции на системном уровне я предпочитаю, чтобы скрипты управляли процессом тестирования извне.

Вот подход, который мне подходит для приложений, использующих http и базы данных, и я хочу проверить весь стек:

  1. Использование Hypersonic or H2 в режиме в памяти в качестве замены базы данных (лучше всего подходит для ORM)
  2. Инициализировать базу данных в @BeforeSuite или эквивалентном (опять же: проще всего с ORM)
  3. Используйте Jetty для запуска внутрипроцессного веб-сервера.
  4. @Before каждый тест, очистка базы данных и инициализация с необходимыми данными
  5. Используйте 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.

16 голосов
/ 12 ноября 2008

Юнит работает. Нет никаких ограничений, которые ограничивают его только для юнит-тестов. Мы используем JUnit, Maven и CruiseControl для выполнения CI.

Могут быть инструменты, специфичные для интеграционного тестирования, но я думаю, что их полезность зависит от типа системных компонентов, которые вы интегрируете. JUnit отлично подойдет для тестирования типов без пользовательского интерфейса.

5 голосов
/ 12 ноября 2008

При использовании Maven для создания проекта мне повезло больше с TestNG , потому что он имеет операции @BeforeSuite и @AfterSuite , Это полезно, потому что Maven не выполнит «post-интеграционный тест», если какой-либо из интеграционных тестов не пройден. С Ant нет проблем, поэтому я просто использую jUnit по своему усмотрению.

В любом случае сегментирование тестов, как это делают и TestNG, и jUnit, полезно и для интеграционных тестов.

2 голосов
/ 12 ноября 2008

В нашей работе наше интеграционное тестовое решение состоит из трех основных частей:

  1. CruiseControl является основой нашей методологии непрерывной интеграции.
  2. Наша конфигурация CruiseControl запускает быструю тестовую сборку в течение 3 минут после того, как кто-либо зарегистрировался на Subversion . Происходящие здесь тесты "все ли еще компилируется?" и "все ли модульные тесты все еще проходят?" JUnit , очевидно, является основным помощником в ответе на вторые вопросы.
  3. Каждый час запускается более крупная сборка, в которой собраны интерактивная справка и установщики, которые мы используем на наших различных платформах развертывания. Этот шаг проверяет более важные вопросы: «У нас еще есть развертываемый продукт для каждой из наших целевых платформ?»

Конечным результатом является то, что большинство людей здесь никогда не беспокоятся об интеграционном тестировании: это просто происходит. Модульное тестирование, с другой стороны, является приоритетом каждого. JUnit позволяет легко создавать тесты, хотя хорошие тесты всегда требуют времени на обдумывание и разработку.

1 голос
/ 12 ноября 2008

Да, вы можете использовать junit для интеграционных тестов, но это зависит от типа интеграционного теста, который вам нужен.

Тестирование сервлета:

  • настройка контекста сервлета и настройка
  • делать тесты с использованием запросов на имитацию сервлета (Spring поддерживает это, но вы также можете использовать EasyMock или свои собственные макеты)

Проверка применения пружины:

  • использовать AbstractDependencyInjectionSpringContextTests для настройки контекста
  • проверка проводных бобов
  • есть также подклассы AbstractDependencyInjectionSpringContextTests, поддерживающие обработку транзакций при тестировании с базой данных.

Но у чистого джунита есть свой предел. Тестирование пользовательских интерфейсов является типичным случаем. Вы можете использовать селен для веб-приложений, soapui для веб-сервисов или другие соответствующие инструменты.

Но что бы вы ни использовали, у вас должна быть возможность интегрировать это в вашу непрерывную сборку (круиз-контроль, командный город или что-то еще).

0 голосов
/ 19 сентября 2012

Я думаю, что тесты автоматизации и интеграции не очень хорошо играют вместе . Самая основная проблема - настройка среды перед каждым тестом. Для более сложного теста требуется большая настройка.

Мои мысли об автоматизации тестирования на уровне интеграции: http://blog.aplikacja.info/2012/03/whats-wrong-with-automated-integration-tests/

0 голосов
/ 01 февраля 2012

Обновление для 2012: пока JUnit может использоваться (и получает выгоду от поддержки CI), JWebUnit и Selenium, по-видимому, поглощают умственные способности для тестирования интеграции.

0 голосов
/ 04 декабря 2009

Существует очень хорошее расширение для JUnit, которое называется Jitr.

Jitr - это JUnit Integration Test Runner, который позволяет легко запускать тесты интеграции вашего веб-приложения с легким веб-контейнером в той же JVM, что и ваши тесты.

См. Их сайт для деталей: http://www.jitr.org/

0 голосов
/ 13 ноября 2008

Предложение зависит от вашей заявки и вашей цели.

Я написал интеграционные тесты в JUnit, но я также видел, как люди используют HtmlUnit (расширение JUnit), Selenium, Watir, Fit / Fitness и даже коммерческие инструменты, такие как WinRunner и Silk.

Итак, расскажите нам немного больше о вашем домене и целях ваших тестов, и вы, вероятно, сможете получить лучший ответ.

0 голосов
/ 12 ноября 2008

Определенно! Мы используем комбинацию задач JUnit, ANT для их выполнения и Hudson для продолжения интеграционных тестов. Работает как шарм.

...