5

В нашем проекте у нас много модульных тестов. Они помогают сохранить проект хорошо проверенным.Как запустить интеграционные тесты?

Помимо них, у нас есть набор тестов, которые являются модульными испытаниями, но зависят от какого-либо внешнего ресурса. Мы называем их внешние тесты. Например, они иногда могут обращаться к веб-службам.

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

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

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

Как выполнить тесты интеграционного модуля и когда вы их запускаете?

+0

Как видно из этой дискуссии, я смотрю, как классифицировать интеграционные тесты. И теперь, что я могу добавить самостоятельно: 1. Проверьте, проверяет ли наше программное обеспечение как ожидалось с удаленным программным обеспечением (удаленные макеты ws могут использоваться для этого, как отметил С. Лотт). 2. Проверьте, что проверка того, что удаленный сервис работает, как и ожидалось нами. – Vladimir

ответ

2

В нашем проекте у нас есть отдельный комплект для регулярных/простых модульных испытаний и отдельный комплект для интеграционных тестов. Две причины:

  1. производительность: интеграционные тесты являются гораздо медленнее,
  2. тест хрупкости: интеграционные тесты не в состоянии более часто из-за условий окружающей среды, связанных с (ложные срабатывания).

Мы используем TeamCity как наш основной сервер непрерывной интеграции и Maven как систему сборки. Мы используем следующий алгоритм для проведения тестов:

  1. Мы запускаем модульные тесты внутри Eclipse IDE и перед каждой фиксацией.
  2. Мы запускаем модульные тесты автоматически после каждой фиксации на агентах TeamCity, используя Maven's mvn clean install
  3. Мы автоматически запускаем тесты интеграции на агенте TeamCity после завершения сборки «main».

Путь мы вызываем выполнение интеграционных тестов является настройка задачи integration.tests Teamcity, чтобы зависеть от «основного» continous.build задачи, смотрите здесь для подробностей: http://confluence.jetbrains.net/display/TCD4/Dependencies+Triggers

Мы проводим только интеграционные тесты (за исключением юнит-тесты) по:

  • используя отдельный каталог с именем «SRC/это/Java», чтобы сохранить интеграционные тесты,
  • исключая по умолчанию этот источник folde r из конфигурации maven-surefire-plugin (элемент конфигурации/исключает элемент),
  • с использованием профиля Maven под названием «интеграция» для исключения регулярных модульных тестов и включения тестов из «src/it/java» (этот профиль настраивается путем передачи -Pintegration в задаче integration.tests).
+0

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

1

Мы проводим все тесты в одном огромном пакете. Это займет 7 минут.

Наши интеграционные тесты создают макетные серверы. Они никогда не тайм-аут - кроме случаев, когда тест требует от сервера таймаута.

Итак, у нас есть следующие вещи. (Образец кода Python)

class SomeIntegrationTest(unittest.TestCase): 
    def setUp(self): 
     testclient.StartVendorMockServer(18000) # port number 
     self.connection = applicationLibrary.connect('localhost', 18000) 
    def test_should_do_this(self): 
     self.connection.this() 
     self.assert... 
    def tearDown(self): 
     testClient.KillVendorMockServer(18000) 

Это имеет некоторые ограничения - это всегда разветвление фиктивный клиент-сервер для каждого теста. Иногда это нормально, и иногда это слишком много начинается и останавливается.

Мы также имеем следующие виды вещей

class SomeIntegrationTest(unittest.TestCase): 
    def setUp(self): 
     self.connection = applicationLibrary.connect('localhost', 18000) 
    def test_should_do_this(self): 
     self.connection.this() 
     self.assert... 

if __name__ == "__main__": 
    testclient.StartVendorMockServer(18000) # port number 
    result= unittest.TextTestRunner().run() 
    testclient.KillVendorMockServer(18000) 
    system.exit(result.failures + result.errors) 

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

+0

Вам нужно, чтобы разработчики запускали тесты перед регистрацией? –

+0

Это хороший подход к макету удаленных служб. Я думаю, что мы этого не делаем, потому что иногда сложно сделать макет - или это может занять некоторое время. Также иногда я даже не знаю, как работает удаленный ws. Третье, что иногда полезно проверить, что удаленный сервис работает нормально, как ожидалось. У нас были случаи, когда у основных поставщиков услуг были проблемы, которые могут быть обнаружены некоторыми внешними тестами. – Vladimir

+0

@Vladimir: «Иногда я даже не знаю, как работает удаленный ws». Ложь. Вы знаете, что ваше приложение отправляет и получает. Это все, что вам нужно сделать в Mockup. Больше ничего, достаточно, чтобы пройти тест. –

3

Мы используем Maven2: maven-surefire-plugin для запуска модульных тестов (на этапе тестирования) и maven-отказоустойчивого плагина для интеграционных тестов (этап интеграции-тестирования).

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

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

Одна из команд также использует Fitnesse для приемочных испытаний. Эти тесты также находятся в выделенных модулях.

Мы используем Hudson для CI.

+0

Спасибо, что упомянул Fitnesse - я слышал об этом раньше. А теперь просто смотрел презентацию - это от Роберта Мартина. Выглядит неплохо. Я постараюсь подумать, как мы можем интегрировать его для наших целей! У вас много приемочных тестов в Fitnesse? – Vladimir

+0

Моя команда - нет, у другой команды действительно много всего сделано в качестве приемочных испытаний. – lexicore