Inleiding tot testen met Arquillian

1. Overzicht

Arquillian is een container-agnostisch integratietestraamwerk voor Jakarta EE. Het gebruik van Arquillian minimaliseert de last van het beheer van containers, implementaties, framework-initialisaties, enzovoort.

We kunnen ons concentreren op het schrijven van daadwerkelijke tests en niet op het opstarten van de testomgeving.

2. Kernconcepten

2.1. Implementatiearchieven

Er is een gemakkelijke manier om onze applicatie te testen wanneer deze in een container draait.

Ten eerste, Krimpfolie class biedt een API om inzetbaar te maken *.pot,*.oorlog, en *.oor bestanden.

Vervolgens stelt Arquillian ons in staat om de testimplementatie te configureren met behulp van de @Deployment annotatie - op een methode die een Krimpfolie voorwerp.

2.2. Containers

Arquillian onderscheidt drie verschillende soorten containers:

  • Op afstand getest met behulp van een extern protocol zoals JMX
  • Beheerd - containers op afstand, maar hun levenscyclus wordt beheerd door Arquillian
  • Embedded - lokale containers waarin tests worden uitgevoerd met behulp van lokale protocollen

We kunnen containers ook classificeren op basis van hun mogelijkheden:

  • Jakarta EE-applicaties geïmplementeerd op een applicatieserver zoals Glassfish of JBoss
  • Servlet-containers geïmplementeerd op Tomcat of Jetty
  • Standalone containers
  • OSGI-containers

Het onderzoekt het runtime-klassenpad en selecteert automatisch de beschikbare container.

2.3. Test verrijking

Arquillian verrijkt tests door b.v. de afhankelijkheidsinjectie zodat we onze tests gemakkelijk kunnen schrijven.

We kunnen afhankelijkheden injecteren met @Injecteren, injecteer middelen met @Resource, EJB-sessiebonen gebruiken @EJB, enz.

2.4. Meerdere testrunners

We kunnen meerdere implementaties maken met behulp van de annotatie:

@Deployment (name = "mijnnaam" order = 1)

Waar de naam de naam is van het implementatiebestand en de orderparameter de uitvoeringsvolgorde van de implementatie is, dus we kunnen nu tests uitvoeren op meerdere implementaties tegelijkertijd met behulp van de annotatie:

@Test @OperateOnDeployment ("mijnnaam")

De voor-test wordt uitgevoerd op de mijn naam implementatiecontainer met de volgorde die is gedefinieerd in het @Deployment annotatie.

2.5. Arquillian-extensies

Arquillian biedt meerdere extensies voor het geval onze testbehoeften niet worden gedekt door de core runtime. We hebben persistentie, transacties, client / server, REST-extensies, enz.

We kunnen die extensies inschakelen door de juiste afhankelijkheden toe te voegen aan Maven- of Gradle-configuratiebestanden.

Veelgebruikte extensies zijn Drone, Graphene en Selenium.

3. Maven afhankelijkheden en instellingen

Laten we de volgende afhankelijkheid toevoegen aan onze pom.xml het dossier:

 org.jboss.arquillian arquillian-bom 1.1.13.Finale 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 test 

De laatste versie van de afhankelijkheden is hier te vinden: arquillian-bom, org.glassfish.main.extras, org.jboss.arquillian.container.

4. Eenvoudige test

4.1. Maak een component

Laten we beginnen met een eenvoudig onderdeel. We nemen hier geen geavanceerde logica op om ons op tests te kunnen concentreren:

openbare klasse Component {public void sendMessage (PrintStream to, String msg) {to.println (bericht (msg)); } public String bericht (String msg) {return "Message," + msg; }}

Met behulp van Arquillian willen we testen of deze klasse zich correct gedraagt ​​wanneer deze wordt aangeroepen als een CDI-bean.

4.2. Schrijf onze eerste Arquillian-test

Eerst moeten we specificeren dat onze testklasse moet worden uitgevoerd met behulp van de framework-specifieke runner:

@RunWith (Arquillian.class) 

Als we onze tests in een container gaan uitvoeren, moeten we de @Deployment annotatie.

Arquillian gebruikt niet het volledige klassenpad om het testarchief te isoleren. In plaats daarvan gebruikt het de Krimpfolie class, dat is een Java API voor het maken van archieven. Wanneer we het te testen archief maken, specificeren we welke bestanden in het klassenpad moeten worden opgenomen om de test te gebruiken. Tijdens de inzet Krimpfolie isoleert alleen de klassen die nodig zijn voor de test.

De ... gebruiken addclass () methode kunnen we alle noodzakelijke klassen specificeren, en ook een lege manifest resource toevoegen.

