Быстрое выполнение одного интеграционного теста в Grails

Можно ли быстро запустить один/все интеграционные тесты в классе в Grails. Тестовое приложение поставляется с тяжелым багажом очистки всех скомпилированных файлов и создания отчетов Cobertura, поэтому, даже если мы запускаем один интеграционный тест, вся база кода компилируется, инструментируется и создается отчет Cobertura. Для нашего приложения это занимает более 2 минут.

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

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

Спасибо


person Prakash    schedule 25.05.2010    source источник


Ответы (3)


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

Может быть, вы можете извлечь некоторые тесты в модульные тесты. Их вы можете запустить в Eclipse.

Вы можете отключить Cobertura, поместив следующий код в файл grails-app/conf/BuildConfig.groovy:

coverage {
    enabledByDefault = false
}
person Daniel Engmann    schedule 25.05.2010
comment
У cobertura на самом деле была проблема. Мы использовали подключаемый модуль cobertura, и этот подключаемый модуль очищал все скомпилированные исходные коды после создания отчета, что не позволяло нам использовать все преимущества, связанные с инкрементной компиляцией. Кроме того, выполнение одного или двух тестов не требует для нас подробного отчета cobertura, а интеграционный тест выполняется быстро, как только мы его отключаем. Спасибо за указатель. - person Prakash; 27.05.2010

Если у вас есть класс интеграционного тестирования

class SimpleControllerTests extends GrailsUnitTestCase {
    public void testLogin() {}
    public void testLogin2() {}
    public void testLogin3() {}
}

Вы можете запустить только один тест в этом классе, используя:

grails test-app integration: SimpleController.testLogin

Однако вам все равно придется понести затраты времени, необходимые для интеграционного тестирования (загрузка конфигурации, подключение к БД, создание экземпляров Spring bean-компонентов и т. д.).

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

person Dónal    schedule 25.05.2010
comment
Запуск одного тестового примера работает, просто нужен полный путь к классу - person Bill Comer; 04.10.2010

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

Однако компромисс заключается в том, что в REPL есть проблемы с динамической перезагрузкой. Если вы видите случайные странности, выйдите из REPL и перезагрузите.

$> ./grailsw --plain-output
|Loading Grails 2.5.3
|Configuring classpath
|Enter a script name to run. Use TAB for completion: 
grails> test-app -integration
... (loads some things)
...
grails> test-app -integration
... (faster loading)

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

person tmarthal    schedule 30.03.2016