Testovanie pomocou Google Truth

1. Prehľad

Pravda je a plynulý a flexibilný rámec testovania otvoreného zdroja navrhnutý tak, aby zlepšoval čitateľnosť testovacích tvrdení a správ o zlyhaní.

V tomto článku sa pozrieme na kľúčové vlastnosti Pravda rámec a implementovať príklady na predvedenie svojich schopností.

2. Maven závislosti

Najprv musíme pridať pravda a pravda-java8-rozšírenie k nášmu pom.xml:

 com.google.truth pravda 0,32 com.google.truth.extensions pravda-java8-rozšírenie 0,32 test 

Najnovšie verzie pravdivosti a rozšírenia pravda-java8 nájdete na serveri Maven Central.

3. Úvod

Pravda umožňuje nám písať čitateľné tvrdenia a správy o zlyhaní pre rôzne triedy:

  • Štandardná Java - primitíva, polia, reťazce, predmety, zbierky, vrhače, triedy atď.
  • Java 8Voliteľné a Prúd inštancie
  • GuavaVoliteľné, Multimap, Multiseta Tabuľka predmety
  • Vlastné typy - rozšírením Predmet triedy, ako uvidíme neskôr

Cez Pravda a Pravda8 triedy, knižnica poskytuje užitočné metódy na písanie tvrdení, ktoré fungujú na a predmet, to je hodnota alebo testovaný objekt.

Akonáhle je subjekt známy, Pravda dokáže v čase zostavenia odôvodniť, aké návrhy sú pre tento predmet známe. To mu umožňuje vrátiť obaly okolo našej hodnoty, ktoré deklarujú metódy propozície špecifické pre konkrétny predmet.

Napríklad pri uplatňovaní na zozname Pravda vracia IterableSubject inštancie definujúce metódy ako obsahuje () a containsAnyOf (), medzi inými. Pri uplatňovaní na a Mapa, vráti a Mapový objekt ktorý deklaruje metódy ako containsEntry () a containsKey ().

4. Začíname

Ak chcete začať písať tvrdenia, najskôr importujme PravdaVstupné body:

importovať statický com.google.common.truth.Truth. *; importovať statický com.google.common.truth.Truth8. *;

Poďme si teraz napísať jednoduchú triedu, ktorú použijeme v niekoľkých nasledujúcich príkladoch:

