Este artículo presenta el método de integrar el arranque de primavera en pepino (BDD) y lo comparte con usted. Los detalles son los siguientes:
1. Cree una nueva estructura del proyecto SpringBoot de la siguiente manera:
2. Agregar dependencias de POM
<? xml versión = "1.0" encoding = "utf-8"?> <Project xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.w3.org/2001/xmlschemainstance" xsi: schemalocation = "http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <Modelversion> 4.0.0 </modelversion> <MoupRid> com.chhliu </proupid> <artifactid> spring-boot-cuwumber </artifactid> <versión> 0.0.1-snapshot </versions> <packaging> jar </paquete> <name> spring-bot-cucumber </name> <scription> Proyecto de demostración para Spring Boot y Cucumber </cription> <Parent> <grupo> Org.springframework.Boot </proupid> <artifactid> Spring-Boot-Starter-Parent </artifactid> <versión> 1.5.6.release </versewer> <relativePath/> <!-Buscar padre desde repositorio-> </rent> <propersies> <cucumber.version> 1.2.4 </cucumber.version> <Project.Build.SourceEncoding> UTF-8 </project.build.sourceEncoding> <Project.Reporting.outputEncoding> Utf-8 </project.Reporting.outputEncoding> <Java.version> 1.7 </Java.Version> </propiences> <pendences> <Spendences> <MoupRoD> org.springframework.boot </groupid> <artifactid> spring-boot-starter-web </artifactid> </pepertency> <pendency> <grupoD> info.cukes </groupid> <arifactid> cucumber-java <//version> <potlé <groupId>info.cukes</groupId> <artifactId>cucumber-core</artifactId> <version>${cucumber.version}</version> </dependency> <dependency> <groupId>info.cukes</groupId> <artifactId>cucumber-spring</artifactId> <version>${cucumber.version}</version> </dependency> <Spendency> <MoupRid> INFO.CUKES </Groupid> <SartifactId> Cucumber-Junit </artifactid> <verserse> $ {Cucumber.version} </versión> <exclusions> <Extusion> <ProupId> Junit </GroupId> <AriFactId> Junit </ArtifactId> </axusion> </excusions> </expession> <Pape> <SpEndenty> <MoupRoD> org.springframework.boot </groupid> <artifactid> spring-boot-starter-test </artifactid> <cope> test </scope> </pendency> </dependencias> <construction> <glugins> <proupid> org.springfframework.boot </groupid> <artifactid> spring-boot-maven-plugen <pplugen </artattin <Configuración> <vero> 1.7 </fuente> <arget> 1.7 </target> </figuration> </tugin> <glugin> <proupid> org.codehaus.mojo </groupid> <artifactid> exec-maven-plugin </arifactid> <figuration> <outide> 1.7 </over> <AtiA <fase>-Test de integración </fase> <estemates> <pote> java </poal> </puse> <figuration> <classpathscope> test </classpathscope> <mainclass> com.chhliu.test.cucumberTest.java </mainclass> <enguments> <en argumento>-plugin </argumento> </argumento> </argumento>-argumento>-argumento </argumento>-/argumento>-/argumento </argumento> <GRUGSE> SRC/Test/Resources/</Argument> </Arguments> </Configuration> </secution> </ejecutions> </plugin> </glugins> </stract> </proyecto>2. Escriba la interfaz de servicio y las clases de implementación
paquete com.chhliu.service; / ** * Login de simulación * @author chhliu * */ pública interface userInfoservicei {boolean login (string username, string contraseña, cadena confirmingpassword); } paquete com.chhliu.service; importar org.springframework.stereotype.service; @Service ("UserInfoservice") Public Class UserInfoservice implementa UserInfoserviceI {public boolean login (String UserName, String Password, String ConfirmoSword) {return (username.equals ("Chhliu") && Password.equals ("123456") && ConfirmPassPass.equals ("123456")); }} 3. Escribir archivos de características
#language: zh-cn # "zh-cn": { # "pero": "*| pero <", # "y": "*| y <| y <| y <| a la misma hora <" ", #" entonces ":"*So <", #" When "*| When <", # "Nombre": "Chino simplificado", # "nativo": "Simplificado chino", # Característica ":" Característica ":": "Función", # "," Nombre "," Nombre ". "Background", # "Escenario": "Scenario_outline": "Esquema del escenario | Esquema de script", # "Ejemplos": "Ejemplos", # "dada": "*| if <| if <| if <| if <| if <" #} @Bank Función: Si retiro dinero en el banco, si lo inicio con éxito y la contraseña ingresada es correcta, luego mi balance de tarjetas bancarias será. Si el saldo es de 500,000, Escenario: Bank Retire Money Si: Irl In "Chhliu" y la contraseña ingresada es "123456" cuando: Confirmar la contraseña también es "123456", entonces: el saldo de la tarjeta bancaria será "500,000" 4. Escribir clases de prueba
paquete com.chhliu.test; importar org.junit.runner.runwith; import cucumber.api.cucumberOptions; import cucumber.api.junit.cucumber; /*** @runwith (cucumber.class) Este es un corredor, que se refiere al uso de pepino para ejecutar pruebas* @CucumberOptions, que especifica el directorio de la función que se ejecutará en nuestro proyecto* @CucumberOption Especifique el directorio que encuentra el archivo de definición de paso cuando el proyecto se ejecuta * * En proyectos reales, a medida que avanza el proyecto, un proyecto de prueba puede consistir en múltiples archivos de características, y cada archivo de características también puede consistir en múltiples escenarios. Por defecto, * cada ejecución es ejecutar todos los escenarios en todas las características. Esto puede hacer que el script de prueba se ejecute una vez en circunstancias normales, lo que lleva mucho tiempo esperar los resultados de la prueba. * Sin embargo, en el proceso real, los casos de prueba se distinguen por prioridad. Por ejemplo, Smoketest, RegresionTest, etc., o a veces hay casos de uso particularmente pequeños, como el nivel es crítico, * Estos casos de uso requieren una operación a largo plazo para monitorear si el sistema no tiene páginas blancas o páginas 404. * Por lo tanto, tenemos que distinguir todos los escenarios, de modo que cuando iniciamos el script de prueba, podamos ejecutar el escenario de qué módulos necesitamos. En este momento, podemos usar etiquetas * en pepino, la etiqueta agrega directamente cualquier número de etiquetas con prefijo @a la función o escenario antes de las palabras clave de la función, escenario o de esquema de escenario, y varias etiquetas están separadas por espacios * @author chhliu * */ @runwith (cucumber.class) "Pretty"}, características = "src/test/recursos") clase pública CucumberTest {} 5. Ejecute la clase de prueba y mejore los pasos indefinidos de la salida de prueba
paquete com.chhliu.test; import javax.annotation.resource; importar org.junit.assert; import com.chhliu.service.userinfoservicei; import cucumber.api.java.zh_cn.if; import cucumber.api.java.zh_cn.When; import cucumber.api.java.zh_cn.so; Public Class Cucumber Integration Spring {@Resource (name = "UserInfoservice") Servicio privado de usuarios de userInfoservicei; nombre de usuario de cadena privada; contraseña de cadena privada; Private String ConfirmPassword; @If ("^: I Sogn en $ con/" ([^/"]*)/" $ ") public void i log en (string arg1) lanza lando {this.Username = arg1;} @if ("^: la contraseña ingresada es/"([^/"]*)/"$") public Void the Password Ingresed Is (String Arg1) lanza lanza {this.passwortworthalworthalsworthworthal = arg1; } @When ("^: La contraseña también es/" ([^/"]*)/" $ ") public void confirmar la contraseña también es _ (String arg1) lanza lanza {this.confirmPassword = arg1;} @then ("^: Muestre el saldo de la tarjeta bancaria es/"(^/"]*)/"$") public Public boid muestra el saldo de la carta bancaria (string shrew) lanza lanza shrows shole shrows es/"(^/"]*)/"$") Public boid muestra el saldo bancario (string saldo) lanza lanza lanza arg1 es lanzar shows Service.login (nombre de usuario, contraseña, confirmarpassword); if (islogin) {system.out.println ("¡Iniciar sesión con éxito! El saldo de la consulta es el siguiente:"+arg1); Afirmar.AssERTequals ("500000", Arg1); }}} 6. Agregar soporte de anotación a los pasos de prueba
@Runwith (SpringJunit4ClassRunner.class) @ContextConfiguration // Si no se agrega esta anotación, el bean se inyectará y no se puede inyectar @SpringBoottest // si esta anotación no se agrega, el bean no se encontrará con la primavera de integración de cucos públicos {} 7. Resultados de la prueba
2 escenarios (2 aprobados)
11 pasos (11 pasaron)
0m0.091s
8. Puntos de integración
Al integrar el arranque de primavera con el pepino, hay un punto al que debe prestarse atención, porque Spring Boot aboga por la des-xmlización, por lo que de la manera tradicional, el pepino leerá el archivo de configuración de cucumber.xml en classpath para inicializar el bean. Después de integrarse con Spring, este método no se puede utilizar. Debe usar la anotación @ContextConfiguration para implementar la carga de clase. Si el archivo de configuración debe cargarse, puede usarlo de la siguiente manera:
@ContextConfiguration (ubicaciones = {"classpath: applicationContext.xml"})Si usa anotaciones para integrar, use lo siguiente:
@ContextConfiguration (classes = SpringBootCuCeApplication.Class)
O directamente
@ContextConfiguration
Nota especial: se debe agregar la anotación de @ContextConfiguration, de lo contrario, la inyección de frijoles fallará.
A continuación, echemos un vistazo a por qué esta situación es causada por el código fuente.
El código involucrado en esta parte se encuentra en la clase SpringFactory bajo el paquete de pepita de pepino. Echemos un vistazo a la siguiente clase:
Public void start () {// Método de inicio de prueba de pepino if (stepclassWithSpringContext! = NULL) {// Si se usa la anotación @ContexTConfiguration, esto no es nulo testContextManager = new CucumberTestContextManager (StepClassWithSpringContext); } else {// de lo contrario StepClassWithSpringContext será nulo, y ingresará la siguiente rama if (beanFactory == null) {beanFactory = createFallbackContext (); // Este método es el enfoque que queremos seguir}} NotifyContextManeGoutTestClassSteTed ();; if (beanFactory == null || isNewContextCreated ()) {beanFactory = testContextManager.getBeanFactory (); para (class <?> stepclass: steplasses) {RegisterStepClassBeanDefinition (BeanFactory, StepClass); }} GlueCodeContext.Instance.start (); } Sigamos el método CreateFallbackContext:
privado configuradorableListableBeanFactory CreateFallBackContext () {configurureableApplicationContext ApplicationContext; if (getClass (). getClassLoader (). getResource ("cuucumber.xml")! = null) {// the <span style = "font-family: arial, helvetica, sans-serif;"> configuriveAppeApplicationContext </span> Application = new ClasspathxmlaPplicationConteTonteTontext ("CECUCERMLL"); } else {// Si cucumber.xml no está configurado, nuevo genicAplicationContext = new GenericApplicationContext (); } ApplicationContext.RegisterShutdownHook (); ConfiguableListableBeanFactory beanFactory = applicationContext.getBeanFactory (); BeanFactory.Registerscope (glueCodescope.name, new Gluecodescope ()); para (class <?> stepclass: steplasses) {RegisterStepClassBeanDefinition (BeanFactory, StepClass); } return beanFactory; }Finalmente, hablemos de la clase GenericApplicationContext. Esta clase se basará en el tipo de bean y luego en la instancia de NewInstance. Sin embargo, dado que otras clases se inyectan en esta clase, la clase inyectada no se puede inicializar a través de la nueva instancia, por lo que la inyección fallará y se informará un puntero nulo.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.