Java >> Java tutorial >  >> Tag >> maven

Skrivning af enhedstests med Spock Framework:Oprettelse af et Maven-projekt

Spock Framework er en test- og specifikationsramme for Java- og Groovy-applikationer. Dens hjemmeside fremsætter en noget dristig påstand:

Det, der får den til at skille sig ud fra mængden, er dens smukke og meget udtryksfulde specifikationssprog.

Før vi kan kontrollere, om denne påstand er sand, skal vi oprette et eksempelprojekt, som vi kan bruge til dette formål. En måde at gøre dette på er at bruge Maven.

Dette blogindlæg beskriver, hvordan vi kan skabe et Maven-projekt, der opfylder følgende krav:

  • Den skal understøtte "normale" enhedstests, der bruger JUnit, og enhedstests, der bruger Spock Framework.
  • Den skal kompilere og køre de "normale" enhedstests, der findes fra src/test/java bibliotek.
  • Den skal kompilere og køre Groovy-enhedstestene, der findes fra src/test/groovy bibliotek.
  • Den skal oprette en HTML-testrapport, der beskriver testresultaterne af vores enhedstest, der bruger Spock Framework.

Lad os starte med at få de nødvendige afhængigheder.

Få de nødvendige afhængigheder

Vi kan få de nødvendige afhængigheder ved at erklære følgende afhængigheder i vores pom.xml fil:

  • JUnit (version 4.12) er en ramme, der giver os mulighed for at skrive både enheds- og integrationstest.
  • Spock Core (version 1.0-groovy-2.4). Spock er en test- og specifikationsramme for Java- og Groovy-applikationer.
  • Groovy All (version 2.4.4). Groovy er et dynamisk programmeringssprog til JVM.

Efter at vi har tilføjet disse afhængigheder til vores pom.xml fil, dens afhængigheder sektionen ser ud som følger:

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.spockframework</groupId>
        <artifactId>spock-core</artifactId>
        <version>1.0-groovy-2.4</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.codehaus.groovy</groupId>
        <artifactId>groovy-all</artifactId>
        <version>2.4.4</version>
        <scope>test</scope>
    </dependency>
</dependencies>

Efter at vi har tilføjet de nødvendige afhængigheder til vores pom.xml fil, skal vi konfigurere Maven til at kompilere vores enhedstests.

Samling af vores enhedstests

Fordi vores enhedstest bruger både Java og Groovy programmeringssprog, er vi nødt til at kompilere vores testkilder ved at bruge GMavenPlus og Maven Compiler plugins. Vi kan konfigurere disse plugins ved at følge disse trin:

  1. Tilføj GMavenPlus Plugin (version 1.5) til pom.xml fil og konfigurer den ved at følge disse trin:
    1. Sørg for, at addTestSources målet for GMavenPlus-plugin'et påkaldes i initialisering fase af Mavens standardlivscyklus. Dette mål tilføjer vores Groovy-testkilder, som er fundet fra src/test/groovy bibliotek, til projektets testkilder.
    2. Sørg for, at testCompile målet for GMavenPlus-plugin'et påkaldes i test-kompileringen fase af Mavens standardlivscyklus. Dette mål kompilerer vores Groovy-testkilder.
  2. Tilføj Maven Compiler Plugin (version 3.3) til pom.xml fil og konfigurer den ved at følge disse trin:
    1. Sørg for, at Java-kompileren accepterer kode, der bruger Java 1.8.
    2. Sørg for, at de kompilerede klasser er kompatible med Java 1.8.

Efter at vi har konfigureret disse plugins, vil plugins sektion af vores pom.xml ser ud som følger:

<plugins>
    <plugin>
        <groupId>org.codehaus.gmavenplus</groupId>
        <artifactId>gmavenplus-plugin</artifactId>
        <version>1.5</version>
        <executions>
            <execution>
                <goals>
					<goal>addTestSources</goal>
                    <goal>testCompile</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.3</version>
        <configuration>
            <source>1.8</source>
            <target>1.8</target>
        </configuration>
    </plugin>
</plugins>

Vi kan kompilere vores enhedstests ved at køre følgende kommando ved kommandoprompten:

mvn clean test-compile

Når du gør dette, ser vi det

  • addTestSources og testCompile målene for GMavenPlus Plugin påberåbes.
  • testkompileringen målet for Maven Compiler Plugin påkaldes.

Outputtet af denne kommando ser ud som følger:

> mvn clean test-compile
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Writing Unit Tests With Spock - Configuration 0.1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ unit-testing-configuration ---
[INFO] Deleting /Users/loke/Projects/Java/Blog/spock-examples/unit-testing/configuration/target
[INFO]
[INFO] --- gmavenplus-plugin:1.5:addTestSources (default) @ unit-testing-configuration ---
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ unit-testing-configuration ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /Users/loke/Projects/Java/Blog/spock-examples/unit-testing/configuration/src/main/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.3:compile (default-compile) @ unit-testing-configuration ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to /Users/loke/Projects/Java/Blog/spock-examples/unit-testing/configuration/target/classes
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ unit-testing-configuration ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 1 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.3:testCompile (default-testCompile) @ unit-testing-configuration ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to /Users/loke/Projects/Java/Blog/spock-examples/unit-testing/configuration/target/test-classes
[INFO]
[INFO] --- gmavenplus-plugin:1.5:testCompile (default) @ unit-testing-configuration ---
[INFO] Using Groovy 2.4.4 to perform testCompile.
[INFO] Compiled 1 file.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.502 s
[INFO] Finished at: 2015-08-25T20:43:11+03:00
[INFO] Final Memory: 22M/221M
[INFO] ------------------------------------------------------------------------

Efter at vi har kompileret vores enhedstests, skal vi finde en måde at køre dem på med Maven.

Kørsel af vores enhedstests

Vi kan køre vores enhedstests ved at bruge Maven Surefire Plugin. Fordi vi ønsker at køre både "normale" enhedstests og enhedstests, der er skrevet ved hjælp af Spock Framework, er vi nødt til at konfigurere Maven Surefire Plugin ved at følge disse trin:

  1. Inkluder alle testklasser, hvis navn ender med strengen:'Test'. Disse er "normale" enhedstests, der er skrevet ved at bruge Java-programmeringssproget.
  2. Inkluder alle testklasser, hvis navn ender med strengen:'Spec'. Disse er enhedstests, der er skrevet ved at bruge Spock Framework og Groovy-programmeringssproget.

Efter at vi har konfigureret Maven Surefire-plugin, er plugins sektion af vores pom.xml fil ser ud som følger:

<plugins>
    <plugin>
        <groupId>org.codehaus.gmavenplus</groupId>
        <artifactId>gmavenplus-plugin</artifactId>
        <version>1.5</version>
        <executions>
            <execution>
                <goals>
                    <goal>addTestSources</goal>
                    <goal>testCompile</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.3</version>
        <configuration>
            <source>1.8</source>
            <target>1.8</target>
        </configuration>
    </plugin>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.18.1</version>
        <configuration>
            <includes>
                <include>**/*Test.java</include>
                <include>**/*Spec.java</include>
            </includes>
        </configuration>
    </plugin>
</plugins>

Vi kan nu køre vores enhedstest ved at køre følgende kommando ved kommandoprompten:

mvn clean test

Når vi gør dette, ser vi, at Maven Surefire Plugin kører enhedstestene fundet fra disse testklasser:

  • net.petrikainulainen.spock.HelloSpec er en testklasse, der bruger Spock Framework.
  • net.petrikainulainen.spock.HelloTest er en "normal" testklasse, der bruger JUnit.

Den relevante del af outputtet ser ud som følger:

> mvn clean test
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Writing Unit Tests With Spock - Configuration 0.1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-surefire-plugin:2.18.1:test (default-test) @ unit-testing-configuration ---
[INFO] Surefire report directory: /Users/loke/Projects/Java/Blog/spock-examples/unit-testing/configuration/target/surefire-reports

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running net.petrikainulainen.spock.HelloSpec
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.203 sec - in net.petrikainulainen.spock.HelloSpec
Running net.petrikainulainen.spock.HelloTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec - in net.petrikainulainen.spock.HelloTest

Results :

Tests run: 2, Failures: 0, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.415 s
[INFO] Finished at: 2015-08-24T21:53:09+03:00
[INFO] Final Memory: 20M/219M
[INFO] ------------------------------------------------------------------------

Den sidste ting, vi skal gøre, er at konfigurere Maven til at oprette en HTML-testrapport, der beskriver testresultaterne af enhedstests, der bruger Spock Framework.

Oprettelse af en HTML-testrapport

Vi kan oprette en HTML-testrapport ved at bruge Spock Reports-udvidelsen. Som standard opretter den en HTML-rapport for hver påberåbt specifikation og en oversigt, der viser alle påberåbte specifikationer.

Vi kan bruge denne Spock-udvidelse ved at følge disse trin:

Først , skal vi tilføje Bintray's JCenter Maven-lager til vores pom.xml fil. Når vi har gjort det, vil depoterne sektion af vores pom.xml fil ser ud som følger:

<repositories>
    <repository>
        <id>jcenter</id>
        <name>JCenter Repo</name>
        <url>http://jcenter.bintray.com</url>
    </repository>
</repositories>

Anden , skal vi tilføje Spock Reports Extension jar til klassestien. Vi kan gøre dette ved at erklære spock-rapporterne afhængighed (version 1.2.7) i vores pom.xml fil. Når vi har gjort det, er afhængighederne sektion af vores pom.xml fil ser ud som følger:

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.spockframework</groupId>
        <artifactId>spock-core</artifactId>
        <version>1.0-groovy-2.4</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.codehaus.groovy</groupId>
        <artifactId>groovy-all</artifactId>
        <version>2.4.4</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>com.athaydes</groupId>
        <artifactId>spock-reports</artifactId>
        <version>1.2.7</version>
        <scope>test</scope>
    </dependency>
</dependencies>

Tredje , fordi vi bruger Maven, er vi nødt til at ændre output-mappen for Spock Reports-udvidelsen. Årsagen til dette er, at standardoutputbiblioteket er build/spock-reports , og vi ønsker, at vores HTML-testrapport oprettes til target/spock-rapporterne bibliotek.

Vi kan tilpasse adfærden for Spock Reports-udvidelsen ved at oprette en egenskabsfil til følgende placering (i forhold til klassestien):

META-INF/services/com.athaydes.spockframework.report.IReportCreator.properties

Vi kan ændre output-mappen ved at følge disse trin:

  1. Hent standardegenskabsfilen.
  2. Kopiér standardegenskabsfilen til src/test/resources/META-INF/services/ bibliotek.
  3. Indstil værdien af ​​com.athaydes.spockframework.report.outputDir egenskab til mål/spock-rapporter .

Indholdet af vores egenskabsfil ser ud som følger:

# Name of the implementation class of the report creator
# Currently supported classes are:
#   1. com.athaydes.spockframework.report.internal.HtmlReportCreator
#   2. com.athaydes.spockframework.report.template.TemplateReportCreator
com.athaydes.spockframework.report.IReportCreator=com.athaydes.spockframework.report.internal.HtmlReportCreator

# Set properties of the report creator
# For the HtmlReportCreator, the only properties available are
# (the location of the css files is relative to the classpath):
com.athaydes.spockframework.report.internal.HtmlReportCreator.featureReportCss=spock-feature-report.css
com.athaydes.spockframework.report.internal.HtmlReportCreator.summaryReportCss=spock-summary-report.css
# exclude Specs Table of Contents
com.athaydes.spockframework.report.internal.HtmlReportCreator.excludeToc=false

# Output directory (where the spock reports will be created) - relative to working directory
com.athaydes.spockframework.report.outputDir=target/spock-reports

# If set to true, hides blocks which do not have any description
com.athaydes.spockframework.report.hideEmptyBlocks=false

Vi kan nu køre vores enhedstest ved at bruge kommandoen:

mvn clean test

Når vi kører vores enhedstest, ser vi, at Spock Reports-udvidelsen initialiseres, før vores enhedstest køres:

> mvn clean test

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Aug 24, 2015 10:41:41 PM org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoCachedMethodSiteNoUnwrap invoke
INFO: Configuring com.athaydes.spockframework.report.SpockReportExtension
Aug 24, 2015 10:41:41 PM org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoCachedMethodSiteNoUnwrap invoke
INFO: Trying to load custom configuration at file:/Users/loke/Projects/Java/Blog/spock-examples/unit-testing/configuration/target/test-classes/META-INF/services/com.athaydes.spockframework.report.IReportCreator.properties
Aug 24, 2015 10:41:41 PM org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoCachedMethodSiteNoUnwrap invoke
INFO: SpockReports config loaded: [com.athaydes.spockframework.report.internal.HtmlReportCreator.excludeToc:false, com.athaydes.spockframework.report.template.TemplateReportCreator.reportFileExtension:md, com.athaydes.spockframework.report.template.TemplateReportCreator.specTemplateFile:/templateReportCreator/spec-template.md, com.athaydes.spockframework.report.IReportCreator:com.athaydes.spockframework.report.internal.HtmlReportCreator, com.athaydes.spockframework.report.template.TemplateReportCreator.summaryTemplateFile:/templateReportCreator/summary-template.md, com.athaydes.spockframework.report.internal.HtmlReportCreator.summaryReportCss:spock-summary-report.css, com.athaydes.spockframework.report.template.TemplateReportCreator.summaryFileName:summary.md, com.athaydes.spockframework.report.internal.HtmlReportCreator.featureReportCss:spock-feature-report.css, com.athaydes.spockframework.report.hideEmptyBlocks:false, com.athaydes.spockframework.report.outputDir:target/spock-reports]
Aug 24, 2015 10:41:41 PM org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoCachedMethodSiteNoUnwrap invoke
INFO: Loading settings for reportCreator of type com.athaydes.spockframework.report.internal.HtmlReportCreator
Running net.petrikainulainen.spock.HelloSpec
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.229 sec - in net.petrikainulainen.spock.HelloSpec
Running net.petrikainulainen.spock.HelloTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec - in net.petrikainulainen.spock.HelloTest

Results :

Tests run: 2, Failures: 0, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.481 s
[INFO] Finished at: 2015-08-24T22:41:42+03:00
[INFO] Final Memory: 20M/218M
[INFO] ------------------------------------------------------------------------

Når vi har kørt vores enhedstest, kan vi se den oprettede HTML-testrapport ved at åbne index.html fil fundet fra target/spock-rapporterne vejviser.

Lad os opsummere, hvad vi lærte af dette blogindlæg.

Oversigt

Dette blogindlæg har lært os fire ting:

  • Vi ved, hvordan vi kan få de nødvendige afhængigheder med Maven.
  • Vi kan kompilere Groovy-kode ved at bruge GMavenPlus Plugin.
  • Vi kan konfigurere Surefire Maven Plugin til at køre enhedstests, der bruger Spock Framework.
  • Vi kan oprette en HTML-testrapport, som indeholder testresultaterne af enhedstest, der bruger Spock Framework, ved at bruge Spock Reports-udvidelsen.

Den næste del af denne øvelse beskriver, hvordan vi kan skabe et Gradle-projekt, der opfylder de samme krav som vores Maven-projekt.

P.S. Du kan få eksemplet på anvendelsen af ​​dette blogindlæg fra Github.


Java tag