Písanie šablón pre testovacie prípady pomocou JUnit 5

1. Prehľad

Knižnica JUnit 5 ponúka oproti svojim predchádzajúcim verziám mnoho nových funkcií. Jednou z takýchto funkcií sú testovacie šablóny. Stručne povedané, testovacie šablóny sú silným zovšeobecnením parametrizovaných a opakovaných testov JUnit 5.

V tomto tutoriáli sa naučíme, ako vytvoriť testovaciu šablónu pomocou JUnit 5.

2. Maven závislosti

Začnime pridaním závislostí do našej pom.xml.

Musíme pridať hlavný JUnit 5 junit-jupiter-motor závislosť:

 org.junit.jupiter junit-jupiter-engine 5.7.0 

Okrem toho budeme musieť pridať junit-jupiter-api závislosť:

 org.junit.jupiter junit-jupiter-api 5.7.0 

Rovnako môžeme pridať potrebné závislosti do našej build.gradle spis:

skupina testCompile: „org.junit.jupiter“, názov: „junit-jupiter-engine“, verzia: „5.7.0“ skupina testCompile: „org.junit.jupiter“, názov: „junit-jupiter-api“, verzia : „5.7.0“

3. Vyhlásenie o probléme

Predtým, ako sa pozrieme na testovacie šablóny, poďme sa v krátkosti pozrieť na parametrizované testy JUnit 5. Parametrizované testy nám umožňujú vložiť do testovacej metódy rôzne parametre. Vo výsledku, keď pomocou parametrizovaných testov,môžeme vykonať jednu testovaciu metódu viackrát s rôznymi parametrami.

Predpokladajme, že by sme teraz chceli spustiť našu testovaciu metódu viackrát - nielen s rôznymi parametrami, ale aj zakaždým v inom kontexte vyvolania.

Inými slovami, boli by sme radi, keby sa testovacia metóda vykonala viackrát, pričom každé vyvolanie by malo inú kombináciu konfigurácií ako napríklad:

  • pomocou rôznych parametrov
  • iná príprava inštancie testovacej triedy - to znamená vloženie rôznych závislostí do testovacej inštancie
  • spustenie testu za iných podmienok, ako napríklad zapnutie / vypnutie podmnožiny vyvolávaní, ak je prostredie „QA
  • beží s iným správaním spätného volania počas celého životného cyklu - možno by sme chceli nastaviť a zbúrať databázu pred a po podmnožine vyvolávaní

Rýchle použitie parametrizovaných testov sa v tomto prípade ukazuje ako obmedzené. Našťastie JUnit 5 ponúka pre tento scenár výkonné riešenie v podobe testovacích šablón.

4. Testovacie šablóny

Samotné testovacie šablóny nie sú testovacími prípadmi. Namiesto toho, ako naznačuje ich názov, sú to iba šablóny pre dané testovacie prípady. Predstavujú silné zovšeobecnenie parametrizovaných a opakovaných testov.

Testovacie šablóny sa vyvolávajú raz pre každý kontext vyvolania, ktorý im poskytne poskytovateľ (poskytovatelia) kontextu vyvolania.

Pozrime sa teraz na príklad testovacích šablón. Ako sme ustanovili vyššie, hlavnými aktérmi sú:

  • cieľová metóda testu
  • metóda testovacej šablóny
  • jeden alebo viac poskytovateľov kontextu vyvolania zaregistrovaných pomocou metódy šablóny
  • jeden alebo viac kontextov vyvolania poskytnutých každým poskytovateľom kontextu vyvolania

4.1. Metóda cieľového testu

V tomto príklade použijeme jednoduchý UserIdGeneratorImpl.generate metóda ako náš cieľ testu.

Definujme UserIdGeneratorImpl trieda:

verejná trieda UserIdGeneratorImpl implementuje UserIdGenerator {private boolean isFeatureEnabled; public UserIdGeneratorImpl (boolean isFeatureEnabled) {this.isFeatureEnabled = isFeatureEnabled; } public String generate (String firstName, String lastName) {String initialAndLastName = firstName.substring (0, 1) .concat (lastName); návrat jeFeatureEnabled? "bael" .concat (initialAndLastName): initialAndLastName; }}

The generovať metóda, ktorá je našim testovacím cieľom, využíva metódu krstné meno a priezvisko ako parametre a generuje ID užívateľa. Formát ID používateľa sa líši v závislosti od toho, či je povolený prepínač funkcií.

Pozrime sa, ako to vyzerá:

