Enhet- och integrationstest med Maven- och JUnit-kategorier
Det här exemplet visar hur man delar enheter och integrationstester med Maven- och JUnit-kategorier.
Det är särskilt användbart för befintliga testsviter och kan implementeras på några minuter.
Mitt tidigare inlägg visade hur vi använder en maven-profil för att dela upp enhet- och integrationstester.
//johndobie.blogspot.co.uk/2011/06/separating-maven-unit-integration-tests.html
Detta har varit ett mycket väl läst inlägg och jag gillar hur det använder separata kataloger. Detta exempel visar dock en mycket enklare teknik som lätt kan användas på äldre testsviter.
Det erbjuder de flesta fördelarna med originalet och sitter bekvämare i Maven-världen.
Koden för exemplet finns här.
svn co //designbycontract.googlecode.com/svn/trunk/examples/maven/categor... mvn clean install
Från och med JUnit 4.8 kan du definiera dina egna kategorier för tester. Detta gör att du kan märka och gruppera tester.
Det här exemplet visar hur enkelt det är att separera enhet- och integrationstest med @Catgegory-anteckningen.
//kentbeck.github.com/junit/javadoc/latest/org/junit/experimental/categories/Categories.html
Det första steget i att gruppera ett test med hjälp av kategorier är att skapa ett markörgränssnitt.
Detta gränssnitt kommer att användas för att markera alla tester som du vill ska köras som integrationstester.
public interface IntegrationTest {}
Lägg till kategorianteckningen högst upp i din testklass. Det tar namnet på ditt nya gränssnitt.
import org.junit.experimental.categories.Category; @Category(IntegrationTest.class) public class ExampleIntegrationTest{ @Test public void longRunningServiceTest() throws Exception { } }
Kategorier kan användas för att markera klasser eller metoder. Enligt min mening borde du bara markera en klass.
Om du har både enhets- och integrationstester i en enda klass, dela sedan det.
Skönheten i denna lösning är att ingenting verkligen förändras för enhetens testsida.
Vi lägger helt enkelt till en del konfiguration i maven surefire plugin så att det ignorerar alla integrationstester.
org.apache.maven.plugins maven-surefire-plugin 2.11 org.apache.maven.surefire surefire-junit47 2.12 **/*.class com.test.annotation.type.IntegrationTest
Det finns två mycket viktiga delar. Den första är att konfigurera surefire för att utesluta alla integrationstester.
com.test.annotation.type.IntegrationTest
Surefire kör alla dina tester, utom de som är markerade som ett integrationstest.
Den andra viktiga delen är att se till att surefire-plugin använder rätt JUnit-leverantör. JUnit47-leverantören behövs för att korrekt upptäcka kategorierna.
org.apache.maven.surefire surefire-junit47 2.12
För att säkerställa att detta fungerar korrekt kan vi köra enhetstesterna
mvn clean test
Du kan se från utdata nedan att enhetstestet körs, men inte integrationstestet.
------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.test.EmptyUnitTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------
Återigen är konfigurationen för detta mycket enkel.
Vi använder standard failsafe-plugin och konfigurerar det så att det bara kör integrationstesterna.
maven-failsafe-plugin 2.12 org.apache.maven.surefire surefire-junit47 2.12 com.test.annotation.type.IntegrationTest integration-test **/*.class
Konfigurationen använder ett standardkörningsmål för att köra failsafe-plugin under integreringstestfasen av byggnaden.
Följande konfiguration säkerställer att endast integrationstesterna körs.
com.test.annotation.type.IntegrationTest
Och igen måste JUnit-leverantören vara korrekt konfigurerad.
org.apache.maven.surefire surefire-junit47 2.12
Det är allt!
Vi kan nu köra hela byggnaden.
mvn clean install
Den här gången såväl som enhetstestet körs, genomförs integrationstesterna under integrationstestfasen.
------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.test.AnotherEmptyIntegrationTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.016 sec Running com.test.EmptyIntegrationTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec Results : Tests run: 2, Failures: 0, Errors: 0, Skipped: 0
För att se hur enkelt det är att lägga till kodtäckning till den här metoden, kolla in den här länken.
//johndobie.blogspot.co.uk/2012/05/easy-unit-and-integration-code-coverage.html
För ett mer komplett exempel som använder startar Tomcat och en databas.
svn co //designbycontract.googlecode.com/svn/trunk/examples/maven/code-co... mvn clean install -Ptomcat-embedded
Det är baserat på detta exempel
//johndobie.blogspot.com/2011/10/maven-integration-testing-and-spring.html
Denna berättelse, "Unit and Integration Tests With Maven and JUnit Categories" publicerades ursprungligen av JavaWorld.