Как выполнить интеграционные тесты?

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

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

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

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

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

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

5
задан 3 revs, 2 users 80% 11 August 2017 в 13:42
поделиться

3 ответа

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

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

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

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

Мы запускаем выполнение интеграционных тестов, настраивая задачу TeamCity integration.tests так, чтобы она зависела от "main" Continous.задача сборки, подробнее см. здесь: http://confluence.jetbrains.net/display/TCD4/Dependencies+Triggers

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

  • используя отдельный каталог с именем "src / it / java" для сохранения тестов интеграции,
  • исключение по умолчанию этой исходной папки из конфигурации maven-surefire-plugin (элемент конфигурации / исключения),
  • с использованием Maven профиль называется «интеграция», чтобы исключить обычные модульные тесты и включить тесты из «src / it / java» (этот профиль настраивается путем передачи -Pintegration в задаче integration.tests).
3
ответ дан 14 December 2019 в 08:46
поделиться

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

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

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

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

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

3
ответ дан 14 December 2019 в 08:46
поделиться

Мы запускаем все тесты в одном огромном наборе. Запуск занимает 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 )

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

У нас также есть следующие виды вещей

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 )

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

1
ответ дан 14 December 2019 в 08:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: