Я работал над 3 большими приложениями Grails и неисчислимыми меньшими.В моем текущем проекте есть набор юнит-тестов и интеграционных тестов (в настоящее время 2110 юнит-тестов и 493 интеграционных тестов).
Я потратил кучу времени, пытаясь повысить скорость тестирования, а также сделать тесты более удобными в обслуживании.
Мои интеграционные тесты часто бывают гибридными, где, если я тестирую сервис, я мог бы смоделировать некоторые другие вызываемые сервисы / методы, чтобы убедиться, что я получаю нужные значения, но оставить в других частях интеграции для упражнения.HQL или интеграция с базой данных.С этой целью я использую прототипов экземпляров, которые обычно представляют собой одноэлементные сервисы , так что я могу работать с экземпляром сервиса, не загрязняя последующие тесты.
Я нахожу build-test-Плагин data неоценим для создания поддерживаемых модульных тестов, так как он позволяет мне создавать тестовые данные, где я явно заполняю нужные мне фрагменты и позволяю плагину заполнять другие необходимые детали.Создание тестовых данных в интеграционных тестах для меня проще, чем их моделирование в модульных тестах.
Если вы используете как интеграционные, так и модульные тесты, со временем скорость последовательного выполнения всех тестов станет препятствием.Моя команда использует скрипт splitTests.groovy , чтобы выделить два отдельных потока, один для модульных тестов, один для интеграционных тестов.Это делает наши тесты примерно на 40% быстрее.Дальнейшее распараллеливание возможно, но мы еще не пошли (а текущие скрипты Gant Grails довольно неприятны под обложками, я с нетерпением жду переписывания Gradle в Grails 2.0).
Модульные тестыхорошо для того, чтобы поразить все условные закоулки метода (хотя, если у вас их слишком много, ваша цикломатическая сложность, вероятно, слишком высока, и вам следует провести рефакторинг).Интеграционные тесты полезны для осуществления интеграции с базой данных и службами, а также помогают понять, что вы сломали, когда вы меняете часть кода.
Я думаю, что смелость рефакторинга, которую вы получаете благодаря высокому охвату тестами, частично зависит от того, какие из тестов являются интеграционными.Если все, что у вас есть, это модульные тесты, которые не взаимодействуют с другими частями кода, вы не будете предупреждены об уязвимых областях при внесении изменений в код, а поскольку groovy является динамическим языком, компилятор, скорее всего, не поможет вам найтиэти области либо.