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.