Introduktion til testning med Arquillian

1. Oversigt

Arquillian er en test-ramme for container-agnostisk integration til Jakarta EE. Brug af Arquillian minimerer byrden ved styring af containere, implementeringer, rammelinitialisering osv.

Vi kan fokusere på at skrive faktiske tests og ikke på bootstrapping af testmiljøet.

2. Kernebegreber

2.1. Implementeringsarkiver

Der er en nem måde at teste vores applikation på, når vi kører inde i en container.

For det første, ShrinkWrap klasse giver en API til at oprette implementerbar *.krukke,*.krig, og *.øre filer.

Derefter tillader Arquillian os at konfigurere testinstallationen ved hjælp af @Deployment kommentar - på en metode, der returnerer en ShrinkWrap objekt.

2.2. Beholdere

Arquillian skelner mellem tre forskellige typer containere:

  • Fjerntestet ved hjælp af en fjernprotokol som JMX
  • Administreret - fjernbeholdere, men deres livscyklus styres af Arquillian
  • Indlejret - lokale containere, hvor test udføres ved hjælp af lokale protokoller

Vi kan også klassificere containere efter deres muligheder:

  • Jakarta EE-applikationer implementeret på en applikationsserver som Glassfish eller JBoss
  • Servlet containere indsat på Tomcat eller Jetty
  • Selvstændige containere
  • OSGI containere

Det undersøger runtime classpath og vælger automatisk den tilgængelige container.

2.3. Test berigelse

Arquillian beriger test ved at tilvejebringe f.eks. afhængighedsindsprøjtningen, så vi let kan skrive vores tests.

Vi kan indsprøjte afhængigheder ved hjælp af @Indsprøjte, indsprøjt ressourcer med @Ressource, EJB session bønner ved hjælp af @EJB, etc.

2.4. Flere testløbere

Vi kan oprette flere implementeringer ved hjælp af kommentaren:

@Deployment (navn = "minnavn" rækkefølge = 1)

Hvor navnet er navnet på installationsfilen, og ordreparameteren er implementeringsrækkefølgen for implementeringen, så vi kan nu køre tests på flere implementeringer samtidigt ved hjælp af kommentaren:

@Test @OperateOnDeployment ("mit navn")

Før-testen udføres på mit navn implementeringsbeholder ved hjælp af den rækkefølge, der er defineret i @Deployment kommentar.

2.5. Arquillian Extensions

Arquillian tilbyder flere udvidelser, hvis vores testbehov ikke er dækket af kernekørselstiden. Vi har vedholdenhed, transaktioner, klient / server, REST-udvidelser osv.

Vi kan aktivere disse udvidelser ved at tilføje passende afhængigheder til Maven- eller Gradle-konfigurationsfiler.

Almindeligt anvendte udvidelser er Drone, Graphene og Selen.

3. Maven-afhængigheder og opsætning

Lad os tilføje følgende afhængighed til vores pom.xml fil:

 org.jboss.arquillian arquillian-bom 1.1.13.Final import pom org.glassfish.main.extras glassfish-embedded-all 4.1.2 test org.jboss.arquillian.container arquillian-glassfish-embedded-3.1 1.0.0.Final prøve 

Den seneste version af afhængighederne kan findes her: arquillian-bom, org.glassfish.main.extras, org.jboss.arquillian.container.

4. Enkel test

4.1. Opret en komponent

Lad os starte med en simpel komponent. Vi inkluderer ikke nogen avanceret logik her for at kunne fokusere på tests:

public class Component {public void sendMessage (PrintStream to, String msg) {to.println (message (msg)); } offentlig strengmeddelelse (streng-meddelelse) {returner "Besked," + msg; }}

Ved hjælp af Arquillian vil vi teste, at denne klasse opfører sig korrekt, når den påberåbes som en CDI-bønne.

4.2. Skriv vores første Arquillian-test

Først skal vi specificere, at vores testklasse skal køres ved hjælp af den rammespecifikke løber:

@RunWith (Arquillian.class) 

Hvis vi skal køre vores tests inde i en container, skal vi bruge @Deployment kommentar.

Arquillian bruger ikke hele klassestien til at isolere testarkivet. I stedet bruger den ShrinkWrap klasse, det er en Java API til oprettelse af arkiver. Når vi opretter arkivet til test, specificerer vi hvilke filer der skal medtages i klassestien til brug af testen. Under implementeringen, ShrinkWrap isolerer kun de nødvendige klasser til testen.

Bruger tilføjelsesklasse () metode kan vi specificere alle nødvendige klasser og også tilføje en tom manifestressource.

