tl; dr вы можете использовать метки, чтобы уточнить стиль тестирования «когда да».
Что дается-когда-то?
Given-when-then — это широко используемый стиль определения поведения системы, при котором ваши тесты делятся на три раздела.
- Дан раздел, в котором изложены предварительные условия для теста, т. Е. В каком состоянии вы предполагаете находиться в мире перед началом.
- Предложение When выполняет тестируемое действие.
- Оператор Then проверяет, выполняется ли условие post. Обычно это делается в форме утверждения значений или проверки взаимодействия с макетами.
Это не всегда тот случай, когда вам нужно иметь три раздела в коде каждого теста. Например, данный раздел может быть покрыт обычным setUp
методом. Я думаю, что это хорошая идея, чтобы следовать шаблону и разделить различные разделы, потому что это позволяет вам четко видеть дерево с деревьев.
Использование ярлыков с Junit
В некоторых проектах я экспериментировал с тем, чтобы пойти немного дальше, чем просто разделить данные / когда / затем и использовать метки Java, чтобы выложить различные разделы теста, чтобы прояснить ситуацию по-настоящему [0] . Следующий фрагмент кода показывает, как вы можете реализовать это с помощью Junit.
Cafe cafe =newCafe();@Testpublicvoid cafeShouldNeverServeCoffeeItDoesntHave(){Given: cafe.setCoffeesRemaining(1);When: cafe.serveCoffee();Then: assertFalse(cafe.canServeCoffee());}
Это очень простой пример для демонстрации макета. Наш тест проверяет, что Cafe
никогда не подают кофе, которого у него нет. Существует четкое разграничение трех разделов кода по меткам. Немного необычно видеть, как используются такие метки — они наиболее часто используются в Java как способ вырваться из вложенных циклов за один раз. Конечно, нет никакой реальной причины не использовать их таким образом, это просто стилистический вопрос, и нет никакой семантической разницы между кодом с метками и без них.
Использование ярлыков с лямбда-поведением
Хотя я уверен, что большинство разработчиков Java используют Junit, я недавно выпустил новую библиотеку под названием Lambda Behave . Это разработано, чтобы быть современной структурой тестирования и поведенческой спецификации для Java 8, которая облегчает написание беглых и удобочитаемых тестов. В лямбда-поведении вы пишете тесты, перечисляя описательную строку вместо ограничительного имени метода и описывая тело теста в лямбда-выражении. Я обнаружил, что тесты, написанные в этом стиле, намного легче читать.
Вы можете использовать тот же заданный / когда / затем стиль метки в лямбда-поведении, как показано в следующем примере кода:
describe("a cafe", it ->{Cafe cafe =newCafe(); it.should("never serve coffee it doesn't have", expect ->{Given: cafe.setCoffeesRemaining(1);When: cafe.serveCoffee();Then: expect.that(cafe.canServeCoffee()).is(false);});});
Ограничения и альтернативы
Самым большим неудобством использования меток таким образом является то, что по неизвестной мне причине вы не можете написать метку до объявления объявления переменной в Java. Это означает, что если вы хотите начать Given:
предложение, используя новую переменную, вам нужно поднять объявление переменной в верхнюю часть блока или в поле. Я не считаю, что это большая проблема, и на самом деле подъем может привести в порядок вещи еще дальше.
Альтернативный и, возможно, более распространенный подход заключается в использовании комментариев для обозначения заданных / когда / затем предложений. Я думаю, что выбор между ними в основном стилистический, а не содержательный. В обоих случаях вы просто пишете некоторый пояснительный текст, а не встраиваете эту функцию в среду тестирования, как это делают Cucumber и JBehave. Я думаю, что идея использовать ярлыки в качестве отдельных комментариев подходит, если вы согласились с соглашением в вашей команде, и если вы хотите, чтобы эти ярлыки выделялись больше, чем обычные комментарии.
Некоторые люди используют альтернативные модели «задано / когда / потом», которые похожи, но имеют больше фаз, таких как четырехфазный подход к тестированию, или даже разные имена, такие как Arrange, Act, Assert . С этими стилями также можно использовать соглашение на основе меток или комментариев.
Выводы
Я поместил пример кода на github, если кто-то хочет посмотреть или поиграть в своей IDE. Там не так много кода, потому что это просто очень простые примеры, но может быть полезно показать, что никакой магии не происходит!
Я показал, как вы можете использовать метки, чтобы прояснить назначение блоков кода в этом посте, и, надеюсь, это метод, который люди находят полезным и полезным. Независимо от того, используете ли вы ярлыки для реализации данных «когда тогда» или нет, я надеюсь, что люди пишут свои тесты в соответствии с неким соглашением. Это действительно делает происходящее намного понятнее. Я уверен, что некоторые люди имеют мнения по этому вопросу, поэтому дайте мне знать, вы думаете, это хорошая идея или нет?
Благодарю Рауля Габриэля Урму , Криса Уэста и Джеймса Росса за комментарии к сообщению в блоге.
[0] Я / думаю / что у меня появилась идея от Хосе Лларены после разговора с ним на мероприятии LJC, так что спасибо Хосе!