Spock — это новая среда тестирования и спецификации для разработчиков на Java и Groovy. Когда я распространял информацию о Споке, у меня часто возникал вопрос: «С какой стати мне нужен еще один фреймворк для тестирования? Разве уже не достаточно клонов xUnit / xSpec?» В этом посте я постараюсь показать вам, чем отличается Спок, и почему это стоит поближе.
Утверждения
Утверждения являются наиболее фундаментальным способом выражения поведения части программного обеспечения. Это почти традиция, что каждая новая среда тестирования поставляется с собственным API подтверждения, добавляя несколько складок тут и там, и называя вещи немного по-другому. Например, чтобы сказать, что две вещи равны, вы обычно пишете что-то вроде:
- assertEquals (x, y)
- x.shouldEqual (у)
- x.mustBe (у)
Время от времени появляется незнакомец и спрашивает, не может ли он просто использовать простые логические выражения вместо API утверждений. Но мы все знаем, что логические выражения не могут сказать нам, почему они потерпели неудачу. Или они могут? Знакомьтесь, Спок!
Spock. Тимур Гарафутдинов. Comaqa Spring 2019
В Споке утверждения следуют за ожидаемым: label, и это именно то, что просил незнакомец — простые логические выражения! Вот что мы получаем, когда запускаем этот тест:
Condition not satisfied:
x == y
| | |
1 | 2
false
Конечно, это работает не только для простых сравнений, но и для произвольных утверждений. Вот еще один, немного более интересный вывод:
Condition not satisfied:
Math.max(a, b) > c
| | | | |
112 | 94 | 115
112 false
Опять же, среда выполнения Спока собрала всю необходимую информацию и представила ее интуитивно понятным способом. Хорошо, не правда ли?
Управляемые данными тесты
Хотя управляемое данными тестирование является естественным продолжением тестирования на основе состояния, оно, похоже, используется не очень часто. Я полагаю, это потому, что тестовые среды делают написание тестов, управляемых данными, довольно сложными. Все они? Знакомьтесь, Спок!
Блок ожидания предоставляет только тестовую логику, используя свободные (т.е. неопределенные) переменные a, b и c в качестве заполнителей для данных. Затем до блока where можно связать конкретные значения с этими переменными. Когда этот тест выполняется, он повторяется три раза: сначала с a = 7, b = 3 и c = 7; тогда с а = 4, б = 5 и с = 5; и наконец с a = b = c = 9.
Конечно, данные теста не должны быть включены в тест. Например, давайте попробуем загрузить его из базы данных:
Здесь значения a, b и c берутся из столбцов с одинаковыми именами в таблице maxdata, пока не останется больше строк. Используя синтаксис, похожий на множественное назначение Groovy, блок where может быть еще более упрощен:
where:
[a, b, c]
Вместе с созданием экземпляра Sql, описанного выше, теперь у нас осталось две строки кода для загрузки наших тестовых данных из базы данных. Насколько это легко?
Использование Spock фреймворка для тестирования кода Java
Источник: coderlessons.com
Русские Блоги
Влюбиться в модульное тестирование: основанный на Groovy фреймворк Spock
Тестовая среда Spock основана на Groovy и использует преимущества Junit, TestNG, Mockito и других тестовых сред.
Уровень модульного теста, написанный Споком, понятен, объем кода невелик, а удобочитаемость хорошая.
Groovy полностью совместим с Java: Groovy в конечном итоге будет скомпилирован в файлы классов. JVM не волнует, является ли класс файлами Java или Groovy. Он поддерживает различные интегрированные среды разработки (eclipse, Intellij Ieda), особенно Intellij Idea имеет встроенные плагины, которые поддерживают Groovy, а также поддерживает такие плагины maven, как maven-surefire-plugin и jacoco.