Det JavaArchive.class opretter et mockup-webarkiv kaldet test.krig, denne fil indsættes i containeren og bruges derefter af Arquillian til at udføre tests:

@Deployment offentlig statisk JavaArchive createDeployment () {return ShrinkWrap.create (JavaArchive.class) .addClass (Component.class) .addAsManifestResource (EmptyAsset.INSTANCE, "beans.xml"); }

Derefter indsprøjter vi vores komponent i testen:

@Injicér komponent til privat komponent;

Endelig udfører vi vores test:

assertEquals ("Message, MESSAGE", component.message (("MESSAGE"))); component.sendMessage (System.out, "MESSAGE");

5. Test af Enterprise Java Beans

5.1. Enterprise Java Bean

Med Arquillian kan vi teste afhængighedsinjektion af en Enterprise Java Bean, for at gøre det opretter vi en klasse, der har en metode til at konvertere ethvert ord til små bogstaver:

offentlig klasse ConvertToLowerCase {public String convert (String word) {return word.toLowerCase (); }}

Ved hjælp af denne klasse opretter vi en statsløs klasse til at kalde metoden oprettet før:

@Stateless public class CapsConvertor {public ConvertToLowerCase getLowerCase () {returner ny ConvertToLowerCase (); }}

Det CapsConvertor klasse injiceres i en servicebønne:

@Stateless public class CapsService {@Inject private CapsConvertor capsConvertor; public String getConvertedCaps (final String word) {return capsConvertor.getLowerCase (). convert (word); }}

5.2. Test Enterprise Java Bean

Nu kan vi bruge Arquillian til at teste vores virksomhed Java Bean ved at indsprøjte CapsService:

@Injicér private CapsService capsService; @Test offentlig ugyldighed givenWord_WhenUppercase_ThenLowercase () {assertTrue ("kapitaliser" .equals (capsService.getConvertedCaps ("CAPITALIZE"))); assertEquals ("kapitaliser", capsService.getConvertedCaps ("CAPITALIZE")); }

Ved brug af ShrinkWrap, vi sikrer, at alle klasser er kablet korrekt:

@Deployment offentlig statisk JavaArchive createDeployment () {return ShrinkWrap.create (JavaArchive.class) .addClasses (CapsService.class, CapsConvertor.class, ConvertToLowerCase.class) .addAsManifestResource (EmptyAsset.INSTANCE, " }

6. Test af JPA

6.1. Udholdenhed

Vi kan også bruge Arquillian til at teste vedholdenhed. Først skal vi oprette vores enhed:

@Entity offentlig klasse bil {@Id @GeneratedValue privat Lang id; @NotNull privat strengnavn; // getters og setters}

Vi har et bord, der indeholder navne på biler.

Derefter skal vi oprette vores EJB til at udføre grundlæggende operationer på vores data:

@Stateless public class CarEJB {@PersistenceContext (unitName = "defaultPersistenceUnit") private EntityManager em; offentlig bil saveCar (bil bil) {em.persist (bil); returbil; } offentlig liste findAllCars () {Query query = em.createQuery ("SELECT b FROM Car b ORDER BY b.name ASC"); Listeindgange = query.getResultList (); returnere poster == null? ny ArrayList (): poster; public void deleteCar (Car car) {car = em.merge (car); em.remove (bil); }}

Med gem bil vi kan gemme bilnavne i databasen, vi kan gemme alle biler hos findAllCars, og også kan vi slette en bil fra databasen med deleteCar.

6.2. Test vedholdenhed med Arquillian

Nu kan vi udføre nogle grundlæggende tests ved hjælp af Arquillian.

Først tilføjer vi vores klasser til vores ShrinkWrap:

.addClasses (Car.class, CarEJB.class) .addAsResource ("META-INF / persistence.xml")

Derefter opretter vi vores test:

@Test offentlige ugyldige testCars () {assertTrue (carEJB.findAllCars (). IsEmpty ()); Bil c1 = ny bil (); c1.setName ("Impala"); Bil c2 = ny bil (); c2.setName ("Lincoln"); carEJB.saveCar (c1); carEJB.saveCar (c2); assertEquals (2, carEJB.findAllCars (). størrelse ()); carEJB.deleteCar (c1); assertEquals (1, carEJB.findAllCars (). størrelse ()); }

I denne test opretter vi først fire bilforekomster, og vi kontrollerer, at antallet af rækker i databasen er det samme, som vi oprettede.

8. Konklusion

I denne vejledning, vi:

  • introducerede Arquillian kernekoncepter
  • injicerede en komponent i Arquillian-testen
  • testet en EJB
  • testet vedholdenhed
  • udførte Arquillian-testen ved hjælp af Maven

Du kan finde koden fra artiklen over på Github.