Testovanie pomocou Hamcrest

1. Prehľad

Hamcrest je dobre známy rámec používaný na testovanie jednotiek v ekosystéme Java. Je zabalený v JUnit a jednoducho povedané, na vytváranie tvrdení používa existujúce predikáty - nazývané triedy porovnávacích nástrojov.

V tomto výučbe to urobíme preskúmať rozhranie Hamcrest API a naučte sa, ako to využiť na písanie prehľadnejších a intuitívnejších testov jednotiek pre náš softvér.

2. Nastavenie Hamcrest

Môžeme použiť Hamcrest s maven pridaním nasledujúcej závislosti do našej pom.xml spis:

 org.hamcrest hamcrest-všetci 1.3 

Najnovšiu verziu tejto knižnice nájdete vždy tu.

3. Ukážkový test

Hamcrest sa bežne používa s junit a ďalšie testovacie rámce na uplatnenie tvrdení. Konkrétne namiesto použitia junitJe veľa tvrdiť metódami, používame iba jednotlivé API tvrdiťTo vyhlásenie s vhodnými hráčmi.

Pozrime sa na príklad, ktorý testuje dva Strings pre rovnosť bez ohľadu na prípad. To by nám malo poskytnúť jasnú predstavu o tom, ako Hamcrest vyhovuje testovacej metóde:

public class StringMatcherTest {@Test public void given2Strings_whenEqual_thenCorrect () {String a = "foo"; Reťazec b = "FOO"; assertThat (a, equalToIgnoringCase (b)); }}

V nasledujúcich častiach sa pozrieme na niekoľko ďalších bežných porovnávačov Hamcrest ponuky.

4. The Objekt Matcher

Hamcrest poskytuje porovnávače na vykonávanie tvrdení na ľubovoľných objektoch Java.

Tvrdiť, že natiahnuť metóda Objekt vráti zadanú hodnotu String:

@Test public void givenBean_whenToStringReturnsRequiredString_thenCorrect () {Osoba osoba = nová Osoba ("Barrack", "Washington"); Reťazec str = osoba.toString (); assertThat (osoba, hasToString (str)); }

Môžeme tiež skontrolovať, či je jedna trieda podtriedou druhej:

@Test public void given2Classes_whenOneInheritsFromOther_thenCorrect () {assertThat (Cat.class, typeCompatibleWith (Animal.class)); }}

5. Bean Matcher

Môžeme použiť HamcrestPorovnávač fazule na kontrolu vlastností fazule Java.

Predpokladajme nasledovné Osoba fazuľa:

verejná trieda Osoba {meno reťazca; Adresa reťazca; public Person (String personName, String personAddress) {name = personName; adresa = osobaAdresa; }}

Môžeme skontrolovať, či má fazuľa vlastnosť, názov ako:

@Test public void givenBean_whenHasValue_thenCorrect () {Osoba osoba = nová Osoba ("Baeldung", 25); assertThat (osoba, hasProperty ("meno")); }

Môžeme tiež skontrolovať, či Osoba adresa nehnuteľnosť, inicializovaná do New Yorku:

@Test public void givenBean_whenHasCorrectValue_thenCorrect () {Osoba osoba = nová Osoba ("Baeldung", "New York"); assertThat (person, hasProperty ("address", equalTo ("New York"))); }

Môžeme tiež skontrolovať, či sú dve Osoba objekty sú konštruované s rovnakými hodnotami:

@Test public void given2Beans_whenHavingSameValues_thenCorrect () {Osoba person1 = nová Osoba ("Baeldung", "New York"); Osoba person2 = nová Osoba ("Baeldung", "New York"); assertThat (osoba1, samePropertyValuesAs (osoba2)); } 

6. Zbierka Matcher

Hamcrest poskytuje porovnávače na kontrolu Zbierkas.

Jednoduchá kontrola, či a Zbierka je prázdny:

@Test public void givenCollection_whenEmpty_thenCorrect () {List emptyList = new ArrayList (); assertThat (emptyList, empty ()); }

Ak chcete skontrolovať veľkosť a Zbierka:

