Я большой поклонник автоматизированного тестирования. Как на работе, так и в личной жизни, это просто облегчает жизнь. И я говорю не только о модульном тестировании. Тестирование интеграции/принятия/проверки/E2E (в зависимости от того, какой термин вы предпочитаете) может быть бесценным инструментом, обеспечивающим совершенно другой уровень охвата того, что вы получаете от модульных тестов.
Однако для того, чтобы сделать это, вам нужно иметь возможность фактически запустить стек, который вы хотите протестировать. И вам нужно иметь возможность легко писать тесты, которые вы хотите запустить со стеком.
Для тестов такого уровня я большой поклонник Cucumber – для которого есть Java Runner . Это обеспечивает полное разделение между определениями тестов и фактическим кодом, который выполняет логику, что означает, что реализация тестов может быть изменена без изменения бизнес-определения.
Spring Boot и интеграция Cucumber Spring позволяют действительно легко запустить службу как часть тестового движка. Контекст Spring запускается один раз, с его помощью выполняются все функции, а затем контекст Spring завершается. Он даже поддерживает запуск приложения, прослушивающего случайный порт, чтобы не возникало конфликтов.
Итак, как вы заставляете это работать? Тесты на огурец состоят из трех разных частей. Там есть программа тестирования, файлы функций и Определения шагов.
Test Runner – это тривиальный класс JUnit, который просто использует Cucumber JUnit Runner и выполняет здесь всю тяжелую работу. Мои обычно выглядят так:
/**
* Test runner for all of the tests
*/
@RunWith(Cucumber::class)
@CucumberOptions(tags = arrayOf("~@ignore"),
format = arrayOf(
"pretty",
"html:target/site/cucumber/cucumber",
"json:target/failsafe-reports/cucumber.json"
),
strict = true)
internal class CucumberIT
Затем файлы компонентов находятся в любом месте того же пакета, в котором находится тестовый запуск – он найдет их все во время выполнения.
Определения шагов – это то, где все становится умнее. Cucumber-Spring позволяет вам указать контекст Spring, который запускается и используется для создания ваших определений шагов. Требование здесь заключается в том, что вы можете использовать только one Контекст Spring для всего набора тестов. Это означает, что нам нужен контекст Spring, который включает наши тестовые компоненты, но также импортирует приложение Spring Boot для запуска.
Мы приводим это в действие с помощью двух аннотаций к одному из определений шага – не имеет значения, какому именно. (Подробнее об этом в более позднем посте). Они выглядят как:
@ContextConfiguration(locations = arrayOf("classpath:/testContext.xml"))
@SpringBootTest(classes = arrayOf(Application::class), webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
internal class SomeStepDefs {}
Наконец, вам нужен способ фактически выполнять вызовы приложения Spring Boot, которое вы запускаете. Есть два способа справиться с этим, в зависимости от того, хотите ли вы выполнять вызовы REST или веб-браузер.
Для вызовов REST вам необходимо автоматически подключить компонент типа org.springframework.boot.test.web.client. TestRestTemplate Тестовая таблица . По сути, это RestTemplate, который закодирован для того, чтобы знать, как вызвать запущенное приложение Spring Boot. Он знает базовый URL-адрес для вызова, чтобы добраться до правильных конечных точек.
Для чего-либо еще вы можете использовать org.springframework.boot.context.embedded. Порт локального сервера аннотация для ввода значения в ваш класс содержит порт, который прослушивает приложение Spring Boot. Затем вы можете использовать этот порт для записи любого URL-адреса, который вы хотите, для любых целей, которые вы хотите – например, для включения Selenium.
Оригинал: “https://dev.to/grahamcox82/cucumber-and-spring-boot”