Некоторые из возможностей Spock Framework 0.4 начинают выходить в свет, а таблицы данных были объяснены на прошлой неделе в хорошем блоге Питера Нидервизера. Одна из новых функций, которых я раньше не видел, — это новое расширенное использование @Unroll. Смешанный с таблицами данных, он дает очень интересные результаты, и его можно использовать со спецификацией 0,3 стиля. Вот сок:
Интеграция JUnit и @Unroll
Spock построен на JUnit и всегда имел хорошую поддержку IDE без каких-либо усилий со стороны пользователя. По большей части IDE просто считают, что Spock — это еще один модульный тест. Вот спецификация Спока для новой функции Таблицы данных и ее отображение в IDE.
import spock.lang.*
class TableTest extends Specification {
def "maximum of two numbers"() {
expect:
Math.max(a, b) == c
where:
a | b | c
3 | 7 | 7
5 | 4 | 5
9 | 9 | 9
}
}
Утверждение будет выполнено 3 раза: по одному разу для каждой строки в таблице данных. И JUnit точно сообщает имя метода правильно, даже если в именах методов есть пробел:
Проблема с управляемыми данными тестами и xUnit заключается в плохом обнаружении ошибок. Если тест не пройден, вы получите сообщение о том, какой метод является виновником … но что, если метод выполняет утверждение на 50 или 60 фрагментах данных? Причина сбоя почти никогда не ясна в тестах, управляемых данными. В худшем случае вам придется пройти несколько итераций кода в ожидании исключения. Хорошие тесты имеют явную точку отказа, но хорошие тесты также не повторяются с образцом. Именно поэтому у Спока есть аннотация @Unroll. Как автор теста вы можете написать один лаконичный модульный тест, а JUnit предоставляет отчеты о результатах, которые помогают изолировать сбои. Рассмотрим тот же метод тестирования с аннотацией @Unroll и сопровождающим выводом IDE.
@Unroll
def "maximum of two numbers"() {
expect:
Math.max(a, b) == c
where:
a | b | c
3 | 7 | 7
5 | 4 | 5
9 | 9 | 9
}
При выполнении JUnit видит три метода тестирования вместо одного: по одному для каждой строки в таблице данных:
конечный результат для вас как для автора тестов — точное разрешение ошибок. Вы можете точно определить, какая строка провалилась. Эта функция доступна в версии 0.3, и вы можете использовать ее сегодня. Что нового в 0.4 — это возможность динамического изменения имени теста. Вот полная аннотация @Unroll, которая меняет имя метода:
@Unroll("maximum of #a and #b is #c")
def "maximum of two numbers"() {
expect:
Math.max(a, b) == c
where:
a | b | c
3 | 7 | 7
5 | 4 | 5
9 | 9 | 9
}
Обратите внимание на синтаксис #variable в параметре аннотации. # Производит своего рода GString-подобную подстановку переменных, которая позволяет вам связывать столбцы из вашей таблицы данных с именем вашего теста. Параметр аннотации ссылается на #a, #b и #c, что соответствует определению таблицы данных для | б | с. Проверьте вывод IDE:
Ранее имя теста было просто номером итерации в тесте. Новый параметр @Unroll позволяет сделать имя теста гораздо более значимым. Ваши тесты улучшатся, потому что сбои становятся более описательными. Развернутые сообщения об ошибках раньше просто включали в себя имя итерации, а теперь они могут содержать значимые данные, которые вы прописываете.
Моя любимая часть игры с новым @Unroll — видеть значение параметра по умолчанию в исходном коде Спока:
java.lang.String value() default "#featureName[#iterationCount]";
Поговорим о том, чтобы есть свою собачью еду … значение по умолчанию — это шаблон имени теста, как вы могли бы написать в своем собственном тесте. Заставляет задуматься, какие еще переменные находятся в области видимости, а?
Сборки снимков Spock для 0.4 доступны по адресу: http://m2repo.spockframework.org . Получите его до разрыва связи.