verejná trieda Používateľ {private String name = "John Doe"; private List emails = Arrays.asList ("[chránený e-mailom]", "[chránený e-mailom]"); public boolean equals (Object obj) {if (obj == null || getClass ()! = obj.getClass ()) {return false; } User other = (Používateľ) obj; vrátiť Objects.equals (this.name, other.name); } // štandardné konštruktory, getre a setre}

Všimnite si zvyk rovná sa () metóda, v ktorej uvádzame, že dva Používateľ objekty sú si rovné, ak sa volajú.

5. Štandardné výroky Java

V tejto časti uvidíme podrobné príklady toho, ako písať testovacie tvrdenia pre štandardné typy Javy.

5.1. Objekt Tvrdenia

Pravda poskytuje Predmet obal na vykonávanie tvrdení o objektoch. Predmet je tiež rodičom všetkých ostatných wrapperov v knižnici a deklaruje metódy na určenie, či Objekt, v našom prípade a Používateľ, sa rovná inému objektu:

@Test public void whenComparingUsers_thenEqual () {User aUser = new User ("John Doe"); Používateľ anotherUser = nový používateľ („John Doe“); assertThat (aUser) .isEqualTo (anotherUser); }

alebo ak sa rovná danému objektu v zozname:

@ Test public void whenComparingUser_thenInList () {User aUser = new User (); assertThat (aUser) .isIn (Arrays.asList (1, 3, aUser, null)); }

alebo ak nie je:

@Test public void whenComparingUser_thenNotInList () {// ... assertThat (aUser) .isNotIn (Arrays.asList (1, 3, "Three")); }

ak je neplatné alebo nie:

@ Test public void whenComparingUser_thenIsNull () {Používateľ aUser = null; assertThat (aUser) .isNull (); } @Test public void whenComparingUser_thenNotNull () {User aUser = new User (); assertThat (aUser) .isNotNull (); }

alebo ak ide o inštanciu konkrétnej triedy:

@ Test public void whenComparingUser_thenInstanceOf () {// ... assertThat (aUser) .isInstanceOf (User.class); }

V dokumente existujú ďalšie metódy tvrdenia Predmet trieda. Všetky tieto informácie nájdete v dokumente Predmet dokumentácia.

V nasledujúcich častiach zameriame sa na najrelevantnejšie metódy pre každý konkrétny typPravda podporuje. Majte však na pamäti, že všetky metódy v Predmet triedy možno tiež použiť.

5.2. Celé číslo, Plavák, a Dvojitý Tvrdenia

Celé číslo, Plavák, a Dvojitý prípady možno porovnávať s rovnosťou:

@Test public void whenComparingInteger_thenEqual () {int anInt = 10; assertThat (anInt) .isEqualTo (10); }

ak sú väčšie:

@Test public void whenComparingFloat_thenIsBigger () {float aFloat = 10.0f; assertThat (aFloat) .isGreaterThan (1.0f); }

alebo menšie:

@Test public void whenComparingDouble_thenIsSmaller () {double aDouble = 10.0f; assertThat (aDouble) .isLessThan (20.0); }

Ďalej, Plavák a Dvojitý inštancie možno tiež skontrolovať, či sú v očakávanej presnosti alebo nie:

@Test public void whenComparingDouble_thenWithinPrecision () {double aDouble = 22,18; tvrdiťTo (aDouble) .je vnútri (2). z (23d); } @Test public void whenComparingFloat_thenNotWithinPrecision () {float aFloat = 23.04f; tvrdiťTo (aFloat) .isNotWithin (1.3f) .of (100f); }

5.3. BigDecimal Tvrdenia

Okrem bežných tvrdení možno tento typ porovnávať s ignorovaním jeho rozsahu:

@Test public void whenComparingBigDecimal_thenEqualIgnoringScale () {BigDecimal aBigDecimal = BigDecimal.valueOf (1000, 3); assertThat (aBigDecimal) .isEqualToIgnoringScale (nový BigDecimal (1.0)); }

5.4. Boolovský Tvrdenia

Poskytujú sa iba dve príslušné metódy, je pravda() a isFalse ():

@Test public void whenCheckingBoolean_thenTrue () {boolean aBoolean = true; assertThat (aBoolean) .isTrue (); }

5.5. String Tvrdenia

Môžeme vyskúšať, či a String začína konkrétnym textom:

@Test public void whenCheckingString_thenStartsWith () {String aString = "Toto je reťazec"; assertThat (aString) .startsWith ("Toto"); }

Okrem toho môžeme skontrolovať, či reťazec obsahuje daný reťazec, či končí očakávanou hodnotou alebo či je prázdny. Testovacie prípady pre tieto a ďalšie metódy sú k dispozícii v zdrojovom kóde.

5.6. Tvrdenia poľa

Môžeme to skontrolovať Poles zistiť, či sa rovnajú iným poľám:

@Test public void whenComparingArrays_thenEqual () {String [] firstArrayOfStrings = {"one", "two", "three"}; Reťazec [] secondArrayOfStrings = {"one", "two", "three"}; assertThat (firstArrayOfStrings) .isEqualTo (secondArrayOfStrings); }

alebo ak sú prázdne:

@Test public void whenCheckingArray_thenEmpty () {Object [] anArray = {}; assertThat (anArray) .isEmpty (); }

5.7. Porovnateľné Tvrdenia

Okrem testovania, či a Porovnateľné je väčšia alebo menšia ako iná inštancia, môžeme skontrolovať, či majú aspoň zadanú hodnotu:

@Test public void whenCheckingComparable_thenAtLeast () {Comparable aComparable = 5; assertThat (aComparable) .isAtLeast (1); }

Môžeme tiež otestovať, či sú v konkrétnom rozmedzí:

@Test public void whenCheckingComparable_thenInRange () {// ... assertThat (aComparable) .isIn (Range.closed (1, 10)); }

alebo v konkrétnom zozname:

@Test public void whenCheckingComparable_thenInList () {// ... assertThat (aComparable) .isIn (Arrays.asList (4, 5, 6)); }

Môžeme tiež vyskúšať, či sú dve Porovnateľné inštancie sú ekvivalentné podľa triedy porovnať s() metóda.

Najprv si upravme našu Používateľ triedy na implementáciu Porovnateľné rozhranie:

verejná trieda Používateľské náradie Porovnateľné {// ... public int compareTo (Používateľ o) {return this.getName (). compareToIgnoreCase (o.getName ()); }}

Teraz tvrdíme, že dvaja používatelia s rovnakým menom sú rovnocenní:

@Test public void whenComparingUsers_thenEquivalent () {User aUser = new User (); aUser.setName ("John Doe"); User anotherUser = new User (); anotherUser.setName ("john doe"); assertThat (aUser) .isEquivalentAccordingToCompareTo (anotherUser); }

5.8. Iterable Tvrdenia

Okrem tvrdenia o veľkosti Iterable napríklad či je prázdny alebo nemá duplikáty, najbežnejšie tvrdenia o Iterable sú, že obsahuje nejaký prvok:

@Test public void whenCheckingIterable_thenContains () {List aList = Arrays.asList (4, 5, 6); assertThat (aList) .obsahuje (5); }

že obsahuje akýkoľvek prvok iného Iterable:

@Test public void whenCheckingIterable_thenContainsAnyInList () {List aList = Arrays.asList (1, 2, 3); assertThat (aList) .containsAnyIn (Arrays.asList (1, 5, 10)); }

a že predmet má rovnaké prvky, v rovnakom poradí, ako ďalšie:

@Test public void whenCheckingIterable_thenContainsExactElements () {List aList = Arrays.asList ("10", "20", "30"); Zoznam anotherList = Arrays.asList ("10", "20", "30"); assertThat (aList) .containsExactlyElementsIn (anotherList) .inOrder (); }

a ak je objednaný pomocou vlastného komparátora:

@Test public void givenComparator_whenCheckingIterable_thenOrdered () {Comparator aComparator = (a, b) -> new Float (a) .compareTo (new Float (b)); Zoznam aList = Arrays.asList ("1", "012", "0020", "100"); assertThat (aList) .isOrdered (aComparator); }

5.9. Mapa Tvrdenia

Okrem toho, že tvrdí, že a Mapa inštancia je prázdna alebo nie, alebo má konkrétnu veľkosť; môžeme skontrolovať, či má konkrétny záznam:

@Test public void whenCheckingMap_thenContainsEntry () {Map aMap = new HashMap (); aMap.put ("jedna", 1L); assertThat (aMap) .containsEntry ("one", 1L); }

ak má konkrétny kľúč:

@Test public void whenCheckingMap_thenContainsKey () {// ... assertThat (mapa) .containsKey ("one"); }

alebo ak má rovnaké záznamy ako iné Mapa:

@Test public void whenCheckingMap_thenContainsEntries () {Map aMap = new HashMap (); aMap.put ("prvý", 1L); aMap.put ("druhý", 2,0); aMap.put ("tretí", 3f); Map anotherMap = new HashMap (aMap); assertThat (aMap) .containsExactlyEntriesIn (anotherMap); }

5.10. Výnimka Tvrdenia

Stanovené sú iba dve dôležité metódy Výnimka predmety.

Môžeme napísať tvrdenia zamerané na príčinu výnimky:

@Test public void whenCheckingException_thenInstanceOf () {Exception anException = new IllegalArgumentException (new NumberFormatException ()); assertThat (anException) .hasCauseThat () .isInstanceOf (NumberFormatException.class); }

alebo na jeho správu:

@ Test public void whenCheckingException_thenCauseMessageIsKnown () {Exception anException = new IllegalArgumentException ("Bad value"); assertThat (anException) .hasMessageThat () .startsWith ("Zlý"); }

5.11. Trieda Tvrdenia

Existuje iba jedna dôležitá metóda Trieda tvrdenia, pomocou ktorých môžeme testovať, či je trieda priraditeľná inej:

@Test public void whenCheckingClass_thenIsAssignable () {Class aClass = Double.class; assertThat (aClass) .isAssignableTo (Number.class); }

6. Java 8 tvrdenia

Voliteľné a Prúd sú jediné dva typy Java 8, ktoré Pravda podporuje.

6.1. Voliteľné Tvrdenia

Existujú tri dôležité metódy na overenie Voliteľné.

Môžeme vyskúšať, či má konkrétnu hodnotu:

@Test public void whenCheckingJavaOptional_thenHasValue () {Optional anOptional = Optional.of (1); assertThat (anOptional) .hasValue (1); }

ak je hodnota k dispozícii:

@Test public void whenCheckingJavaOptional_thenPresent () {Optional anOptional = Optional.of ("Baeldung"); assertThat (anOptional) .isPresent (); }

alebo ak hodnota nie je k dispozícii:

@Test public void whenCheckingJavaOptional_thenEmpty () {Optional anOptional = Optional.empty (); assertThat (anOptional) .isEmpty (); }

6.2. Prúd Tvrdenia

Tvrdenia pre a Prúd sú veľmi podobné tým pre Iterable.

Môžeme napríklad otestovať, či je konkrétny Prúd obsahuje všetky objekty súboru Iterable v rovnakom poradí:

@Test public void whenCheckingStream_thenContainsInOrder () {Stream anStream = Stream.of (1, 2, 3); assertThat (anStream) .containsAllOf (1, 2, 3) .inOrder (); }

Ďalšie príklady nájdete v dokumente Iterable Časť Tvrdenia.

7. Guava tvrdenia

V tejto časti uvidíme príklady tvrdení pre podporované typy Guava v Pravda.

7.1. Voliteľné Tvrdenia

Pre Guavu existujú aj tri dôležité metódy tvrdenia Voliteľné. The hasValue () a je prítomný() metódy sa správajú presne ako v prostredí Java 8 Voliteľné.

Ale namiesto toho je prázdny() tvrdiť, že an Voliteľné nie je prítomný, používame isAbsent ():

@Test public void whenCheckingGuavaOptional_thenIsAbsent () {Optional anOptional = Optional.absent (); assertThat (anOptional) .isAbsent (); }

7.2. Multimap Tvrdenia

Multimap a štandardné Mapa tvrdenia sú si veľmi podobné.

Jeden pozoruhodný rozdiel je v tom, že môžeme získať viac hodnôt kľúča v rámci a Multimap a presadzovať tieto hodnoty.

Tu je príklad, ktorý testuje, či majú hodnoty kľúča „jedna“ veľkosť dve:

@Test public void whenCheckingGuavaMultimap_thenExpectedSize () {Multimap aMultimap = ArrayListMultimap.create (); aMultimap.put ("jedna", 1L); aMultimap.put ("jedna", 2.0); assertThat (aMultimap) .valuesForKey ("one") .hasSize (2); }

Ďalšie príklady nájdete v dokumente Mapa Časť Tvrdenia.

7.3. Multiset Tvrdenia

Tvrdenia pre Multiset objekty zahŕňajú tie pre Iterable a jednu ďalšiu metódu na overenie, či má kľúč konkrétny počet výskytov:

@Test public void whenCheckingGuavaMultiset_thenExpectedCount () {TreeMultiset aMultiset = TreeMultiset.create (); aMultiset.add ("baeldung", 10); assertThat (aMultiset) .hasCount ("baeldung", 10); }

7.4. Tabuľka Tvrdenia

Okrem kontroly jeho veľkosti alebo prázdneho miesta môžeme skontrolovať a Tabuľka na overenie, či obsahuje konkrétne mapovanie pre daný riadok a stĺpec:

@Test public void whenCheckingGuavaTable_thenContains () {Table aTable = TreeBasedTable.create (); aTable.put ("firstRow", "firstColumn", "baeldung"); assertThat (aTable) .contains ("firstRow", "firstColumn"); }

alebo ak obsahuje konkrétnu bunku:

@Test public void whenCheckingGuavaTable_thenContainsCell () {Table aTable = getDummyGuavaTable (); assertThat (aTable) .containsCell ("firstRow", "firstColumn", "baeldung"); }

Ďalej môžeme skontrolovať, či obsahuje daný riadok, stĺpec alebo hodnotu. Príslušné testovacie prípady nájdete v zdrojovom kóde.

8. Vlastné chybové správy a štítky

Ak tvrdenie zlyhá, Pravda zobrazuje veľmi čitateľné správy označujúce presne to, čo sa pokazilo. Niekedy je však potrebné k týmto správam pridať ďalšie informácie, aby ste poskytli viac podrobností o tom, čo sa stalo.

Pravda umožňuje nám prispôsobiť tieto správy o zlyhaní:

@Test public void whenFailingAssertion_thenCustomMessage () {assertWithMessage ("TEST-985: Tajný používateľský predmet nebol Null!") .That (new User ()) .isNull (); }

Po vykonaní testu dostaneme nasledujúci výstup:

TEST-985: Subjekt tajného používateľa NIE JE neplatný !: Nie je pravda, že <[e-mail chránený]> má hodnotu Null

Môžeme tiež pridať vlastný štítok, ktorý sa zobrazí pred našim subjektom v chybových správach. To sa môže hodiť, keď objekt nemá užitočné znázornenie reťazca:

@Test public void whenFailingAssertion_thenMessagePrefix () {User aUser = new User (); assertThat (aUser) .named ("User [% s]", aUser.getName ()) .isNull (); }

Ak spustíme test, môžeme vidieť nasledujúci výstup:

Nie je pravda, že používateľ [John Doe] (<[chránený e-mailom]>) je neplatný

9. Rozšírenia

Predĺženie Pravda znamená, že môžeme pridať podporu pre vlastné typy. Aby sme to dosiahli, musíme vytvoriť triedu, ktorá:

  • rozširuje Predmet triedy alebo jednej z jej podtried
  • definuje konštruktor, ktorý akceptuje dva argumenty - a FailureStrategy a inštancia nášho vlastného typu
  • vyhlasuje pole PredmetFactory typ, ktorý Pravda použije na vytvorenie inštancií nášho vlastného predmetu
  • implementuje statickú tvrdiťTo () metóda, ktorá akceptuje náš vlastný typ
  • vystavuje naše testovacie API

Teraz, keď vieme, ako to predĺžiť Pravda, vytvorme triedu, ktorá pridá podporu pre objekty typu Používateľ:

verejná trieda UserSubject rozširuje ComparableSubject {súkromný UserSubject (FailureStrategy failureStrategy, cieľ používateľa) {super (failureStrategy, cieľ); } private static final SubjectFactory USER_SUBJECT_FACTORY = new SubjectFactory () {public UserSubject getSubject (FailureStrategy failureStrategy, User target) {return new UserSubject (failureStrategy, target); }}; public static UserSubject assertThat (User user) {return Truth.assertAbout (USER_SUBJECT_FACTORY) .that (užívateľ); } public void hasName (názov reťazca) {if (! actual (). getName (). equals (name)) {fail ("has name", name); }} public void hasNameIgnoringCase (názov reťazca) {if (! actual (). getName (). equalsIgnoreCase (name)) {fail ("má meno ignorujúce veľkosť písmen", meno); }} public IterableSubject emails () {return Truth.assertThat (actual (). getEmails ()); }}

Teraz môžeme staticky importovať tvrdiťTo () metódou nášho vlastného predmetu a napíš niekoľko testov:

@Test public void whenCheckingUser_thenHasName () {User aUser = new User (); assertThat (aUser) .hasName ("John Doe"); } @Test public void whenCheckingUser_thenHasNameIgnoringCase () {// ... assertThat (aUser) .hasNameIgnoringCase ("john doe"); } @Test public void givenUser_whenCheckingEmails_thenExectedSize () {// ... assertThat (aUser) .emails () .hasSize (2); }

10. Záver

V tomto tutoriáli sme preskúmali možnosti Pravda nám umožňuje písať čitateľnejšie testy a správy o zlyhaní.

Predviedli sme najobľúbenejšie metódy tvrdenia pre podporované typy Java a Guava, prispôsobené správy o zlyhaní a rozšírené Pravda s vlastnými predmetmi.

Kompletný zdrojový kód tohto článku nájdete ako vždy na serveri Github.


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