Prepnutie danej funkcie je deaktivované, keď sa vráti firstName = "John" a lastName = "Smith" Potom sa vráti "JSmith" Prepnutie danej funkcie je povolené, keď sa vráti firstName = "John" a lastName = "Smith" Potom sa vráti "baelJSmith"

Ďalej napíšeme metódu testovacej šablóny.

4.2. Metóda testovacej šablóny

Tu je testovacia šablóna pre našu cieľovú testovaciu metódu UserIdGeneratorImpl.generate:

verejná trieda UserIdGeneratorImplUnitTest {@TestTemplate @ExtendWith (UserIdGeneratorTestInvocationContextProvider.class) verejná neplatnosť whenUserIdRequested_thenUserIdIsReturnedInCorrectFormat (UserIdGeneratorTestCase testCase) {UserIdGeneratorTestCase testCase) Reťazec actualUserId = userIdGenerator.generate (testCase.getFirstName (), testCase.getLastName ()); assertThat (actualUserId) .isEqualTo (testCase.getExectedUserId ()); }}

Pozrime sa podrobnejšie na metódu testovacej šablóny.

Začať s, vytvoríme našu metódu testovacej šablóny označením pomocou JUnit 5 @TestTemplate anotácia.

Potom registrujeme poskytovateľa kontextu, UserIdGeneratorTestInvocationContextProvider,pomocou @ExtendWith anotácia. Pomocou testovacej šablóny môžeme zaregistrovať viacerých poskytovateľov kontextu. Na účely tohto príkladu však registrujeme jedného poskytovateľa.

Metóda šablóny tiež prijíma inštanciu súboru UserIdGeneratorTestCase ako parameter. Toto je jednoducho obálka triedy pre vstupy a očakávaný výsledok testovacieho prípadu:

