Статьи

Только мазохист написал бы юнит-тесты на Java. Будьте умнее, используйте Groovy (или Scala …).

Мне нравится писать модульные тесты, но 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» — полезно знать , что , как может преобразовать

 

От http://theholyjava.wordpress.com/2011/10/18/only-a-masochist-would-write-unit-tests-in-java-be-smarter-use-groovy-or-jruby-or-st -else-аналогично /