@Test public void givenAList_whenChecksSize_thenCorrect () {List hamcrestMatchers = Arrays.asList ("zbierky", "fazuľa", "text", "číslo"); assertThat (hamcrestMatchers, hasSize (4)); }

Môžeme ho tiež použiť na tvrdenie, že pole má požadovanú veľkosť:

@Test public void givenArray_whenChecksSize_thenCorrect () {String [] hamcrestMatchers = {"collections", "beans", "text", "number"}; assertThat (hamcrestMatchers, arrayWithSize (4)); }

Ak chcete skontrolovať, či a Zbierka obsahuje daných členov bez ohľadu na poradie:

@Test public void givenAListAndValues_whenChecksListForGivenValues_thenCorrect () {List hamcrestMatchers = Arrays.asList ("collections", "beans", "text", "number"); assertThat (hamcrestMatchers, containsInAnyOrder ("fazuľa", "text", "zbierky", "číslo")); }

Ďalej tvrdiť, že Zbierka členovia sú v uvedenom poradí:

@Test public void givenAListAndValues_whenChecksListForGivenValuesWithOrder_thenCorrect () {List hamcrestMatchers = Arrays.asList ("collections", "beans", "text", "number"); assertThat (hamcrestMatchers, contains ("zbierky", "fazuľa", "text", "číslo")); }

Ak chcete skontrolovať, či má pole jediný daný prvok:

@Test public void givenArrayAndValue_whenValueFoundInArray_thenCorrect () {String [] hamcrestMatchers = {"zbierky", "fazuľa", "text", "číslo"}; assertThat (hamcrestMatchers, hasItemInArray ("text")); }

Pre rovnaký test môžeme použiť aj alternatívny porovnávač:

@Test public void givenValueAndArray_whenValueIsOneOfArrayElements_thenCorrect () {String [] hamcrestMatchers = {"zbierky", "fazuľa", "text", "číslo"}; assertThat ("text", isOneOf (hamcrestMatchers)); }

Alebo stále môžeme urobiť to isté s iným porovnávačom, ako je tento:

@Test public void givenValueAndArray_whenValueFoundInArray_thenCorrect () {String [] pole = nový String [] {"zbierky", "fazuľa", "text", "číslo"}; assertThat ("fazuľa", isIn (pole)); }

Môžeme tiež skontrolovať, či pole obsahuje dané prvky bez ohľadu na poradie:

@Test public void givenArrayAndValues_whenValuesFoundInArray_thenCorrect () {String [] hamcrestMatchers = {"zbierky", "fazuľa", "text", "číslo"}; assertThat (hamcrestMatchers, arrayContainingInAnyOrder ("fazuľa", "zbierky", "číslo", "text")); }

Ak chcete skontrolovať, či pole obsahuje dané prvky, ale v danom poradí:

@Test public void givenArrayAndValues_whenValuesFoundInArrayInOrder_thenCorrect () {String [] hamcrestMatchers = {"kolekcie", "fazuľa", "text", "číslo"}; assertThat (hamcrestMatchers, arrayContaining ("zbierky", "fazuľa", "text", "číslo")); }

Keď náš Zbierka je a Mapa, v týchto príslušných funkciách môžeme použiť nasledujúce porovnávače:

Ak chcete skontrolovať, či daný kľúč obsahuje, postupujte takto:

@Test public void givenMapAndKey_whenKeyFoundInMap_thenCorrect () {Mapa mapy = nový HashMap (); map.put ("blogname", "baeldung"); assertThat (mapa, hasKey ("blogname")); }

a daná hodnota:

@Test public void givenMapAndValue_whenValueFoundInMap_thenCorrect () {Mapa mapy = nový HashMap (); map.put ("blogname", "baeldung"); assertThat (mapa, hasValue ("baeldung")); }

a nakoniec zadaný záznam (kľúč, hodnota):

@Test public void givenMapAndEntry_whenEntryFoundInMap_thenCorrect () {Map map = new HashMap (); map.put ("blogname", "baeldung"); assertThat (mapa, hasEntry ("blogname", "baeldung")); }

7. The Číslo Matcher