1. Подготовка перед учебой
Официальный сайт:http://spockframework.org
Обязательно прочитайте книгу: «Тестирование Java со Споком»
Вам нужно прочитать только две следующие статьи, если вы хотите ускорить работу:
Начало работы с Groovy за 5 минут:https://learnxinyminutes.com/docs/groovy/
Очень подробное руководство по английскому языку, представляющее Спока:https://semaphoreci.com/community/tutorials/stubbing-and-mocking-in-java-with-the-spock-testing-framework
2. Maven зависимость
Eclipse поддерживает Groovy, необходимо установить плагины:https://github.com/groovy/groovy-eclipse/wiki
Обратите внимание, что контроль области Maven находится в тесте
dependency> groupId>org.spockframework groupId> artifactId>spock-core artifactId> version>1.1-groovy-2.4 version> scope>test scope> dependency> dependency> groupId>net.bytebuddy groupId> artifactId>byte-buddy artifactId> version>1.6.5 version> scope>test scope> dependency> dependency> groupId>org.objenesis groupId> artifactId>objenesis artifactId> version>2.5.1 version> scope>test scope> dependency>
3. Класс проверяется
4. Заявление «когда тогда»
«Дано-когда-то» — это базовый шаблон предложения Спока, который проясняет уровень модульного теста.
Кроме того, есть ключевое слово and, которое используется для разделения больших операторов.
Все модульные тесты Spock наследуют spock.lang.Specification, а Specification обеспечивает среду тестирования на основе Groovy dsl.
Спок поддерживает использование предложения в качестве имени метода для объяснения.
Заглушка используется для создания тестового объекта, который будет моделироваться.
«>>» используется для указания возвращаемого значения объекта моделирования
«>>>» используется для указания того, что один и тот же метод вызывается несколько раз подряд и возвращает разные значения
Подчеркивание «_» означает совпадение всех входных значений.
Спок не использует Assert для проверки результата. Выражение result == «1» после оператора then эквивалентно Assert.assertTrue (result.equals («1»)) в Junit
В следующих примерах используются примеры, демонстрирующие следующее использование: Groovy не нужно вводить точку с запятой
5. Проверьте поведение моделируемого объекта
Заглушка может только имитировать возвращаемое значение объекта, а Mock делает шаг вперед, не только может имитировать объект, но и проверять количество вызовов объекта и другие поведения.
Выражение: N * mockedObject.method (arguments) >> значение, что означает, что метод метода с аргументами вызывается N раз, а возвращаемое значение равно значению. Это выражение обычно помещается после этого.
Обратите внимание: несмотря на то, что оператор then помещается после after, Spock сначала проанализирует выражение из-за синтаксического дерева синтаксического анализа Groovy AST, а затем введет следующий после тестового класса после выполнения. Проверьте логику.
Все поля в Groovy являются открытыми, что устраняет проблему внедрения
Лямбда-выражение Groovy более гибкое, чем Java 8. Посредством лямбды можно получить входное значение тестового объекта. Глубоко вложенный тестовый класс необходим для проверки правильности входного значения.
def mockRequestNo = «123» def «Проверьте количество звонков на макет объектов»() < given: DbEntity expectEntity = new DbEntity() // groovy’s с синтаксисом для упрощения создания объекта expectEntity.with < >456 requestNo = mockRequestNo > // Mock отличается от Stub тем, что он может проверять количество вызовов на фиктивные объекты DbEntityDao dao = Mock(DbEntityDao) MyService myService = new MyService() // Все поля в Groovy являются общедоступными и могут быть доступны напрямую myService.dbEntityDao = dao when: long then: 456 // Затем в дополнение к результату проверки вы также можете установить возвращаемое значение фиктивного объекта, // Спок сначала проанализирует макет, определенный в последующем, а затем проверит его поведение после выполнения 1 * dao.selectByRequestNo(mockRequestNo) >> expectEntity > def «Выбрать входное значение»()< given: def resultCapture = null DbEntityDao dao = Stub(DbEntityDao.class) // Определение лямбда-выражения, захват значения ввода dao.selectByRequestNo( resultCapture = v >)>>null when: dao.selectByRequestNo(«123») then: resultCapture == «123» >
6. Параметрический тест
Параметризованный тест Спока более лаконичен, чем Junit.
напрямую использует формат таблицы для определения входного значения и ожидаемого значения.
Обратите внимание, что имя входного параметра должно соответствовать имени параметра тестируемого метода.
Следующий код, входные параметры в форме и имена входных параметров метода тестирования — a, b
def «test Parameterized»() < when: MyService myService = new MyService() then: myService.add(a, b) == result where: «Подготовьте параметры, имя входного параметра должно соответствовать имени параметра в методе» a | b || result 1 | 1 || 2 1 | 2 || 3 2 | 2 || 4 >
7. Смешивать и сопоставлять с другими тестовыми средами
8. Другое
В этом разделе показаны некоторые разные предметы
Декларация, аналогичная аннотации Junit
def «test trade»() < given: mockObject.method() >> < throw new RuntimeException(«Ха-ха, это хит») > when: «Ступай на яму» mockObject.method() then: «validator» RuntimeException runtimeException = thrown(RuntimeException) runtimeException.message == «Ха-ха, это хит» >
then: mockObject.value1 == 1 mockObject.value2 == 2 mockObject.value3 == 3 mockObject.value4 == 4 Благодаря Groovy с замыканием, это можно упростить до этого then: with(mockObject)< value1 == 1 value2 == 2 value3 == 3 value4 == 4 > То же самое использование Stub для инициализации объекта также может быть записано так: isEmpty () и т. Д. Являются методами в классе WarehouseInventory. when: WarehouseInventory inventory = Stub(WarehouseInventory) < isProductAvailable(«bravia»,1) >> true isProductAvailable(«panasonic»,1) >> false isEmpty() >> false >
Интеллектуальная рекомендация
Легкий кроссплатформенный MP3-плеер (5) — Несколько воспроизведений звука
Среди четырех блогов, воспроизведение звука, декодирование MP3, Audio Resampling и Audio Mixing были реализованы. Теперь нам нужно только подключить их вместе, чтобы добиться нескольких воспроизведени.
![]()
Дизайн тестера концентрации алкоголя на основе однопользовательской машины
Дизайн тестера концентрации алкоголя на основе однопользовательской машины Эта статья разработала портативный тестер концентрации спирта. В схеме проектирования используется однохипский микрокомпьютер.
Кан Тянь Дак, истечет ли также долговая расписка?
Трансфер из:http://wenzhang.zhaizhuanzhuan.cn/Detail.aspx?id=E5A5B817-815C-69B4-F0C0-7F903AB8181E Я недавно видел такую новостьЖитель Мяньян, провинция Сычуань, однажды одолжил другим 1,22 миллиона .
Pycharm2018 Профессиональный метод трещин
1, скачать pycharm и установка http://www.runoob.com/w3cnote/pycharm-windows-install.html 2, измените файл системных хостов Пути файлов в: C: Windows System32 Драйверы etc Есть файл хостов, от.
Версия SourceTree для Windows без регистрации и использования без входа в систему
описание проблемы После установки SourceTree вам необходимо войти в систему со своей учетной записью при первом использовании, но интерфейс регистрации или входа в систему может вообще не открываться.
Вам также может понравиться
Пример Android Jump к интерфейсу настройки уведомления приложения
4.4 Ниже приведено, что на странице настройки уведомления приложения на страницу приложения можно рассмотреть вопрос о том, чтобы рассмотреть страницу сведений о приложении. Ниже приведен код, который.
![]()
IDEA 2020.1 Maven Project Use Annotation Bulid сообщает об ошибке, проект не сообщает об ошибке
Различные попытки повторно импортировать или использование, потому что сервер не нашел гарантии JAR, когда сервер был скомпилирован, настройка настройки ->.
![]()
Вью-роутер вложенный маршрут
Сначала преобразуйте код навигации в App.vue Во-вторых, переписать страницу компонентов / hi.vue (используя роутер-просмотр) Измените Hi.vue на общий шаблон, добавьте тег и укажите.
![]()
Разговор в начале лета: не наступайте на белый блок классических игр — небольшой проект (C / C ++) (1.0.01)
Для человека, который играет в классные игры и предпочитает создавать игры, так здорово иметь возможность самому написать более значимую классическую игру. В индустрии программирования величайшим чувс.
Источник: russianblogs.com
Зачем нам вулканец на борту: обзор Spock Framework
Автоматизация тестирования помогает постоянно контролировать качество IT-продукта, а также снижать затраты в долгосрочной перспективе. В автоматизации существуют различные подходы, например, Behavior Driven Development (BDD), разработка через поведение.
С этим подходом связаны инструменты cucumber, robot framework, behave и другие, в которых разделены сценарии выполнения и реализация каждой конструкции. Такое разделение помогает составить удобочитаемые сценарии, но требует значительных затрат времени и поэтому может быть непрактичным при написании реализации.
Рассмотрим, как можно упростить работу с BDD, используя подходящие инструменты – например, фреймворк Spock, который сочетает в себе красоту, удобство принципов BDD и особенности jUnit.

