Obiettivo
- Informazioni sulle le nozioni di base sul test unitario.
- Scopri i framework e gli strumenti comunemente utilizzati per testare il codice AEM.
- Informazioni sulle le opzioni per creare risorse AEM fittizie o simulate durante la scrittura di test unitari.
Esperienza pregressa
In questo tutorial verrà illustrato come scrivere test unitari per il modello Sling del componente Byline (creato nella sezione Creazione di un componente AEM personalizzato). I test unitari sono test scritti durante la fase di compilazione in Java™ che verificano il comportamento previsto del codice Java™. Ciascun test unitario è in genere piccolo e convalida l’output di un metodo (o unità di lavoro) in base ai risultati previsti.
Utilizziamo le best practice di AEM insieme a:
- JUnit 5
- Framework di test Mockito
- Framework di test di wcm.io (che si basa su Mock di Apache Sling)
Test unitario e Adobe Cloud Manager
Adobe Cloud Manager integra l’esecuzione di test unitari e il reporting sulla copertura del codice nella propria pipeline CI/CD per incoraggiare e promuovere la best practice per il codice AEM dei test unitari.
Anche se il codice del test unitario è una prassi ideale per qualsiasi base di codice, quando si utilizza Cloud Manager è importante sfruttarne i servizi di test e reporting della qualità del codice fornendo test unutario per l’esecuzione di Cloud Manager.
Aggiornare le dipendenze Maven del test
Il primo passaggio consiste nell’esaminare le dipendenze Maven per supportare la scrittura e l’esecuzione dei test. Sono necessarie quattro dipendenze:
- JUnit5
- Framework di test per Mokito
- Apache Sling Mocks
- Infrastruttura di test di AEM Mocks (di io.wcm)
Le dipendenze dei test JUnit5, **Mockito e AEM Mocks vengono aggiunte automaticamente al progetto durante l’installazione utilizzando l’archetipo AEM Maven.
-
Per visualizzare queste dipendenze, apri il POM del reattore principale in aem-guides-wknd/pom.xml, passa a
<dependencies>..</dependencies>e visualizza le dipendenze dei test JUnit, Mockito, Apache Sling Mocks e AEM Mock di io.wcm in<!-- Testing -->. -
Verifica che
io.wcm.testing.aem-mock.junit5sia impostato su 4.1.0:<dependency> <groupId>io.wcm</groupId> <artifactId>io.wcm.testing.aem-mock.junit5</artifactId> <version>4.1.0</version> <scope>test</scope> </dependency>ATTENZIONE
Archetipo 35 genera il progetto conio.wcm.testing.aem-mock.junit5versione 4.1.8. Effettua il downgrade a 4.1.0 per seguire il resto di questo capitolo. -
Apri aem-guides-wknd/core/pom.xml e osserva che le dipendenze di test corrispondenti sono disponibili.
Una cartella di origine parallela nel progetto core conterrà i test di unità ed eventuali file di test di supporto. Questa cartella test assicura la separazione delle classi di test dal codice sorgente, ma consente ai test di agire come se si trovassero negli stessi pacchetti del codice sorgente.
Creazione del test JUnit
I test di unità tipicamente sono mappati 1-a-1 con le classi Java™. In questo capitolo verrà scritto un test JUnit per BylineImpl.java, che è il modello Sling che supporta il componente Byline.
Percorso in cui sono archiviati i test di unità.
-
Crea un test di unità per
BylineImpl.javacreando una nuova classe Java™ insrc/test/javain una struttura di cartelle di pacchetti Java™ che rispecchia la posizione della classe Java™ da testare.
Poiché stiamo testando
src/main/java/com/adobe/aem/guides/wknd/core/models/impl/BylineImpl.java
creare una classe Java™ per test di unità corrispondente in
src/test/java/com/adobe/aem/guides/wknd/core/models/impl/BylineImplTest.java
Il suffisso
Testnel file di test di unitàBylineImplTest.javaè una convenzione che consente di- Identificarlo facilmente come file di test per
BylineImpl.java - Ma anche differenziare il file di test dalla classe in fase di test,
BylineImpl.java
Revisione di BylineImplTest.java
A questo punto, il file di test JUnit è una classe Java™ vuota.
-
Aggiorna il file con il seguente codice:
package com.adobe.aem.guides.wknd.core.models.impl; import static org.junit.jupiter.api.Assertions.*; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; public class BylineImplTest { @BeforeEach void setUp() throws Exception { } @Test void testGetName() { fail("Not yet implemented"); } @Test void testGetOccupations() { fail("Not yet implemented"); } @Test void testIsEmpty() { fail("Not yet implemented"); } } -
Il primo metodo
public void setUp() { .. }è annotato con@BeforeEachdi JUnit, che indica a chi esegue il test JUnit di eseguire questo metodo prima di ogni metodo di test in questa classe. Ciò permette comodamente di inizializzare lo stato di test comune richiesto da tutti i test. -
I metodi successivi sono i metodi di test, i cui nomi sono preceduti da
testper convenzione e contrassegnati con l’annotazione@Test. Per impostazione predefinita, tutti i nostri test sono impostati per non riuscire, poiché non li abbiamo ancora implementati.Innanzitutto, iniziamo con un singolo metodo di test per ogni metodo pubblico sulla classe che stiamo testando, quindi:
BylineImpl.javaBylineImplTest.javagetName()è testato datestGetName()getOccupations()è testato datestGetOccupations()isEmpty()è testato datestIsEmpty()Questi metodi possono essere ampliati in base alle esigenze, come vedremo più avanti in questo capitolo.
Quando viene eseguita questa classe di test JUnit (nota anche come caso di test JUnit), ogni metodo contrassegnato con
@Testverrà eseguito come test che può essere superato o non superato.
core/src/test/java/com/adobe/aem/guides/wknd/core/models/impl/BylineImplTest.java
-
Eseguire il caso di test JUnit facendo clic con il pulsante destro del mouse sul file
BylineImplTest.javae toccando Esegui.
Come previsto, tutti i test hanno esito negativo poiché non sono ancora stati implementati.
Fai clic con il pulsante destro del mouse su BylineImplTests.java > Esegui