The Číslo porovnávače sa používajú na vykonávanie tvrdení o premenných súboru Číslo trieda.

Skontrolovať väčší než stav:

@Test public void givenAnInteger_whenGreaterThan0_thenCorrect () {assertThat (1, greaterThan (0)); }

Skontrolovať väčší než alebo rovná stav:

@Test public void givenAnInteger_whenGreaterThanOrEqTo5_thenCorrect () {assertThat (5, greaterThanOrEqualTo (5)); }

Skontrolovať menej ako stav:

@Test public void givenAnInteger_whenLessThan0_thenCorrect () {assertThat (-1, lessThan (0)); }

Skontrolovať menej ako alebo rovná stav:

@Test public void givenAnInteger_whenLessThanOrEqTo5_thenCorrect () {assertThat (-1, lessThanOrEqualTo (5)); }

Skontrolovať blízko stav:

@Test public void givenADouble_whenCloseTo_thenCorrect () {assertThat (1.2, closeTo (1, 0,5)); }

Venujme veľkú pozornosť poslednému hráčovi zápasu, blízko. Prvý argument, operand, je ten, s ktorým sa porovnáva cieľ, a druhý argument je prípustná odchýlka od operandu. . To znamená, že ak je cieľom operand + odchýlka alebo odchýlka operandu, potom test prejde.

8. Zhoda textu

Tvrdenie dňa Strings je jednoduchšie, prehľadnejšie a intuitívnejšie s HamcrestPorovnávače textu. V tejto časti sa na ne pozrieme.

Ak chcete skontrolovať, či a String je prázdny:

@Test public void givenString_whenEmpty_thenCorrect () {String str = ""; assertThat (str, isEmptyString ()); }

Ak chcete skontrolovať, či a String je prázdny resp nulový:

@Test public void givenString_whenEmptyOrNull_thenCorrect () {String str = null; assertThat (str, isEmptyOrNullString ()); }

Pre kontrolu rovnosti dvoch Strings pri ignorovaní medzier:

@Test public void given2Strings_whenEqualRegardlessWhiteSpace_thenCorrect () {String str1 = "text"; Reťazec str2 = "text"; assertThat (str1, equalToIgnoringWhiteSpace (str2)); }

Môžeme tiež skontrolovať prítomnosť jedného alebo viacerých podreťazcov v danom reťazci String v danom poradí:

@Test public void givenString_whenContainsGivenSubstring_thenCorrect () {String str = "kaligrafia"; assertThat (str, stringContainsInOrder (Arrays.asList ("volanie", "graf"))); }

Nakoniec môžeme skontrolovať rovnosť dvoch Strings bez ohľadu na prípad:

@Test public void given2Strings_whenEqual_thenCorrect () {String a = "foo"; Reťazec b = "FOO"; assertThat (a, equalToIgnoringCase (b)); }

9. Core API

The Hamcrest core API majú používať poskytovatelia rámca tretích strán. Ponúka nám však niekoľko skvelých konštrukcií, vďaka ktorým sú naše testovacie jednotky čitateľnejšie, a tiež niekoľko základných porovnávacích nástrojov, ktoré sa dajú rovnako ľahko použiť.

Čitateľnosť s je postaviť na dohadzovači:

@Test public void given2Strings_whenIsEqualRegardlessWhiteSpace_thenCorrect () {String str1 = "text"; Reťazec str2 = "text"; assertThat (str1, is (equalToIgnoringWhiteSpace (str2))); }

The je konštruovať na jednoduchom dátovom type:

@Test public void given2Strings_whenIsEqual_thenCorrect () {String str1 = "text"; Reťazec str2 = "text"; assertThat (str1, je (str2)); }

Negácia s nie zostrojiť na dohadzovači:

@Test public void given2Strings_whenIsNotEqualRegardlessWhiteSpace_thenCorrect () {String str1 = "text"; Reťazec str2 = "texty"; assertThat (str1, not (equalToIgnoringWhiteSpace (str2))); }

The nie konštruovať na jednoduchom dátovom type:

@Test public void given2Strings_whenNotEqual_thenCorrect () {String str1 = "text"; Reťazec str2 = "texty"; assertThat (str1, nie (str2)); }