Spock framework
Spock – фреймворк для тестирования и спецификации приложений на языках Java и Groovy. Благодаря использованию в качестве основы платформы JUnit этот фреймворк совместим со всеми популярными IDE (в частности, IntelliJ IDEA), различными инструментами сборки (Ant, Gradle, Maven) и continuous integration (CI) серверами.
Как пишут разработчики фреймворка, Spock «вдохновлен JUnit, RSpec, jMock, Mockito, Groovy, Scala, вулканцами и другими увлекательными формами жизни».
В этой статье мы рассмотрим последнюю доступную версию, Spock Framework 2.0. Ее особенности: возможность использования JUnit5, Java 8+, groovy 2.5 (также существует сборка с версией 3.0). Spock распространяется по лицензии Apache 2.0 и имеет отзывчивое сообщество пользователей. Разработчики фреймворка продолжают дорабатывать и развивать Spock, который уже включает в себя множество расширений, позволяющих тщательно настроить запуск тестов. Например, одно из наиболее интересных анонсированных направлений доработки – это добавление параллельного исполнения тестов.
Groovy
Groovy является объектно-ориентированным языком программирования, разработанным для платформы Java как дополнение с возможностями Python, Ruby и Smalltalk. Groovy использует Java-подобный синтаксис с динамической компиляцией в JVM байт-код и напрямую работает с другим Java-кодом и библиотеками. Язык может использоваться в любом Java-проекте или как скриптовый язык.
К особенностям groovy относятся: как статическая, так и динамическая типизация; встроенный синтаксис для списков, массивов и регулярных выражений; перегрузка операций. При этом замыкания в Groovy появились задолго до Java.
Groovy хорошо подходит для быстрой разработки тестов, когда есть возможность применять «синтаксический сахар», схожий с python, и не задумываться о типизации объектов.
Особенности Spock Framework
Одна из ключевых особенностей фреймворка – у разработчика есть возможность писать спецификации с ожидаемыми характеристиками системы с использованием принципов BDD подхода. Этот подход позволяет составлять бизнес-ориентированные функциональные тесты для программных продуктов с высокой предметной и организационной сложностью.
Спецификация представляет собой класс groovy, расширяющий spock.lang.Specification
class MyFirstSpecification extends Specification < // fields // fixture methods // feature methods // helper methods >
Спецификация может содержать различные вспомогательные поля, которые инициируются для каждого класса спецификации.
Методы настройки класса спецификации:
def setupSpec() <> // запускается при работе первого feature метода из спецификации def setup() <> // запускается перед каждым feature методом def cleanup() <> // запускается после каждого feature метода def cleanupSpec() <> // запускается после работы последнего feature метода из спецификации
В следующей таблице рассмотрим, у каких ключевых слов и методов Spock framework есть аналоги в JUnit.

