Мне нравится писать модульные тесты, но Java не делает это особенно легко. Особенно, если вам нужно создавать объекты и деревья объектов, преобразовывать объекты для их проверки и т. Д. Я очень скучаю по совести, мощному синтаксису, литералам для регулярных выражений и коллекций, по совести, основанным на clojure методам фильтрации и преобразования коллекций, утверждая, что предоставляет больше понять, почему они не смогли. Но кто сказал, что я должен писать тесты на том же языке, что и рабочий код ?! Я могу использовать Groovy — его синтаксис составляет ~ 100% Java + примерно на тысячу% больше, необязательное использование статической / динамической типизации, замыкания, сотни служебных методов добавлены в стандартные классы JDKи так далее. Поддержка Groovy, например, в IntelliJ IDEA (автозаполнение, рефакторинг …) очень хороша, поэтому, используя ее, вы ничего не теряете и получаете невероятно много. Поэтому я решил, что теперь я буду использовать Groovy только для юнит-тестов. И до сих пор мой опыт с этим был в целом положительным (хотя немногие вещи немного сложнее из-за положительных моментов, чем компенсируют их). Читайте дальше, чтобы узнать, почему вы должны попробовать это тоже.
( Аргументы здесь сосредоточены на Groovy, но я думаю, что подобные вещи можно было бы сказать о JRuby, Scala и т. Д. — за исключением совместимости кода Java, которую вы можете получить только в Groovy. )
Несколько примеров
Некоторые из приведенных ниже примеров используют магию Groovy, но не пугайтесь. Вы можете написать Groovy так же, как если бы это был Java, и только изучать и вводить его магию шаг за шагом, как вам это нужно.
Бобовая конструкция:
def testBean = new Customer(fname: "Bob", sname: "Newt", age: 42) // Java: c = new Customer(); c.setFname("Bob"); c.setSname("Newt"); c.setAge(42);
Чтение файла:
assert test.method() == new File("expected.txt").getText() // == actually calls equals
Проверка содержимого коллекции / карты:
assert customerFinder.findAll().collect {it.sname}.sort() == ["Lizard","Newt"] // Java: too long to show here (extract only surnames, sort them, compare ...) assert getCapitalsMap() == ["UK" : "London", "CR" : "Prague"]
Обычные выражения:
assert ("dog1-and-dog2" =~ /dog\d/).getAt([0,1]) == ["dog1", "dog2"]
Что такое Groovy?
Groovy 1.8 — это зрелый язык сценариев для JVM, написанный как расширение Java с необязательной динамической типизацией, замыканиями и многим другим. Это теперь разработано SpringSource, компанией позади Spring.
Как уже упоминалось, почти весь Java-код является допустимым Groovy-кодом, за исключением одного: чтобы инициализировать массив, который вы не можете использовать {…} (это будет закрытием), вы должны использовать […] вместо этого (обратите внимание, что по умолчанию он фактически создает список, только когда он назначен переменной массива или приведен к массиву, он создает массив). Обязательно проверьте несколько распространенных ошибок, прежде чем погрузиться в использование Groovy.
Вы можете поэкспериментировать с Groovy онлайн в консоли GAE Groovy .
Groovy особенности особенно полезны для тестирования
Генеральная
- Динамическая типизация по запросу => сознание, избегает кода, загроможденного приведениями
Коллекции : методы, основанные на замыкании, как каждый, каждый, найти
Файлы : читать весь текст одним вызовом, с помощью Reader {..} и т. Д.
Тестирование / расширенный:
- assert — вы можете использовать ключевое слово Java assert вместо методов JUnit, при неудаче Groovy предоставит вам довольно хорошую информацию о том, что пошло не так:
Assertion failed: assert config.getResolvers()) == ["h:dataTable" : resolver, "my:dt2" : null] | | | | | | false | | | MyResolver@731d2572 | [h:dataTable:MyResolver@731d2572, my:dt2:MyResolver@731d2572] LocalVariableConfiguration@7e859a68
- Here-docs: легко встраивать многострочные строки в тест (также поддерживает замену ссылок типа $ variable на значения)
- Реализация интерфейсов с картой (приведение карты)
- Используйте раскрытие для определения динамических компонентов (как в JavaScript, вы создаете экземпляр Expando и просто добавляете свойства и замыкания в качестве методов) — как описано на связанной странице, расширений и карт обычно достаточно для замены библиотеки-макета
- Встроенный насмешливый
- С Groovy вы, конечно, можете также использовать Spock , отличную среду для спецификации и тестирования
осложнения
- Ни JUnitMax, ни Infinitest (в IntelliJ) не поддерживают Groovy-тесты
- Вам нужна приличная IDE, такая как IntelliJ IDEA
- Если вы используете Maven, вы должны явно настроить плагин GMaven (особенно с более новой версией Groovy)
- IntelliJ 10.5: нажмите & alt + enter на несуществующий метод, чтобы создать его, работает только в том случае, если целевой тип является вложенным классом в тесте, а не если это отдельный класс Java (поэтому я просто создаю свой класс там и когда это будет сделано TDDing Я извлекаю его в класс Java верхнего уровня)
Вывод
Groovy делает тестовую написание гораздо более продуктивной, и поэтому разработчики довольны. Я намерен использовать все мои проекты с открытым исходным кодом и попытаться внедрить их в наши коммерческие проекты. Вы должны попробовать это тоже!
Дополнительные ссылки
- DefaultGroovyMethods .java ( src ): определяет методы, добавленные ко всем объектам
- DefaultTypeTransformation .java: методы , используемые внутри для преобразования между типами и при использовании «в aType» — полезно знать , что , как может преобразовать