Skontrolujte, či a String obsahuje daný podreťazec:

@Test public void givenAStrings_whenContainsAnotherGivenString_thenCorrect () {String str1 = "kaligrafia"; Reťazec str2 = "hovor"; assertThat (str1, containsString (str2)); }

Skontrolujte, či a String začína daným podreťazcom:

@Test public void givenAString_whenStartsWithAnotherGivenString_thenCorrect () {String str1 = "kaligrafia"; Reťazec str2 = "hovor"; assertThat (str1, startsWith (str2)); }

Skontrolujte, či a String končí zadaným podreťazcom:

@Test public void givenAString_whenEndsWithAnotherGivenString_thenCorrect () {String str1 = "kaligrafia"; Reťazec str2 = "phy"; assertThat (str1, endsWith (str2)); }

Skontrolujte, či sú dve Objektsú rovnakého prípadu:

@Test public void given2Objects_whenSameInstance_thenCorrect () {Cat cat = new Cat (); assertThat (mačka, rovnaká inštancia (mačka)); }

Skontrolujte, či Objekt je inštancia danej triedy:

@Test public void givenAnObject_whenInstanceOfGivenClass_thenCorrect () {Cat cat = new Cat (); assertThat (cat, instanceOf (Cat.class)); }

Skontrolujte, či sú všetci členovia a Zbierka splniť podmienku:

@Test public void givenList_whenEachElementGreaterThan0_thenCorrect () {List list = Arrays.asList (1, 2, 3); int baseCase = 0; assertThat (list, everyItem (greaterThan (baseCase))); }

Skontrolujte, či a String nie je nulový:

@Test public void givenString_whenNotNull_thenCorrect () {String str = "notnull"; assertThat (str, notNullValue ()); }

Spojte reťazce podmienok, test prechádza, keď cieľ spĺňa niektorú z podmienok, podobne ako v prípade logického ALEBO:

@Test public void givenString_whenMeetsAnyOfGivenConditions_thenCorrect () {String str = "kaligrafia"; Začiatok reťazca = "volanie"; Koniec reťazca = "foo"; assertThat (str, anyOf (startsWith (start), containsString (end))); }

Podmienky reťazte dokopy, test prejde iba vtedy, keď cieľ spĺňa všetky podmienky podobné logickému A:

@Test public void givenString_whenMeetsAllOfGivenConditions_thenCorrect () {String str = "kaligrafia"; Začiatok reťazca = "volanie"; Koniec reťazca = "phy"; assertThat (str, allOf (startsWith (start), endsWith (end))); }

10. Vlastný porovnávač

Môžeme definovať vlastný matcher rozšírením TypeSafeMatcher. V tejto časti vytvoríme vlastný porovnávač, ktorý umožní úspešné absolvovanie testu, iba ak je cieľ kladné celé číslo.

public class IsPositiveInteger extends TypeSafeMatcher {public void describeTo (Description description) {description.appendText ("a positive integer"); } @Factory public static Matcher isAPositiveInteger () {return new IsPositiveInteger (); } @Override chránený booleovský matchSafely (Celé celé číslo) {návratové celé číslo> 0; }}

Musíme iba implementovať matchSafely metóda, ktorá kontroluje, či cieľ je skutočne kladné celé číslo a descriptionTo metóda, ktorá vytvorí správu o poruche v prípade, že test neprejde.

Tu je test, ktorý používa náš nový vlastný porovnávač:

@Test public void givenInteger_whenAPositiveValue_thenCorrect () {int num = 1; assertThat (num, isAPositiveInteger ()); }

a tu je správa o zlyhaní, ktorú dostávame, pretože sme prešli nezáporným celým číslom:

java.lang.AssertionError: Očakávané: kladné celé číslo, ale: bolo 

11. Záver

V tejto príručke máme preskúmali rozhranie Hamcrest API a naučili sme sa, ako s ním môžeme písať lepšie a udržiavateľnejšie jednotkové testy.

Plná implementácia všetkých týchto príkladov a útržkov kódu nájdete v mojom projekte Hamcrest github.


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