In diesem Artikel wird die Methode zur Integration des Spring -Bootes in Cucumber (BDD) eingeführt und teilt ihn mit Ihnen. Die Details sind wie folgt:
1. Erstellen Sie wie folgt eine neue Springboot -Projektstruktur:
2. Fügen Sie POM -Abhängigkeiten hinzu
<? 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> <gruppe com.chhliu </Groupid> <artifactId> Spring-Boot-Cucumber </artifactId> <version> 0.0.1-Snapshot </Version> <Paketing> jar </packaging> <name> Spring-Boot-Cucumber </name> <Bection> Demo-Projekt für Spring Boot und Cucumber </Beschreibung> <in <Strups> <gruppe> org. <artifactid> Spring-Boot-Starter-Parent </artifactId> <version> 1.5.6.Release </Version> <RelativePath/> <!-SOOKUP PORTER aus Repository-> </parent> <properties> <cucumber.version> 1.2.4 </cucumber.version> <project.build.sourceencoding> utf-8 </project.build.SourceCoding> <projekts <gruppeID> org.springFramework.boot </GroupId> <artifactId> Spring-Boot-Starter-Web </artifactId> </abhängig> <Deponcy> <gruppe> info.cukes </GroupID> <artifactID> GUCUMBER-JAVA </artifactid> <Version> $ $ {cucumber. <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> <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> </dependencies> <build> <plugins> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <quelle> 1.7 </source> <target> 1.7 </target> </configuration> </plugin> <plugin> <gruppe> org.codehaus.mojo </GroupId> <artifactID> exec-maven-plugin </artifactId> <configuration> <quelle> 1.7 </screec> </screec> </screec> </screec> </screec> </scace> </target> <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> <argument> src/test/ressourcen/</argument> </argumente> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>2. Schreiben Sie Service -Schnittstellen- und Implementierungsklassen
Paket com.chhliu.service; / ** * Simulation Login * @author chhliu * */ public interface userInfoServicei {boolean login (String -Benutzername, String -Kennwort, String -Bestätigungspassword); } Paket com.chhliu.service; import org.springframework.stereotype.service; @Service ("userInfoService") public class userInfoService implementiert userInfoServicei. }} 3. Schreiben Sie Feature -Dateien
#Language: zh-cn # "zh-cn": { # "aber": "*| aber <", # "und": "*| und <| und <| und <| gleichzeitig <", # "dann": "*| so <", # ", wenn": "*| wenn <", # "name": # "feature", # "," native "," native "," native "," native ",", ",", ",": ",", ":", ",", ",", ",", ",", ",", ",", "," native ",", ",", ",", ",", ",", ",", ",", "," native ",", ",", ",", ",", ",", "," native ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",ömer "background", # "scenario": "Scenario_outline": "Scenario Outline|Script Outline", # "examples": "Examples", # "given": "*|If <|If <|If<|If<|If<|If<" # } @bank Function: If I withdraw money at the bank, if I log in successfully and the password entered is correct, then my bank card balance will be displayed. Wenn der Restbetrag 500.000 beträgt, ist Szenario: Bank Geld abheben, wenn: Ich melde mich mit "Chhliu" an, und das eingegebene Passwort lautet "123456", wenn: Bestätigungspassage auch "123456" ist, dann: Der Bankkartenguthaben wird "500.000" sein. 4. Schreiben Sie Testkurse
Paket com.chhliu.test; import org.junit.runner.runwith; cucumber.api.cucumberoptions; cucumber.api.junit.cucumber; /*** @runwith (cucumber.class) Dies ist ein Läufer, der sich auf die Verwendung von Gurken zum Ausführen von Tests bezieht. Geben Sie das Verzeichnis an, in dem die Stufendefinitionsdatei findet, wenn das Projekt * * in den tatsächlichen Projekten im Verlauf des Projekts ein Testprojekt aus mehreren Feature -Dateien ausführt, und jede Funktionsdatei kann auch aus mehreren Szenarien bestehen. Standardmäßig * kann jeder Lauf alle Szenarien in allen Funktionen ausführen. Dies kann dazu führen, dass das Testskript unter normalen Umständen einmal ausgeführt wird, was sehr lange dauert, bis die Testergebnisse warten. * Im tatsächlichen Prozess unterscheiden sich die Testfälle jedoch durch Priorität. Zum Beispiel gibt es Smoketest, Regressiontest usw. oder manchmal gibt es besonders geringe Anwendungsfälle, wie z. B. das Niveau von entscheidender Bedeutung. Zu diesem Zeitpunkt können wir Tags * in Gurken verwenden, fügt Tag direkt eine beliebige Anzahl von Tags mit vorangestellten @zu Feature oder Szenario vor der Funktion, Szenari- oder Szenario -Umriss -Keywords, und mehrere Tags werden durch Spaces * @Author Chhliu * */ @runwith (cucumber.classe) @Author chhliu */ @runwith (cucumber.classe) @cucumntions (plugnintions ("(" Json: Target/ CUCUMBER.CLASS) getrennt. "Pretty"}, features = "src/test/ressourcen") öffentliche Klasse CUCUMBERTEST {} 5. Führen Sie die Testklasse aus und verbessern Sie die undefinierten Schritte der Testausgabe
Paket com.chhliu.test; Javax.annotation.Resource importieren; import org.junit.assert; import com.chhliu.service.userinfoServicei; cucumber.api.java.zh_cn.if; cucumber.api.java.zh_cn.when; cucumber.api.java.zh_cn.so; öffentliche Klasse Gurkenintegration Spring {@resource (name = "userInfoService") private userInfoServicei -Dienst; privater String -Benutzername; privates Zeichenfolgenkennwort; private Zeichenfolge bestätigenPassword; @If ("^: Ich melde mich mit/" ([^/"]*)/" $ ") public void i an $ mit _ (string arg1) aus, die throwable {this.username = arg1;} @if ("^: Das Kennwort eingegeben ist/"([^/"]*)/"$") public void das kennwort eingegeben ist (string arg1) throWs throWs throWs {vaspword {vassword $ "). } @When ("^: Das Kennwort ist auch/" ([^/"]*)/" $ ") public void bestätigen Passwort ist auch _ (String arg1) Auslöscht Throwable {this.conFirmPassword = arg1;} @then ("^: Zeigen Sie das Bankkartenausgleich an/"(^/"]*)/"$") öffentlich. service.login (Benutzername, Passwort, bestätigenPassword); if (isLogin) {System.out.println ("Anmelden erfolgreich! Die Abfrage -Balance lautet wie folgt:"+arg1); Assert.AsSertequals ("500000", arg1); }}} 6. Annotationsunterstützung den Testschritten hinzufügen
@Runwith (SpringJunit4ClassRunner.class) @ContextConfiguration // Wenn diese Annotation nicht hinzugefügt wird, wird die Bean injiziert und kann nicht injiziert @Springboottest // Wenn diese Annotation nicht hinzugefügt wird, wird die Bean nicht hinzugefügt, wenn die Bean keine öffentliche Klassenkuppelintegration Spring {} 7. Testergebnisse
2 Szenarien (2 bestanden)
11 Schritte (11 bestanden)
0m0.091s
8. Integrationspunkte
Bei der Integration des Spring-Bootes in Gurke muss ein Punkt geprüft werden, da Spring Boot die DE-XMLISIONIERUNG befürwortet. Auf die herkömmliche Weise wird die Gurke der CUCUMBER.xml-Konfiguration unter ClassPath gelesen, um die Bean zu initialisieren. Nach der Integration in die Feder kann diese Methode nicht verwendet werden. Sie müssen die Annotation von @ContextConfiguration verwenden, um die Klassenbelastung zu implementieren. Wenn die Konfigurationsdatei geladen werden muss, können Sie sie wie folgt verwenden:
@ContextConfiguration (Standorte = {"classPath: applicationContext.xml"})Wenn Sie Anmerkungen zur Integration verwenden, verwenden Sie Folgendes:
@ContextConfiguration (classes = SpringbootCuCumberApplication.Class)
Oder direkt
@ContextConfiguration
Besonderer Hinweis: @ContextConfiguration Annotation muss hinzugefügt werden, andernfalls schlägt die Bean -Injektion fehl.
Schauen wir uns als nächstes an, warum diese Situation aus dem Quellcode verursacht wird.
Der in diesem Teil beteiligte Code befindet sich in der SpringFactory-Klasse unter dem Gurkenspring-Paket. Werfen wir einen Blick auf die folgende Klasse:
public void start () {// GUCUMBER -TEST START -Methode if (stepClasswithspringContext! } else {// ansonsten stapelklassewithspringContext wird null sein, und es wird in den folgenden Zweig eingegeben, wenn (beanfactory == null) {beanfactory = createFallbackContext (); // Diese Methode ist der Fokus, den wir folgen möchten. if (beanfactory == null || isNewContextCreated ()) {beanfactory = TestContextManager.getBeArtory (); für (Klasse <?> Stiefklasse: Stiefklassen) {RegisterStepClassbeanDeFinition (Beanfactory, StepClass); }} GlueCodeContext.instance.start (); } Folgen wir der CreateFallbackContext -Methode:
private configurablelistableBeanFactory createFallbackContext () {configurableApplicationContext applicationContext; if (getClass (). getClassloader (). getResource ("cucumber.xml")! } else {// Wenn cucumber.xml nicht konfiguriert ist, wird neu genericApplicationContext = new genericApplicationContext (); } applicationContext.registerShutDownhook (); ConfigurablelistableBeanFactory beanfactory = applicationContext.getBeArfactory (); Beanfactory.registerScope (GlueCodescope.Name, New GlueCodescope ()); für (Klasse <?> Stiefklasse: Stiefklassen) {RegisterStepClassbeanDeFinition (Beanfactory, StepClass); } zurückbeanfaktor; }Lassen Sie uns schließlich über die GenericApplicationContext -Klasse sprechen. Diese Klasse basiert auf dem Typ der Bean und dann auf der NewinStance -Instanz. Da jedoch andere Klassen in diese Klasse injiziert werden, kann die injizierte Klasse nicht durch die neue Instanz initialisiert werden, sodass die Injektion fehlschlägt und ein Nullzeiger gemeldet wird.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.