В этой статье представлен метод интеграции Spring Boot в огурец (BDD) и делится им с вами. Детали следующие:
1. Создайте новую структуру проекта Springboot следующим образом:
2. Добавить зависимости POM
<? xml version = "1.0" Encoding = "utf-8"?> <project xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xsi: schemalocation = "http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <dolidyversion> 4.0.0 </modelversion> <groupid> com.chhliu </GroupDsion> <ratfactid> Spring-boot-cucumber </artifactid> <sersive> 0.0.1-snapshot </version> <duckaging> jar </упаковка> <mame> spring-boot-cucumber </name> <description> демо-проект для Spring Boot и Cucumber </description> <parent> <groupid> org.spramework.boot </Groupid> <ratfactid> Spring-Boot-Starter-parent </artifactid> <sersive> 1.5.6.release </version> <venuvativePath/> <!-Поиск родителя от репозитория-> </parent> <properties> <cucumber.version> 1.2.4 </cucumber.version> <project.build.sourceencoding> utf-8 </project.build.sourceencoding> <project.Report.OutputEncoding> UTF-8 </Project.Report.OutputEncoding> <java.version> 1.7 </java.version> </Properties> <зависимости> <зависимости> </Java> </Properties> <groupId> org.springframework.boot </GroupId> <artifactid> Spring-boot-starter-web </artifactid> </depervice> <depervice> <groupid> info.cukes </GroupId> <artifactId> </artifactid> <serse.gress> </artifactid> <sersive> $ {wumber.version> </artifactid> <serse> $ <groupId> info.cukes </GroupId> <ArtifactId> Cucumber-core </artifactid> <sersive> $ {cucumber.version} </version> </grestonder> <dehyederiation> <groupid> info.cukes </GroupId> <strifactid> cucumber-spring </artifactid> <serse> $ {cucumber.aversion aversion. <dependency> <groupId>info.cukes</groupId> <artifactId>cucumber-junit</artifactId> <version>${cucumber.version}</version> <exclusions> <exclusion> <groupId>junit</groupId> <artifactId>junit</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId> org.springframework.boot </GroupId> <ArtifactId> spring-boot-starter-test </artifactid> <scope> test </scope> </dependency> </depertive> <broad> <blicins> <groupd> org.springframe.boot </artifactid> <artifactid> pring-boot-mavin-plugn <source>1.7</source> <target>1.7</target> </configuration> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <configuration> <source>1.7</source> <target>1.7</target> </configuration> <executions> <execution> <phase>integration-test</phase> <goals> <goal>java</goal> </goals> <configuration> <classpathScope>test</classpathScope> <mainClass>com.chhliu.test.CucumberTest.java</mainClass> <arguments> <argument>--plugin</argument> <argument>pretty</argument> <argument>--glue</argument> <аргумент> src/test/resources/</argirt> </arguments> </configuration> </выполнение> </выполнения> </plugin> </plugins> </build> </project>2. Написать интерфейс службы и классы реализации
пакет com.chhliu.service; / ** * Вход в систему моделирования * @author chhliu * */ public interface userinfoservicei {boolean login (string username, String password, String enformpassword); } пакет com.chhliu.service; Импорт org.springframework.stereotype.service; @Service ("userInfoService") открытый класс userInfoService реализует userInfoServicei {public boolean login (string username, string password, string enformpassword) {return (username.equals ("chhliu") && password.equals ("123456") && conformpass.equals ("123456"); }} 3. Напишите файлы функций
#language: zh-CN #"zh-CN": { # "but": "*|But<", # "and": "*|and<|and<|and<|at the same time<", # "then": "*|So<", # "when": "*|When<", # "name": "Chinese simplified", # "native": "Simplified Chinese", # "feature": "Function", # "background": «Фон», # «Сценарий»: «Сценарий_утлин»: «Схема сценария | Схема скрипта», # «Примеры»: «Примеры», # «дано»: «*| if <| if <| if <| if <| if <| if <» #} @bank функция: если я снимаю деньги в банке, если я вхожу в систему, и пароль введен, а затем и баланс, а затем, то, то это будет правильно, а затем на основе. Если баланс составляет 500 000 человек, сценарий: Банк снял деньги, если: я вхожу в систему с «chhliu», а введенный пароль - «123456», когда: подтверждение пароля также «123456», то: баланс банковской карты будет «500 000». 4. Напишите тестовые классы
пакет com.chhliu.test; Импорт org.junit.runner.runwith; импортировать Cucumber.api.cucumberoptions; импортировать Cucumber.api.junit.cucumber; /*** @runwith (cucumber.class) Это бегун, который относится к использованию огурцов для запуска тестов* @cucumberoptions, в котором указывается каталог функции, которая будет выполнена в нашем проекте* @cucumberoptions в формате, в котором указывается отчет, который можно получить, когда мы работаем в нашем проекте, а затем в соответствующем отчете о тестируемых Укажите каталог, который находит файл определения шага, когда проект запускается * * В реальных проектах, поскольку проект прогрессирует, тестовый проект может состоять из нескольких файлов функций, и каждый файл функций также может состоять из нескольких сценариев. По умолчанию * каждый запуск должен запускать все сценарии во всех функциях. Это может привести к тому, что тестовый скрипт будет работать один раз при нормальных обстоятельствах, что требуется очень много времени, чтобы ждать результатов теста. * Однако в реальном процессе тестовые случаи различаются по приоритету. Например, дымовой, регрессионный тест и т. Д. Или, или иногда существуют особенно небольшие случаи использования, такие как уровень, являются критическими, * эти варианты использования требуют долгосрочной операции, чтобы отслеживать, есть ли система нет белых страниц или страниц 404. В настоящее время мы можем использовать теги * В огурце, тег непосредственно добавляет любое количество тегов с префиксом @для функции или сценария перед функцией, сценарием или сценарием ключевых слов, а несколько тегов разделены Spaces * @author chhliu */ @runwith (cucumber.class) @cucumberoptions (plugin = {json. "Pretty"}, функции = "src/test/resources") открытый класс Cucumbertest {} 5. Запустите тестовый класс и улучшите неопределенные шаги тестового вывода
пакет com.chhliu.test; Импорт javax.annotation.resource; Импорт org.junit.assert; импорт com.chhliu.service.userinfoservicei; импортировать Cucumber.api.java.zh_cn.if; импортировать Cucumber.api.java.zh_cn.when; импортировать Cucumber.api.java.zh_cn.so; Общедоступный класс CUCUMEST интеграция Spring {@Resource (name = "userInfoService") Private UserInfoServicei Service; частное имя пользователя; Private String Password; Приватная строка Подтверждение PassPassword; @If ("^: я вхожу в систему $ с/" ([^/"]*)/" $ ") public void i вход (String arg1) бросает Throwable {this.username = arg1;} @if ("^: введенный пароль/"([^/"]*)/"$") public void введенный пароль (String arg1) throws throwable {this.pass vasle = arge vasle = arg; } @When ("^: пароль также/" ([^/"]*)/" $ ") public void подтверждает пароль также _ (String arg1) бросает throwable {this.confirpspassword = arg1;} @Then ("^: Показать баланс банковской карты/"([^/"]/"$"). service.login (имя пользователя, пароль, подтверждение appassword); if (islogin) {System.out.println («Вход успешно! Баланс запроса заключается в следующем:«+arg1); Assert.assertequals ("500000", Arg1); }}} 6. Добавьте поддержку аннотации к этапам испытаний
@Runwith (springjunit4classrunner.class) @contextconfiguration // Если эта аннотация не добавлена, бобы будут введены и не могут быть введены @springboottest // Если эта аннотация не будет добавлена, бобы не найдены в общедоступном интеграции Cucumber {}. 7. Результаты теста
2 сценария (2 прошло)
11 шагов (11 прошло)
0m0.091s
8. Точки интеграции
При интеграции Spring Boot с огурцом существует точка, на которую необходимо обратить внимание, поскольку Spring Boot Advocates de-xmlization, поэтому традиционным образом огурец будет читать файл конфигурации Cucumber.xml под классом для инициализации бобов. После интеграции с пружиной этот метод не может быть использован. Вам нужно использовать аннотацию @ContextConfiguration для реализации загрузки класса. Если файл конфигурации необходимо загрузить, вы можете использовать его следующим образом:
@ContextConfiguration (locations = {"classPath: ApplicationContext.xml"})Если вы используете аннотации для интеграции, используйте следующее:
@ContextConfiguration (Classe = SpringBootCucumberApplication.class)
Или напрямую
@ContextConfiguration
Специальное примечание. Должна быть добавлена аннотация @ContextConfiguration, в противном случае инъекция бобов потерпит неудачу.
Далее, давайте посмотрим, почему эта ситуация вызвана исходным кодом.
Код, участвующий в этой части, находится в классе SpringFactory в рамках пакета Cucumber-Spring. Давайте посмотрим на следующий класс:
public void start () {// Метод начала теста огурца if (StepClasswithspringContext! = null) {// Если используется аннотация @ContextConfiguration, это не null testcontextmanager = new CucumberTestContextManager (StepClassWithSpringContext); } else {// в противном случае StepClassWithSpringContext будет нулевым, и он введет следующую ветвь if (beanfactory == null) {beanfactory = createFallbackContext (); // Этот метод - фокус, который мы хотим следовать}} notifyContextAraboutTestStarted (); if (beanfactory == null || isnewcontextcreated ()) {beanfactory = testcontextmanager.getbeanfactory (); для (класс <?> StepClass: StepClasses) {RegisterStepClassBeanDefinition (BeanFactory, StepClass); }} Gluecodecontext.instance.start (); } Давайте следуем методу CreateFallbackContext:
Private ConfigurableListableBeanFactory createFallbackContext () {configurableApplicationContext ApplicationContext; if (getClass (). getClassloader (). getResource ("cucumber.xml")! = null) {// <span style = "font-family: arial, helvetica, sans-serif;"> configurutableplicationcontext </span> applicationcontext = new classpathxmlapplicationcontextextextextextextextepleplicationcontext </span> applicationcontext = new classpathxmlapclictioncontextextextextextext } else {// Если cucumber.xml не настроен, он будет новым GenericApplicationContext = new GenericApplicationContext (); } ApplicationContext.registerShutDownHook (); ConfigurableListableBeanFactory BeanFactory = ApplicationContext.getBeanFactory (); beanfactory.registerscope (gluecodescope.name, new gluecodescope ()); для (класс <?> StepClass: StepClasses) {RegisterStepClassBeanDefinition (BeanFactory, StepClass); } return beanfactory; }Наконец, давайте поговорим о классе GenericApplicationContext. Этот класс будет основан на типе бобов, а затем на экземпляре NewInstance. Однако, поскольку другие классы вводится в этот класс, инъекционный класс не может быть инициализирован через новый экземпляр, поэтому инъекция потерпит неудачу, и будет сообщено о нулевом указателе.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.