Как я писал на Groovy и что за зверь такой GEB… (часть 2)

Tymur Kubai
3 min readJun 17, 2017

--

Начало(часть 1) смотри тут...

Сладкий синтаксический сахар groovy и чем хорош gradle

В тестовом задании не сказано было какие тесты нужно запускать, теоретически все и сразу. Но я не поклонник такого подхода и считаю что нужно разделать api и ui тесты. Не то что бы строго разделять, а просто предоставить такую возможность.

Придерживаюсь философии что должна быть одна кнопка “сделать заебись”. Что в более понятной мере объясняется как одной командой в консоли должны запускаться все тесты. Например ./gradlew clean test или mvn clean test. Все, а дальше тестовое окружение, тестовые и т.д. должно уже быть реализоватьно либо в коде самих тестов либо за счет билд тулов.

И тут вырисовывается gradle - самый мощный тул для сборки jvm проектов. Если проект собирается с помощью gradle то в корне проекта/репозитория лежит файл build.gradle. Для людей знакомых с maven это почти аналог pom.xml. Почему почти? Да потому что этот файл является не просто неким набором тегов которые обрабатывают соотвествующими плагинами, этот файл есть groovy script в котором ты програмируешь сборку проекта, да там есть свой DSL, но никто тебя не ограничивает и ты можешь наскриптовать там что-то свое кастомное.

Что я и сделал :)

Оператор ?:

Как и все “пряморукие” люди я разнес api и ui тесты по разным пакетам. В gradle для test таска(атомарная сущность build life cycle) есть возможность явно указать какие тесты включать/include и какие исключать/exclude. Поэтому можно через строку терминала при запуске тестов пробросить параметр. А если параметр непроброшен, то ранить все тесты. И это делается в одну строчку и получается очень красивый элегантный код благодаря синтаксическому сахару groovy.

test{
include ((System.getProperty(‘type’) ?: ‘**’) + ‘/**’)
}

Под синтаксическим сахаром тут является оператор ?:

Этот оператор есть упрощение частного случая тернарого выражения. Когда нам сначала нужно проверить не является ли наша переменная null если нет то мы просто возвращаем значение переменной если же она равняется null, то мы возвращаем кастомно значение. Пример:

(value != null) ? value : customValue; //java style

value ?: customValue //groovy style

В итоге если я буду вызывать тесты просто командой ./gradlew clean test

То include ((System.getProperty(‘type’) ?: ‘**’) + ‘/**’) превратиться в include ‘**/**’ и выполнятся все вложенные классы во всех пакетах.

Если запускать с ./gradlew clean test -Ptype=%sometype% где вместо %sometype% нужно передать одно из названий пакета api или ui. То будет вызван либо include ‘api/**’ либо include ‘ui/**’.

Оператор ?. или Safe navigation operator

К сожалению в данном тестовом задание не было такой возможности использовать данный оператор. А он избавляет от кучи гемора и то же делает красоту в коде. Его используют вместо простого оператора точки “.” в тех случаях когда нужно проверить объект на null перед вызовом его методов.

Например мы получили откуда-то объект картинки и нам нужно вернуть ее высоту. В стиле java это будет выглядеть следующим образом.

Image image = someApiCall()

if (image != null){
if (image.getDimensions() ! = null){
return image.getDimensions().getHeight()
}
}

Но и спользуя оператор ?. можно сократить все до одной строки.

Image image = someApiCall()

return image?.getDimensions()?.getHeight()

Ну не красота ли?

На сегодня все мои маленькие любознательные зайки :) Не хочется распыляться слишком. В следующий раз уже будет Geb.

--

--

No responses yet