public class UserIdGeneratorTestCase {private boolean isFeatureEnabled; private String meno; private String priezvisko; private String expectUserId; // Štandardní zakladatelia a obstarávatelia}

Nakoniec vyvoláme metódu cieľového testu a tvrdíme, že tento výsledok je očakávaný

Teraz je čas definovať nášho poskytovateľa kontextu vyvolania.

4.3. Poskytovateľ kontextu vyvolania

Musíme zaregistrovať aspoň jednu TestTemplateInvocationContextProvider s našou testovacou šablónou. Každá zaregistrovaná TestTemplateInvocationContextProvider poskytuje a Prúd z TestTemplateInvocationContext inštancie.

Predtým pomocou @ExtendWith anotáciu, zaregistrovali sme sa UserIdGeneratorTestInvocationContextProvider ako náš poskytovateľ vyvolania.

Definujme teraz túto triedu:

verejná trieda UserIdGeneratorTestInvocationContextProvider implementuje TestTemplateInvocationContextProvider {// ...}

Náš kontext vyvolania implementuje TestTemplateInvocationContextProvider rozhranie, ktoré má dve metódy:

  • podporujeTestTemplate
  • provideTestTemplateInvocationContexts

Začnime implementáciou podporujeTestTemplate metóda:

@Override public boolean supportsTestTemplate (ExtensionContext extensionContext) {return true; }

Vykonávací modul JUnit 5 volá podporujeTestTemplate najskôr overte, či je poskytovateľ pre daný prípad použiteľný ExecutionContext. V takom prípade sa jednoducho vrátime pravda.

Teraz poďme implementovať provideTestTemplateInvocationContexts metóda:

@Override public Stream provideTestTemplateInvocationContexts (ExtensionContext extensionContext) {boolean featureDisabled = false; boolean featureEnabled = true; návrat Stream.of (featureDisabledContext (new UserIdGeneratorTestCase ("Prepínač danej funkcie je zakázaný, keď je meno používateľa John Smith Potom vygenerované ID používateľa je JSmith", featureDisabled, "John", "Smith", "JSmith")), featureEnabledContext (nový UserIdGeneratorTestCase (" Daný prepínač funkcií je povolený, keď je používateľské meno John Smith. Potom vygenerované ID používateľa je baelJSmith ", featureEnabled," John "," Smith "," baelJSmith "))); }

Účelom provideTestTemplateInvocationContexts metódou je poskytnúť a Prúd z TestTemplateInvocationContext inštancie. V našom príklade vráti dve inštancie poskytnuté metódami featureDisabledContext a featureEnabledContext. Následne bude naša testovacia šablóna bežať dvakrát.

Ďalej sa pozrime na tieto dva TestTemplateInvocationContext inštancie vrátené týmito metódami.

4.4. Kontextové inštancie vyvolania

Kontexty vyvolania sú implementáciami TestTemplateInvocationContext rozhranie a implementovať nasledujúce metódy:

  • getDisplayName - poskytnúť zobrazovaný názov testu
  • getAdditionalExtensions - vrátiť ďalšie rozšírenia pre kontext vyvolania

Definujme featureDisabledContext metóda, ktorá vráti našu prvú inštanciu kontextu vyvolania:

private TestTemplateInvocationContext featureDisabledContext (UserIdGeneratorTestCase userIdGeneratorTestCase) {return new TestTemplateInvocationContext () {@Override public String getDisplayName (int invocationIndex) {return userIdGeneratorTestCase.getDisplayName () } @Override public List getAdditionalExtensions () {return asList (new GenericTypedParameterResolver (userIdGeneratorTestCase), new BeforeTestExecutionCallback () {@Override public void beforeTestExecution (ExtensionContext extensionContext) {System.out.println ("BeforeTestExecution}") new AfterTestExecutionCallback () {@Override public void afterTestExecution (ExtensionContext extensionContext) {System.out.println ("AfterTestExecutionCallback: Zakázaný kontext");}}); }}; }

Po prvé, pre kontext vyvolania vrátený featureDisabledContext metódou, prípony, ktoré registrujeme, sú:

  • GenericTypedParameterResolver Rozšírenie parametrov -
  • BeforeTestExecutionCallback - rozšírenie spätného volania životného cyklu, ktoré sa spustí bezprostredne pred vykonaním testu
  • AfterTestExecutionCallback - rozšírenie spätného volania životného cyklu, ktoré sa spustí okamžite po vykonaní testu

Pre druhý kontext vyvolania vrátený featureEnabledContext metóda, zaregistrujme inú sadu rozšírení (zachovanie GenericTypedParameterResolver):

private TestTemplateInvocationContext featureEnabledContext (UserIdGeneratorTestCase userIdGeneratorTestCase) {return new TestTemplateInvocationContext () {@Override public String getDisplayName (int invocationIndex) {return userIdGeneratorTestCase.getDisplayName () } @Override public List getAdditionalExtensions () {return asList (new GenericTypedParameterResolver (userIdGeneratorTestCase), new DisabledOnQAEnvironmentExtension (), new BeforeEachCallback () {@Override public void beforeEach (ExtensionContext extensionContext) );}}, new AfterEachCallback () {@Override public void afterEach (ExtensionContext extensionContext) {System.out.println ("AfterEachCallback: Enabled context");}}); }}; }

Pre druhý kontext vyvolania sú prípony, ktoré registrujeme, tieto:

  • GenericTypedParameterResolver Rozšírenie parametrov -
  • DisabledOnQAEnvironmentExtension - podmienka vykonania deaktivácie testu, ak je vlastnosť prostredia (načítaná z application.properties súbor) je „qa
  • BeforeEachCallback - rozšírenie spätného volania životného cyklu, ktoré beží pred vykonaním každej testovacej metódy
  • AfterEachCallback - rozšírenie spätného volania životného cyklu, ktoré sa spustí po každom vykonaní testovacej metódy

Z vyššie uvedeného príkladu je zrejmé, že:

  • rovnaká testovacia metóda sa spúšťa vo viacerých kontextoch vyvolania
  • každý kontext vyvolania používa vlastnú sadu rozšírení, ktoré sa líšia počtom aj charakterom od rozšírení v iných kontextoch vyvolania

Výsledkom je, že testovaciu metódu je možné vyvolať vždy niekoľkokrát v úplne inom kontexte vyvolania. A registráciou viacerých poskytovateľov kontextu môžeme poskytnúť ešte viac ďalších vrstiev vyvolávacích kontextov, v ktorých sa má test spustiť.

5. Záver

V tomto článku sme sa pozreli na to, ako testovacie šablóny JUnit 5 predstavujú silné zovšeobecnenie parametrizovaných a opakovaných testov.

Na úvod sme sa pozreli na niektoré obmedzenia parametrizovaných testov. Ďalej sme diskutovali o tom, ako testovacie šablóny prekonávajú obmedzenia tým, že umožňujú spustenie testu v inom kontexte pre každé vyvolanie.

Na záver sme sa pozreli na príklad vytvorenia novej testovacej šablóny. Príklad sme prelomili, aby sme pochopili, ako šablóny fungujú v spojení s poskytovateľmi kontextu vyvolania a kontextmi vyvolania.

Zdrojový kód príkladov použitých v tomto článku je ako vždy k dispozícii na serveri GitHub.


$config[zx-auto] not found$config[zx-overlay] not found