19

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

Мой главный вопрос: что вы делаете для тестирования этих классов?

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

  • Должен ли я создать другой сервер с другими инструментами CI со всеми внешними зависимостями?

  • Должен ли я запускать интеграционный тест на моем CI так часто, как мои юнит-тесты?

  • Может быть, полный рабочий день должен быть ответственным за проверку этих компонентов вручную? (Или заряда для создания тестовой среды и настроить взаимодействие между вашим классом и вашей внешней зависимости, как редактирование конфигурационных файлов приложения)

Я хотел бы знать, как вы это делаете в реальном мире ,

+0

Я знаю, что вопрос старый, но я хочу поделиться - https://www.petrikainulainen.net/programming/testing/12-tools-that-i-use-for-writing-unit-and- интеграционные тесты/ – Betlista

ответ

14

Я хотел бы знать, как вы поживаете в реальном мире ?

В реальном мире нет простого рецепта о том, что делать, но есть одна руководящая истина: вы хотите как можно скорее уловить ошибки/ошибки/тесты после их введения. Пусть это будет вашим проводником; все остальное - техника.

Парочка общие методы:

  • тесты, работающие параллельно. Это мое предпочтение; Мне нравится иметь две системы, каждая из которых запускает собственный экземпляр CruiseControl * (для которого я являюсь коммиттером), один из которых запускает модульные тесты с быстрой обратной связью (< 5 минут), а другая система постоянно проводит интеграционные тесты. Мне это нравится, потому что это минимизирует задержку между тем, когда происходит проверка, и системный тест может ее поймать. Недостатком того, что некоторые люди не любят, является то, что вы можете завершить несколько отказов тестов для одного и того же теста, как с ошибкой единичного теста, так и с ошибкой интеграции. На практике я не считаю это серьезным недостатком.

  • Модель жизненного цикла, в которой испытания системы/интеграции выполняются только после завершения модульных испытаний. Существуют такие инструменты, как AnthillPro *, которые построены вокруг этой модели, и этот подход очень популярен. В своей модели они принимают артефакты, прошедшие модульные тесты, разворачивают их на отдельный промежуточный сервер и затем запускают там тесты системы/интеграции.

Если у Вас есть вопросы по этой теме, я бы порекомендовал Continuous Integration and Testing Conference (CITCON) и/или CITCON mailing list.

+0

Wonderfull, у CITCON есть много ресурсов! –

4

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

Сетевые сервисы - по определению - также могут быть установлены в другом месте.

Всегда будьте очень осторожны, чтобы ваша машина CI была отделена от любой среды разработчика или prod.

3

Подход, который я видел чаще всего, заключается в немедленном запуске модульных тестов при проверке и для проведения более длительных интеграционных тестов с фиксированными интервалами (возможно, на другом сервере, это действительно зависит от ваших предпочтений). Я также видел, что интеграционные тесты разбиваются на «короткие» интеграционные тесты и «длительные» интеграционные тесты, которые выполняются с разными интервалами (например, «короткие» тесты запускаются каждый час, а «длинные» «опытные» тесты выполняются всю ночь).

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

Я понимаю, что это не отвечает на весь ваш вопрос, но я надеюсь, что это даст вам некоторые идеи о части планирования.

1

Я не знаю, на какой платформе вы работаете, но я использую Java. Там, где я работаю, мы создаем интеграционные тесты в JUnit и вставляем соответствующие зависимости с помощью контейнера DI, такого как Spring. Они запускаются против реального источника данных, как самими разработчиками (как правило, небольшим подмножеством), так и сервером CI.

Как часто вы запускаете интеграционные тесты, зависит от того, как долго они будут работать, на мой взгляд. Запускайте их так часто, как можете.Оставьте настоящего человека, и пусть он или она проведет ручные системные тесты в областях, которые сложны или слишком дороги для автоматизации тестирования (например, орфография, положение различных компонентов GUI). Оставьте редактирование файлов конфигурации на компьютере. Там, где я работаю, у нас есть системные переменные (DEV; TEST и т. Д.), Установленные на компьютерах, и пусть приложение выбирает конфигурационный файл на основе этого.

Смежные вопросы