Блоки теста
В Spock Framework каждая фаза теста выделена в отдельный блок кода (см. пример в документации).

Блок кода начинается с лейбла и завершается началом следующего блока кода или окончанием теста.
Блок given отвечает за настройку начальных условий теста.
Блоки when, then всегда используются вместе. В блоке when – стимулятор, раздражитель системы, а в блоке then – ответная реакция системы.
В тех случаях, когда есть возможность сократить конструкцию when-then до одного выражения, можно использовать один блок expect. Далее будут использованы примеры из официальной документации Spock framework:
when: def x = Math.max(1, 2) then: x == 2
или одно выражение
expect: Math.max(1, 2) == 2
Блок cleanup применяют для освобождения ресурсов перед следующей итерацией теста.
given: def file = new File(«/some/path») file.createNewFile() // . cleanup: file.delete()
Блок where применяют для передачи данных для тестирования (Data Driven Testing).
def «computing the maximum of two numbers»()
Виды передачи входных данных будут рассмотрены далее.
Пример реализации теста на Spock Framework
Далее рассмотрим подходы к реализации тестирования веб-страницы авторизации пользователя в системе с использованием selenium.
Здесь мы видим базовый класс спецификации страницы. В начале класса мы видим импорт необходимых классов. Далее представлена аннотация shared, позволяющая классам-наследникам получить доступ к веб-драйверу. В блоке setup() мы видим код инициализации веб-драйвера и открытия веб-страницы. В блоке cleanup() – код завершения работы веб-драйвера.
Далее перейдем к обзору спецификации страницы авторизации пользователя.
Спецификация страницы авторизации наследуется от базовой спецификации страниц. Аннотация Issue задает идентификатор теста во внешней системе трекинга (например, Jira). В следующей строке мы видим название теста, которое по соглашению задается строковыми литералами, что позволяет использовать любые символы в названии теста (в том числе и русскоязычные).
В блоке given происходит инициализация page object класса страницы авторизации, а также получение корректных логина и пароля для авторизации в системе. В блоке when выполняется действие по авторизации. В блоке then – проверка ожидаемого действия, а именно – успешная авторизация и переадресация на главную страницу системы.
На примере данной спецификации мы видим наиболее значимый плюс использования парадигмы BDD в spock – спецификация системы одновременно является и ее документацией. Каждый тест описывает определенное поведение, каждый шаг в тесте имеет свое описание, понятное не только разработчикам, но и заказчикам. Описание блоков может быть представлено не только в исходном коде теста, но и в диагностических сообщениях или отчетах о работе теста.
В фреймворке предусмотрена возможность передавать различные логины и пароли для тестирования (параметризировать тест).
Data Driven Testing в Spock Framework
Data Driven Testing = table-driven testing = parameterized testing
Для тестирования сценария с несколькими параметрами можно использовать различные варианты их передачи.
Таблицы данных (Data Tables)
Рассмотрим несколько примеров из официальной документации фреймворка.
class MathSpec extends Specification < def «maximum of two numbers»() < expect: Math.max(a, b) == c where: a | b | c 1 | 3 | 3 7 | 4 | 7 0 | 0 | 0 >>
Каждая строка в таблице – отдельная итерация теста. Также таблица может быть представлена и одним столбцом.
where: a | _ 1 | _ 7 | _ 0 | _
_ — объект-заглушка класса спецификации.
Для лучшего визуального восприятия параметров можно переписать пример выше в следующем виде:
def «maximum of two numbers»()
Теперь мы видим, что a, b – входные параметры, а c – ожидаемое значение.
Потоки данных (Data pipes)
В некоторых случаях использование таблицы параметров будет выглядеть очень громоздко. В таких случаях можно применять следующий вид передачи параметров:
. where: a
Для каждой итерации теста будут запрашиваться следующие данные из списка для каждой переменной:
1 итерация: a=1, b=3, c=3;
2 итерация: a=7, b=4, c=7;
3 итерация: a=0, b=0, c=0.
Причем входные данные могут не только передаваться явно, но и запрашиваться при необходимости из различных источников. Например, из базы данных:
Переменная как данные (Data Variable Assignment)
. where: a = 3 b = Math.random() * 100 c = a > b ? a : b
Здесь мы видим динамически вычисляемую переменную c в тестовых данных.
Комбинация различных видов передачи параметров
. where: a | _ 3 | _ 7 | _ 0 | _ b b ? a : b
Никто не запрещает вам применять сразу несколько видов передачи, если это необходимо.
Пример реализации параметризованного теста на Spock Framework
Здесь мы видим уже знакомый нам блок where, в котором заданы ключи параметров (логинов и паролей), которые хранятся в файле конфигурации.
Ввиду особенностей используемой реализации спецификации, цикл настройки веб-драйвера и его закрытие (а значит и закрытие браузера) будет выполняться для каждого параметра, что негативно скажется на времени выполнения теста. Предлагаем доработать спецификацию и улучшить время работы теста.
Пример реализации параметризованного теста с доработанной спецификацией
До доработки
После доработки
В обновленной спецификации мы видим, что процедура создания веб-драйвера будет выполняться только при настройке класса спецификации, а закрытие браузера – только после завершения работы тестов из спецификации. В методе setup() мы видим тот же код получения веб-адреса сервиса и его открытие в браузере, а в методе cleanup() – переход по адресу www.anywebservice.ru/logout для завершения работы с сервисом у текущего пользователя и удаления файлов куки (для тестирования текущего веб-сервиса данной процедуры достаточно, чтобы имитировать «уникальный» запуск). Код самого теста не изменился.
В итоге с помощью нехитрых доработок мы получили минимум двукратное уменьшение времени работы автотеста, по сравнению с первичной реализацией.
Сравнение тестов на testNG, pytest, pytest-bdd
Для начала мы рассмотрим реализацию теста на тестовом фреймворке testNG на языке программирования Java, который также, как и Spock Framework, вдохновлен фреймворком jUnit и поддерживает data-driven testing.
Стоит отметить, что в testNG, в отличие от Spock Framework, реализована поддержка параллельного выполнения теста.

