Cet article présente la méthode d'intégration de Spring Boot dans Cucumber (BDD) et le partage avec vous. Les détails sont les suivants:
1. Créez une nouvelle structure de projet Springboot comme suit:
2. Ajouter des dépendances 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"> <modeversion> 4.0.0 </ Modelversion> <ProupId> com.chhliu </prandId> <ArtefactId> Spring-Boot-cucumber </ artifactid> <version> 0.0.1-snapshot </-version> <packaging> jar </packaging> <name> printemp-boot cucumber </name> <escription> Project de démonstration pour la botte de printemps et le cucumber </cription> <parent> <proupId> org.springframework.boot </prebunId> <ArtefactId> Spring-Boot-Starter-Parent </ ArfactId> <Dersion> 1.5.6.release </DERNIFICATION> <RelativePath /> <! - Recherche Parent du référentiel -> </parent> <propperties> <Cucumber.Version> 1.2.4 </cumber.Version> <project.build.sourceencoding> utf-8 </project.build.sourceencoding> <project.reportting.outputencoding> utf-8 </project.reportting.outputending> <java.version> 1.7 </java.version> </properties> <pèbres> <Detency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>info.cukes</groupId> <artifactId>cucumber-java</artifactId> <version>${cucumber.version}</version> </dependency> <dependency> <GroupId> info.cukes </rom grouped> <Artifactid> Cucumber-core </ artifactId> <De version> $ {cucumber.version} </ version> </pedigency> <dependency> <proupId> infactid> </proupId> <Artifactid> Cucumber-Spring </ Artifactid> <version> $ {Cucumber.Version} <Dependance> <GroupId> info.cukes </proupId> <Artifactid> Cucumber-junit </Retifactid> <DERSE> $ {Cucumber.Version} </ version> <cglusions> </clusion> <proupId> junit </pr grouped> <artifactid> JUNIT </Retifactid> </clusion> <GroupId> org.springframework.boot </proupId> <ArtifactId> Spring-Boot-starter-test </ artifactid> <ccope> test </cope> </dependency> </dependces> <fuild> <plugins> <proupId> org.springframework.boot </prounid> <ArtifActid> Spring-boot-maven-plugin </prolsid> <fracenguration> <Source> 1.7 </ source> <parget> 1.7 </ cible> </ configuration> </Glugin> <Glugin> <ProupID> org.codehaus.mojo </proncId> <Artifactid> EXEC-MAVEN-PLUGIN </ ARTIFACTID> <FIFIGRATIVATION> <DEXED> 1.7 </FECRIED> <gase> Integration-test </ phase> <pose> <tobjectif> java </ but> </ buts> <fonfiguration> <classpathscope> test </casspathscope> <mainclass> com.chhliu.test.cucumbertest.java </-mainclass> <rarguments> <pargument> - plugin </ argument> <argument> argument </raginée> <Ugit> SRC / TEST / RESSOURCES / </ Argument> </ Arguments> </ Configuration> </ Execution> </Executions> </ Plugin> </ Plugins> </Duild> </rands>2. Écrivez des classes d'interface de service et d'implémentation
Package com.chhliu.service; / ** * Login de simulation * @author chhliu * * / interface publique userInfoservicei {boolean connexion (nom d'utilisateur de chaîne, mot de passe de chaîne, string confirmPassword); } Package com.chhliu.service; import org.springframework.sterreotype.service; @Service ("userInfoService") public class userInfoservice implémente userInfoservicei {public boolean ligin (String username, String Motword, string confirmPassword) {return (username.equals ("chhliu") && password.equals ("123456") && confirmpassword.equals ("" 123456 ")); }} 3. Écrivez des fichiers de fonctionnalités
#Language: zh-cn # "zh-cn": {# "mais": "* | mais <", # "et": "* | et <| et <| et <| en même temps <", # "alors": "* | SO <", # "quand": "* | quand <", # "nom": "Chinese Simplified", # "natif": "Simpl "Background", # "Scénario": "Scénario_outline": "Outline scénario | Outline de script", # "Exemples": "Exemples", # "Give": "* | Si <| Si <| Si <| Si <| Si <Si <" #} @bank Fonction: Si je me retire de l'argent à la banque, si je me connecte avec succès et que le mot de passe est entré est correct, alors mon balise de la carte bancaire sera affichée. Si le solde est de 500 000, scénario: la banque retire de l'argent si: je me connecte avec "chhliu" et le mot de passe entré est "123456" quand: confirmer le mot de passe est également "123456", alors: le solde de la carte bancaire sera "500 000" 4. Écrivez des classes de test
package com.chhliu.test; import org.junit.runner.runwith; Importer Cucumber.API.cucumberOptions; Importer Cucumb.api.Junit.cumber; / ** * @runwith (cucumber.class) Ceci est un coureur, qui fait référence à l'utilisation du concombre pour exécuter des tests * @cucumberOptions, qui spécifie le répertoire de la fonctionnalité à exécuter dans notre projet * @cumberoptions format Utilisé pour spécifier le répertoire qui trouve le fichier de définition d'étape lorsque le projet s'exécute * * dans les projets réels, au fur et à mesure que le projet progresse, un projet de test peut être composé de plusieurs fichiers de fonctionnalités et chaque fichier de fonctionnalités peut également être composé de plusieurs scénarios. Par défaut, * chaque exécution consiste à exécuter tous les scénarios dans toutes les fonctionnalités. Cela peut entraîner l'exécution du script de test une fois dans des circonstances normales, ce qui prend beaucoup de temps pour attendre les résultats des tests. * Cependant, dans le processus réel, les cas de test se distinguent par la priorité. Par exemple, SmokeTest, RégressionTest, etc. ou parfois il y a des cas d'utilisation particulièrement petits, tels que le niveau est critique * * Ces cas d'utilisation nécessitent un fonctionnement à long terme pour surveiller si le système n'a pas de pages blanches ou pages 404. * Nous devons donc distinguer tous les scénarios, de sorte que lorsque nous commençons le script de test, nous pouvons exécuter le scénério de quels modules dont nous avons besoin. À l'heure actuelle, nous pouvons utiliser des balises * dans Cucumber, TAG ajoute directement n'importe quel nombre de balises avec des mots clés préfixés @ to to to "joli"}, fonctionnalités = "src / test / ressources") classe publique CucumbumberTest {} 5. Exécutez la classe de test et améliorez les étapes non définies de la sortie de test
package com.chhliu.test; import javax.annotation.resource; import org.junit.asser; Importer com.chhliu.service.UserInfoservicei; import Cucumber.api.java.zh_cn.if; Importer CuCumber.api.java.zh_cn.When; import Cucumber.api.java.zh_cn.so; classe publique Cucumber Integration Spring {@Resource (name = "userInfoService") Service privé UserInfoServicei; Nom d'utilisateur de chaîne privée; mot de passe de chaîne privé; String privé confirmPassword; @If ("^:I log in $ with /"([^/"]*)/"$") public void I log in $ with _(String arg1) throws Throwable { this.username = arg1; } @If ("^: The password entered is /"([^/"]*)/"$") public void The password entered is (String arg1) throws Throwable { this.password = arg1; } @When ("^: Le mot de passe est également /" ([^ / "] *) /" $ ") public void confirment le mot de passe est également _ (String arg1) lance le lancement {this.confirmpassword = arg1;} @Then (" ^: Afficher le bilan de la carte bancaire est / "([^ /"] *) / "$") public Vender montre le banc de cartes bancaires est (String Arg1) Service.Login (nom d'utilisateur, mot de passe, confirmpassword); if (islogin) {System.out.println ("Connexion avec succès! Le solde de la requête est le suivant:" + arg1); Assert.asserTequals ("500000", arg1); }}} 6. Ajouter un support d'annotation aux étapes de test
@Runwith (springjunit4classrunner.class) @contextconfiguration // Si cette annotation n'est pas ajoutée, le bean sera injecté et ne peut pas être injecté @springboottest // Si cette annotation n'est pas ajoutée, le bean ne sera pas trouvé
7. Résultats des tests
2 scénarios (2 passés)
11 étapes (11 passé)
0m0.091s
8. Points d'intégration
Lors de l'intégration de Spring Boot avec Cucumber, il y a un point qui doit être prêté attention, car Spring Boot préconise la dé-xmlisation, donc de manière traditionnelle, le concombre lira le fichier de configuration CuCumber.xml sous le chemin de classe pour initialiser le bean. Après l'intégration à Spring, cette méthode ne peut pas être utilisée. Vous devez utiliser l'annotation @contextconfiguration pour implémenter le chargement des classes. Si le fichier de configuration doit être chargé, vous pouvez l'utiliser comme suit:
@ContextConfiguration (Locations = {"ClassPath: ApplicationContext.xml"})Si vous utilisez des annotations pour vous intégrer, utilisez ce qui suit:
@ContextConfiguration (Classes = SpringbootcucumberApplication.class)
Ou directement
@Contextconfiguration
Remarque spéciale: @contextconfiguration annotation doit être ajoutée, sinon l'injection de bean échouera.
Ensuite, examinons pourquoi cette situation est causée par le code source.
Le code impliqué dans cette partie se trouve dans la classe SpringFactory dans le cadre du package Cucumber-Spring. Jetons un coup d'œil à la classe suivante:
public void start () {// Méthode de démarrage du test du concombre if (StepClassWithSpringContext! = null) {// Si l'annotation @contextConfiguration est utilisée, ce n'est pas null testContextManager = new CuCumberTestContextManager (StepClassWithSpringContext); } else {// Sinon, StepClassWithSpringContext sera null, et il entrera la branche suivante if (beanfactory == null) {beanfactory = createFallBackContext (); // Cette méthode est le focus que nous voulons suivre}} notifyContextManagerAboutTestClassStarted (); if (beanfactory == null || iSnewContextCreated ()) {beanfactory = testContextManager.getBeanFactory (); pour (class <?> StepClass: Stepclasses) {registerStepClassBeAnDefinition (beanfactory, StepClass); }} Gluecodecontext.instance.start (); } Suivons la méthode CreateFallbackContext:
ConfigurableListableBeanFactory privé CreateFallBackContext () {configurableApplicationContext ApplicationContext; if (getClass (). getClassLoader (). getResource ("cucumber.xml")! = null) {// the <span style = "font-family: arial, helvetica, sans-serif;"> configurableApplicationContext </span> applicationContext = new classpathxmlappationContext ("cucumber.xml"); } else {// Si Cucumber.xml n'est pas configuré, il sera nouveau génériqueapplicationContext = new GenericApplicationContext (); } applicationContext.RegisterShutdownHook (); ConfigurableListableBeAnfactory beanfactory = applicationContext.getBeanFactory (); Beanfactory.Registerscope (GluecoDescope.name, new GluecodeScope ()); pour (class <?> StepClass: Stepclasses) {registerStepClassBeAnDefinition (beanfactory, StepClass); } return beanfactory; }Enfin, parlons de la classe GenericApplicationContext. Cette classe sera basée sur le type du bean, puis sur l'instance NewInstance. Cependant, comme d'autres classes sont injectées dans cette classe, la classe injectée ne peut pas être initialisée via la nouvelle instance, donc l'injection échouera et un pointeur nul sera signalé.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.