De JavaArchive.class maakt een mockup-webarchief aan met de naam test.war, dit bestand wordt in de container geïmplementeerd en wordt vervolgens door Arquillian gebruikt om tests uit te voeren:

@Deployment openbare statische JavaArchive createDeployment () {retourneer ShrinkWrap.create (JavaArchive.class) .addClass (Component.class) .addAsManifestResource (EmptyAsset.INSTANCE, "beans.xml"); }

Vervolgens injecteren we onze component in de test:

@Inject privécomponentcomponent;

Ten slotte voeren we onze test uit:

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

5. Enterprise Java Beans testen

5.1. Enterprise Java Bean

Met Arquillian kunnen we de afhankelijkheidsinjectie van een Enterprise Java Bean testen, om dat te doen, maken we een klasse die een methode heeft om elk woord naar kleine letters te converteren:

openbare klasse ConvertToLowerCase {public String convert (String-woord) {return word.toLowerCase (); }}

Met behulp van deze klasse maken we een staatloze klasse om de eerder gemaakte methode aan te roepen:

@Stateless openbare klasse CapsConvertor {openbare ConvertToLowerCase getLowerCase () {retourneer nieuwe ConvertToLowerCase (); }}

De CapsConvertor klasse wordt geïnjecteerd in een serviceboon:

@Stateless openbare klasse CapsService {@Inject private CapsConvertor capsConvertor; public String getConvertedCaps (laatste String-woord) {return capsConvertor.getLowerCase (). convert (word); }}

5.2. Test de Enterprise Java Bean

Nu kunnen we Arquillian gebruiken om onze onderneming Java Bean te testen door het CapsService:

@Inject privé CapsService capsService; @Test openbare leegte gegevenWord_WhenUppercase_ThenLowercase () {assertTrue ("hoofdletter" .equals (capsService.getConvertedCaps ("CAPITALIZE"))); assertEquals ("capitalize", capsService.getConvertedCaps ("CAPITALIZE")); }

Gebruik makend van Krimpfolie, we zorgen ervoor dat alle klassen correct zijn bedraad:

@Deployment openbare statische JavaArchive createDeployment () {return ShrinkWrap.create (JavaArchive.class) .addClasses (CapsService.class, CapsConvertor.class, ConvertToLowerCase.class) .addAsManifestResource (EmptyAsset.INSTANCE, "beans.xml"); }

6. Testen van JPA

6.1. Volharding

We kunnen Arquillian ook gebruiken om persistentie te testen. Eerst gaan we onze entiteit creëren:

@Entity openbare klasse Auto {@Id @GeneratedValue privé Lange id; @NotNull private String naam; // getters en setters}

We hebben een tafel met namen van auto's.

Vervolgens gaan we onze EJB maken om basisbewerkingen op onze gegevens uit te voeren:

@Stateless openbare klasse CarEJB {@PersistenceContext (unitName = "defaultPersistenceUnit") privé EntityManager em; openbare auto saveCar (auto auto) {em.persist (auto); auto inleveren; } openbare lijst findAllCars () {Queryquery = em.createQuery ("SELECTEER b UIT auto b ORDER DOOR b.name ASC"); Lijstitems = query.getResultList (); retouringangen == null? new ArrayList (): ingangen; public void deleteCar (auto auto) {auto = em.merge (auto); em.remove (auto); }}

Met saveCar we kunnen de autonamen opslaan in de database, we kunnen alle auto's laten opslaan findAllCars, en we kunnen ook een auto uit de database verwijderen met deleteCar.

6.2. Test persistentie met Arquillian

Nu kunnen we enkele basistests uitvoeren met Arquillian.

Ten eerste voegen we onze lessen toe aan onze Krimpfolie:

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

Vervolgens maken we onze test:

@Test openbare ongeldige testCars () {assertTrue (carEJB.findAllCars (). IsEmpty ()); Auto c1 = nieuwe auto (); c1.setName ("Impala"); Auto c2 = nieuwe auto (); c2.setName ("Lincoln"); carEJB.saveCar (c1); carEJB.saveCar (c2); assertEquals (2, carEJB.findAllCars (). size ()); carEJB.deleteCar (c1); assertEquals (1, carEJB.findAllCars (). size ()); }

In deze test maken we eerst vier auto-instanties en controleren we of het aantal rijen in de database hetzelfde is dat we hebben gemaakt.

8. Conclusie

In deze tutorial hebben we:

  • introduceerde Arquillian kernconcepten
  • injecteerde een component in de Arquillian-test
  • testte een EJB
  • geteste persistentie
  • voerde de Arquillian-test uit met Maven

Je kunt de code uit het artikel vinden op Github.