Далее перейдем к тесту с использованием тестового фреймворка pytest на языке программирования Python.
Далее перейдем к обзору кода теста с использованием плагина pytest-bdd, который позволяет писать тесты в виде feature файлов Gherkin (чистый BDD-подход).
Feature: Login page A authorization Scenario: Authorizations with different users Given Login page When Log in with correct login and password Then Authorized and moved to main page
Из плюсов можно выделить то, что это все еще фреймворк pytest, который имеет множество плагинов для различных ситуаций, в том числе и для параллельного запуска тестов. Из минусов – сам чистый BDD-подход, который будет постоянно ограничивать разработчика своими особенностями. Spock Framework дает возможность писать более лаконичный и простой в оформлении код, по сравнению со связкой PyTest + pytest-bdd.

Заключение
В этой статье мы рассмотрели возможность упрощения работы с BDD с помощью фреймворка Spock. Подводя итоги, кратко выделим основные, на наш взгляд, плюсы и минусы Spock по сравнению с некоторыми другими распространенными тестовыми фреймворками.
- Использование принципов BDD вместо чистого BDD-подхода дает большую гибкость при написании тестов.
- Написанная тестовая спецификация является также и документацией системы.
- Наличие различных расширений для настройки тестов.
- Язык groovy (динамическая типизация, синтаксический сахар, closures или замыкания).
- Динамическая типизация языка groovy. Поскольку применяется динамическая типизация, то механизмы предугадывания, используемые в IDE для анализа содержимого переменной, при долгой работе могут начать сбоить. Если рассматривать Intellij IDEA, то постоянно ведутся доработки в этом направлении, что, несомненно, радует.
- Динамическая компиляция groovy кода в JVM байт-код. Если кратко, то не стоит писать все подряд на groovy, поскольку вы можете существенно проиграть во времени компиляции данного кода, особенно если он занимает много строк кода и часто используется. Важные части своего тестового фреймворка все же стоит писать на java, а groovy оставить для тестов.
- Набор расширений не такой обширный, как у testNG, к примеру. Как следствие – отсутствие параллельного запуска тестов. Есть планы добавить эту функциональность, но сроки их реализации неизвестны.
Что еще можно почитать:
- Особенности использования Spock в проектах на Kotlin
- Возможности фреймворка Spock
- Возможности фреймворка по подмене внешних зависимостей (созданию моков)
- Сравнение Junit5 и Spock 1.3
- автоматизация тестирования
- SDET
- behaviour driven development
- BDD
- Spock framework
- testing
- spock
- тестирование
- автотесты
- Блог компании SimbirSoft
- Тестирование IT-систем
- Программирование
- Тестирование веб-сервисов
- Управление разработкой
Источник: habr.com