Artikel ini memperkenalkan metode mengintegrasikan boot musim semi ke dalam mentimun (BDD) dan membagikannya kepada Anda. Dengan rincian sebagai berikut:
1. Buat struktur proyek Springboot baru sebagai berikut:
2. Tambahkan dependensi 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 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> <groupid> com.chhlri <ArtifactId> Spring-boot-Cacumber </stifactid> <version> 0.0.1-Snapshot </version> <packaging> Jar </packaging> <name> Spring-Boot-Cucumber </name> <cripence> Proyek Demo untuk Spring Boot and Cucumber </description> <parent> <groupid> org.springfring.boot. <ArTifactId> Spring-Boot-Starter-Parent </arttifactid> <version> 1.5.6.release </version> <relativePath/> <!-Pencarian orang tua dari repositori-> </parents> <build.source.version> 1.2.4 </cucumber.version> <proyform.build.source. <Project.Reporting.OutputEncoding> UTF-8 </project.reporting.outputEncoding> <Java.Version> 1.7 </java.version> </Properties> </Dependencies> <Ruppendency> <GroupDid org.springframework.BOOT </groupid> <Artifactid> <dependency> <GroupId> info.cukes </groupid> <ArTifactId> CUCOMBER-JAVA </arttifactid> <version> $ {cucumber.version} </version> </dependency> <sependency> </groupid> info.cukes </groupid> <ArtiFacTID> CUCOMBERS CUCOMBERCE <//VERVERSION </GroupID> <artifactid> CUCOMBERSEDE </Version> </GroupId> CUCUMBERSID/CUCUMBERSID {CUCUMBERSID> CUCOMBERSID </versi </version> CUCOBOD </CUCUMBERSID> CUCUMBERSID </version> CUCUMBERSID> </Dependency> <dependency> <GroupId> info.cukes </groupid> <ArTifactId> CUCOMBERS-SPRING </ArTifacTID> <Version> $ {cucumber.version} </version> </dependency> <groupid> info.cukes </groupid> <ArtiFACTID> CUCUCBER-JUM <version> $ {cucumber.version} </version> <celuctions> <scuxcusion> <groupid> junit </groupid> <Artifactid> Junit </t Artifactid> </eksklusi> </eksklusi> </dependensi> <sgroupid> org.springframework. <scope>test</scope> </dependency> </dependencies> <build> <plugins> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <source>1.7</source> <target>1.7</target> </configuration> </plugin> <plugin> <groupid> org.codehaus.mojo </groupid> <ArTifactId> exec-maven-plugin </stifactid> <configuration> <source> 1.7 </source> <target> 1.7 </target> </configuration> <Execution> <pase> <phase> </fase sasaran> <Execution> <phase> <phase> <pase> </fase> <soals> JABA <Fase> <phase> <phase> </fase> <fase> Sasaran> JABA <fase> <phase> <phase> </fase> <moject> JAGA> <slasspathscope> tes </classpathscope> <sainclass> com.chhliu.test.cucumbertest.java </sainclass> <Argument> <Argument>-Plugin </argument> <BREX> </argumen> <argument>-lem </argumen> <gremument> <argument> <argument/argumen </argumen </argumen> <gremument> <argument/sumbu/uji/argumen/</argumen </argumen> </argumen/sumber/uji/uji/uji/</argumen/</argumen> </argumen/uji/sumbu/sumbu/sumbu </argumen/sumber/sumbu/sumbu </argument> </Executions> </lugin> </lugin> </bangun> </joy Project>2. Tulis antarmuka layanan dan kelas implementasi
paket com.chhliu.service; / ** * Login Simulasi * @author chhliu * */ antarmuka publik UserInfoserviceei {Boolean Login (nama pengguna String, kata sandi string, string konfirmasiPassword); } paket com.chhliu.service; impor org.springframework.stereotype.service; @Service ("UserInfoservice") Public Class UserInfoservice mengimplementasikan UserInfoserviceei {Public Boolean Login (String Username, String Password, String ConfirmSword) {return (username.equals ("chhliu") && password.equals ("123456") && confirmasword.confirmasword. }} 3. Tulis file fitur
#banguage: zh-cn # "zh-cn": { # "tetapi": "*| Tapi <", # "dan": "*| dan <| dan <| dan <| pada saat yang sama <", # "lalu": "*| so <", # "When": "*When <", # "name": "Tiongkok yang disederhanakan", # ", #" ":": ":" FITURI "," FITUF "," FITUF ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ":" ",", "," FITUF ":" "," "BAGA", "BEBERAPA": "" "BEBERAPA", "" " "Latar Belakang", # "Skenario": "Skenario_outline": "Garis Besar Skenario | Garis Besar", # "Contoh": "Contoh", # "Diberikan": "*| jika <| jika <| jika <| jika <| jika <| jika <" #} @bank function: jika saya menarik uang di bank, jika saya masuk dengan sukses dan kata sandi. Jika saldo adalah 500.000, skenario: bank menarik uang jika: Saya masuk dengan "chhliu" dan kata sandi yang dimasukkan adalah "123456" ketika: konfirmasi kata sandi juga "123456", maka: saldo kartu bank akan "500.000" 4. Tulis kelas tes
paket com.chhliu.test; impor org.junit.runner.runwith; impor Cucumber.API.CUCOMBOMPTIONS; impor Cucumber.api.junit.cucumber; /** * @RunWith(Cucumber.class) This is a runner, which refers to using Cucumber to run tests* @CucumberOptions, which specifies the directory of the feature to be run in our project* @CucumberOptions format, which specifies the report to be generated when we run in our project, and then specifies that the corresponding test report can be found in the target directory* @CucumberOptions glue, used Untuk menentukan direktori yang menemukan file definisi langkah ketika proyek berjalan * * dalam proyek aktual, seiring berjalannya proyek, proyek uji dapat terdiri dari beberapa file fitur, dan setiap file fitur juga dapat terdiri dari beberapa skenario. Secara default, * setiap menjalankan adalah menjalankan semua skenario di semua fitur. Ini dapat menyebabkan skrip tes berjalan sekali dalam keadaan normal, yang membutuhkan waktu sangat lama untuk menunggu hasil tes. * Namun, dalam proses aktual, kasus uji dibedakan berdasarkan prioritas. Misalnya, Smoketest, RegressionTest, dll. Atau kadang-kadang ada kasus penggunaan yang sangat kecil, seperti level sangat penting, * Kasus penggunaan ini memerlukan operasi jangka panjang untuk memantau apakah sistem tidak memiliki halaman atau halaman putih 404. * Jadi kita harus membedakan semua skenario, sehingga ketika kita memulai skrip pengujian, kita dapat menjalankan scenero dari modul mana yang kita butuhkan. At this time, we can use Tags * In Cucumber, Tag directly adds any number of tags with prefixed @ to feature or scenario before the Feature, Scenari or Scenario Outline keywords, and multiple tags are separated by spaces* @author chhliu * */ @RunWith(Cucumber.class) @CucumberOptions(plugin = {"json:target/cucumber.json", "Pretty"}, fitur = "src/test/sumber daya") kelas publik cucumberTest {} 5. Jalankan kelas tes dan tingkatkan langkah -langkah yang tidak ditentukan dari output tes
paket com.chhliu.test; impor javax.annotation.Resource; impor org.junit.assert; impor com.chhliu.service.userinfoserviceei; impor cucumber.api.java.zh_cn.if; impor cucumber.api.java.zh_cn.when; impor cucumber.api.java.zh_cn.so; Integrasi Kelas Publik Spring {@resource (name = "UserInfoservice") Private UserInfoservice Service; nama pengguna string pribadi; kata sandi string pribadi; string privat konfirmasiPassword; @If ("^: Saya masuk $ dengan/" ([^/"]*)/" $ ") public void I login $ dengan _ (string arg1) lemparan lempar {this.username = arg1;} @if ("^: kata sandi yang dimasukkan adalah/"([^/"]*)/"$") Void kata sandi yang dimasukkan (string adalah/"([^/"]*)/"$") void kata sandi yang dimasukkan (string yang dimasukkan/"([^/"]*)/"$") void kata sandi yang dimasukkan (string adalah/"([^/"]*)/"$") Void kata sandi yang dimasukkan (String IS yang dimasukkan/"([^/") } @When ("^: Kata sandi juga/" ([^/"]*)/" $ ") void publik Konfirmasi Kata sandi juga _ (string arg1) lemparan lempar {this.confirmPassword = arg1;} @then ("^: tunjukkan saldo kartu bank adalah/"([^/"]*)/"$"). service.login (nama pengguna, kata sandi, konfirmasiPassword); if (isLogin) {System.out.println ("Login berhasil! Balance kueri adalah sebagai berikut:"+arg1); Assert.assertequals ("500000", arg1); }}} 6. Tambahkan dukungan anotasi ke langkah -langkah tes
@Runwith (springjunit4classrunner.class) @contextConfiguration // Jika anotasi ini tidak ditambahkan, kacang akan disuntikkan dan tidak dapat disuntikkan @springboottest // jika anotasi ini tidak ditambahkan, kacang tidak akan ditemukan dalam integrasi kelas publik Spring {} 7. Hasil tes
2 skenario (2 lulus)
11 Langkah (11 Lulus)
0M0.091S
8. Poin Integrasi
Saat mengintegrasikan boot musim semi dengan mentimun, ada titik yang perlu diperhatikan, karena Spring Boot menganjurkan de-xmlization, jadi dengan cara tradisional, mentimun akan membaca file konfigurasi cucumber.xml di bawah ClassPath untuk menginisialisasi kacang. Setelah berintegrasi dengan Spring, metode ini tidak dapat digunakan. Anda perlu menggunakan anotasi @ContextConfiguration untuk mengimplementasikan pemuatan kelas. Jika file konfigurasi perlu dimuat, Anda dapat menggunakannya sebagai berikut:
@ContextConfiguration (Lokasi = {"ClassPath: ApplicationContext.xml"})Jika Anda menggunakan anotasi untuk berintegrasi, gunakan yang berikut:
@ContextConfiguration (class = springbootcucumberapplication.class)
Atau secara langsung
@ContextConfiguration
Catatan Khusus: @contextConfiguration Anotasi harus ditambahkan, jika tidak injeksi kacang akan gagal.
Selanjutnya, mari kita lihat mengapa situasi ini disebabkan oleh kode sumber.
Kode yang terlibat dalam bagian ini berada di kelas SpringFactory di bawah paket Spring mentimun. Mari kita lihat kelas berikut:
public void start () {// Metode Mulai Uji CUCOMBER if (StepClassWithSpringContext! = NULL) {// Jika anotasi @ContextConfiguration digunakan, ini bukan null testContextManager = new CucumberTestContextManager (stepClassWithSpringContext); } else {// Jika tidak, StepClassWithSpringContext akan menjadi null, dan itu akan memasuki cabang berikut jika (beanFactory == null) {beanfactory = createFallBackContext (); // metode ini adalah fokus yang ingin kami ikuti}} notifyContextManagerAboutTestClassSarted (); if (beanfactory == null || isNewContextCreated ()) {beanFactory = testContextManager.getBeanFactory (); for (class <?> Stepclass: StepClasses) {registerstepclassbeandefinition (beanfactory, stepclass); }} Gluecodecontext.instance.start (); } Mari ikuti metode CreateFallBackContext:
Private ConfigurableListableBeanFactory CreateFallBackContext () {ConfigurableApplicationContext ApplicationContext; if (getClass (). getClassLoader (). getResource ("cucumber.xml")! = null) {// <span style = "font-family: arial, helvetica, sans-serif;"> configurableApplicationContext </span> applicationcontext = classpathxm; "" "classpathxm;" "" ll classpathxm; "classpathxm." "classpathxm." "classpathxm." "ClassPATHXM." "CLASSPATHXM. } else {// Jika cucumber.xml tidak dikonfigurasi, itu akan baru genericapplicationContext = new genericapplicationContext (); } ApplicationContext.RegisterShutDownHook (); ConfigurableListableBeanFactory beanFactory = applicationContext.getBeanFactory (); beanfactory.registerscope (gluecodescope.name, new gluecodescope ()); for (class <?> Stepclass: StepClasses) {registerstepclassbeandefinition (beanfactory, stepclass); } return beanfactory; }Akhirnya, mari kita bicara tentang kelas GenericApplicationContext. Kelas ini akan didasarkan pada jenis kacang dan kemudian instance newinstance. Namun, karena kelas lain disuntikkan ke dalam kelas ini, kelas yang disuntikkan tidak dapat diinisialisasi melalui instance baru, sehingga injeksi akan gagal dan pointer nol akan dilaporkan.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.