В нашем проекте у нас есть много модульных тестов. Они помогают сохранить проект скорее хорошо протестированным.
Помимо них, у нас есть ряд тестов, которые являются модульными тестами, но зависит от некоторого внешнего ресурса. Мы называем их внешними тестами. Например, они могут иногда получать доступ к веб-сервисам.
В то время как модульные тесты легко выполнить, тесты integrational не могли иногда передавать: например, из-за ошибки из-за тайм-аута. Кроме того, эти тесты могут занять слишком много времени для выполнения.
В настоящее время мы сохраняем модульные тесты интеграции / внешние модульные тесты только для выполнения их при разработке соответствующей функциональности.
Для простых модульных тестов мы используем TeamCity для непрерывной интеграции.
Как Вы выполняете модульные тесты интеграции и когда Вы выполняете их?
В нашем проекте у нас есть отдельный набор для обычных / простых модульных тестов и отдельный набор для интеграционных тестов. . Этому есть две причины:
Мы используем TeamCity в качестве основного сервера непрерывной интеграции и Maven в качестве системы сборки. Мы используем следующий алгоритм для запуска тестов:
mvn clean install
Мы запускаем выполнение интеграционных тестов, настраивая задачу TeamCity integration.tests так, чтобы она зависела от "main" Continous.задача сборки, подробнее см. здесь: http://confluence.jetbrains.net/display/TCD4/Dependencies+Triggers
Мы запускаем только интеграционные тесты (исключая модульные тесты):
Мы используем Maven2: maven-surefire-plugin для запуска модульных тестов (в фазе тестирования) и maven-failsafe-plugin для интеграционных тестов (фаза интеграции-тестирования).
По умолчанию все тесты запускаются при сборке проекта, однако интеграционные тесты можно отключить с помощью профилей.
Во многих случаях интеграционные тесты являются частью модуля, в некоторых случаях существуют также специальные модули, которые выполняют только интеграционные тесты.
Одна из команд также использует Fitnesse для приемочных испытаний. Эти тесты также находятся в специальных модулях.
Мы используем Hudson для CI.
Мы запускаем все тесты в одном огромном наборе. Запуск занимает 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 )
Для поддержки этого тестирования у нас есть несколько макетов серверов для различных видов интеграционных тестов.