Testiranje s Google Istinom

1. Pregled

Istina je tečan i fleksibilan okvir za testiranje otvorenog koda dizajniran da učini tvrdnje i poruke o neuspjehu čitljivijima.

U ovom ćemo članku istražiti ključne značajke Istina okvir i implementirati primjere kako bi prikazali njegove mogućnosti.

2. Ovisnosti Mavena

Prvo, moramo dodati istina i istina-java8-produžetak našem pom.xml:

 com.google.truth istina 0.32 test com.google.truth.extensionsuth-java8-proširenje 0.32 

Najnovije verzije istine iuth-java8-extension možete pronaći na Maven Central.

3. Uvod

Istina omogućuje nam pisanje čitljivih tvrdnji i poruka o neuspjehu za razne klase:

  • Standardna Java - primitivi, nizovi, nizovi, objekti, zbirke, dodaci, klase itd.
  • Java 8Neobvezno i Stream instance
  • GuavaNeobvezno, Multimap, Multiset, i Stol predmeta
  • Prilagođene vrste - proširivanjem Predmet razreda, kao što ćemo vidjeti kasnije

Kroz Istina i Istina8 klase, knjižnica nudi korisne metode za pisanje tvrdnji koje rade na a predmet, to je vrijednost ili objekt koji se testira.

Jednom kad je subjekt poznat, Istina može u vrijeme sastavljanja rasuđivati ​​o tome koji su prijedlozi poznati za tu temu. To mu omogućuje vraćanje omota oko naše vrijednosti koji deklariraju metode prijedloga specifične za taj određeni predmet.

Na primjer, kada potvrđujete na popisu, Istina vraća an IterableSubject instanca koja definira metode poput sadrži () i containsAnyOf (), između ostalih. Kada se tvrdi na a Karta, vraća a MapSubject koja deklarira metode poput sadržiEntry () i containsKey ().

4. Početak rada

Da započnemo pisati tvrdnje, prvo uvezimo IstinaTočke ulaska:

uvezi statički com.google.common.truth.Truth. *; uvezi statički com.google.common.truth.Truth8. *;

Napišimo sada jednostavnu klasu koju ćemo koristiti u nekoliko primjera koji slijede:

korisnik javne klase {private String name = "John Doe"; privatni popis e-adresa = Arrays.asList ("[e-pošta zaštićena]", "[e-pošta zaštićena]"); javna logička vrijednost jednako (Objekt obj) {if (obj == null || getClass ()! = obj.getClass ()) {return false; } Korisnik ostalo = (Korisnik) obj; vratiti Objects.equals (this.name, other.name); } // standardni konstruktori, getteri i postavljači}

Primijetite običaj jednako () metoda, u kojoj navodimo da dvije Korisnik predmeti su jednaki ako su im imena.

5. Standardne Java tvrdnje

U ovom ćemo odjeljku vidjeti detaljne primjere kako napisati testne tvrdnje za standardne tipove Java.

5.1. Objekt Tvrdnje

Istina pruža Predmet omot za izvođenje tvrdnji na objektima. Predmet je također roditelj svih ostalih omota u knjižnici i deklarira metode za utvrđivanje je li Objekt, u našem slučaju a Korisnik, jednak je drugom objektu:

@Test public void whenComparingUsers_thenEqual () {User aUser = novi korisnik ("John Doe"); Korisnik anotherUser = novi korisnik ("John Doe"); assertThat (aUser) .isEqualTo (anotherUser); }

ili ako je jednak zadanom objektu na popisu:

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

ili ako nije:

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

ako je null ili ne:

@Test public void whenComparingUser_thenIsNull () {Korisnik aUser = null; assertThat (aUser) .isNull (); } @Test public void whenComparingUser_thenNotNull () {User aUser = new User (); assertThat (aUser) .isNotNull (); }

ili ako je to instanca određene klase:

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

Postoje i druge metode tvrđenja u Predmet razred. Da biste ih sve otkrili, pogledajte Predmet dokumentacija.

U sljedećim odjeljcima, usredotočit ćemo se na najrelevantnije metode za svaku pojedinu vrstuIstina podupire. Međutim, imajte na umu da sve metode u Predmet klasa se također može primijeniti.

5.2. Cijeli broj, Plutati, i Dvostruko Tvrdnje

Cijeli broj, Plutati, i Dvostruko primjeri se mogu usporediti radi jednakosti:

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

ako su veće:

@Test javna praznina kadaComparingFloat_thenIsBigger () {float aFloat = 10.0f; assertThat (aFloat) .isGreaterThan (1.0f); }

ili manje:

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

Nadalje, Plutati i Dvostruko primjerci se također mogu provjeriti jesu li unutar očekivane preciznosti ili ne:

@Test javna void kadaComparingDouble_thenWithinPrecision () {double aDouble = 22,18; tvrdeTo (aDvostruko) .isWithin (2) .of (23d); } @Test public void whenComparingFloat_thenNotWithinPrecision () {float aFloat = 23.04f; tvrde da (aFloat) .isNije u (1.3f) .of (100f); }

5.3. BigDecimal Tvrdnje

Uz uobičajene tvrdnje, ovaj se tip može usporediti zanemarujući njegovu mjerilu:

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

5.4. Booleova Tvrdnje

Navedene su samo dvije relevantne metode, je istina() i isFalse ():

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

5.5. Niz Tvrdnje

Možemo provjeriti je li a Niz započinje određenim tekstom:

@Test public void whenCheckingString_thenStartsWith () {String aString = "Ovo je niz"; assertThat (aString) .startsWith ("Ovo"); }

Osim toga, možemo provjeriti sadrži li niz zadani niz, završava li očekivanom vrijednošću ili je li prazan. Ispitni slučajevi za ove i druge metode dostupni su u izvornom kodu.

5.6. Tvrdnje niza

Možemo provjeriti Poljes da vidimo jesu li jednaki ostalim nizovima:

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

ili ako su prazni:

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

5.7. Usporedive Tvrdnje

Osim ispitivanja je li a Usporedive je veći ili manji od drugog primjerka, možemo provjeriti jesu li barem zadane vrijednosti:

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

Također, možemo testirati nalaze li se oni unutar određenog raspona:

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

ili na određenom popisu:

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

Također možemo testirati jesu li dva Usporedive primjerci su ekvivalentni prema razredu compareTo () metoda.

Prvo, izmijenimo naš Korisnik razred za provedbu Usporedive sučelje:

javna klasa Korisnik implementira Usporedivo {// ... public int compareTo (User o) {return this.getName (). compareToIgnoreCase (o.getName ()); }}

Hajde sada da ustvrdimo da su dva korisnika s istim imenom ekvivalentna:

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

5.8. Iterativ Tvrdnje

Uz utvrđivanje veličine Iterativ primjerice, bez obzira je li prazan ili nema duplikata, najtipičnije su tvrdnje na Iterativ jesu li da sadrži neki element:

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

da sadrži bilo koji element drugog Iterativ:

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

i da subjekt ima iste elemente, istim redoslijedom, kao i drugi:

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

a ako je naručeno pomoću prilagođene usporedbe:

@Test javna praznina givenComparator_whenCheckingIterable_thenOrdered () {Usporeditelj aComparator = (a, b) -> novi Float (a) .compareTo (novi Float (b)); Popis aList = Arrays.asList ("1", "012", "0020", "100"); assertThat (aList) .isOrdered (aComparator); }

5.9. Karta Tvrdnje

Uz tvrdnju da a Karta instanca je prazna ili nije ili ima određenu veličinu; možemo provjeriti ima li određeni unos:

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

ako ima određeni ključ:

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

ili ako ima iste unose kao i drugi Karta:

@Test public void whenCheckingMap_thenContainsEntries () {Map aMap = new HashMap (); aMap.put ("prvi", 1L); aMap.put ("drugi", 2.0); aMap.put ("treći", 3f); Mapiraj druguMap = nova HashMap (aMap); assertThat (aMap) .containsExactlyEntriesIn (anotherMap); }

5.10. Iznimka Tvrdnje

Predviđene su samo dvije važne metode Iznimka predmeta.

Možemo napisati tvrdnje upućene uzroku iznimke:

@Test javna praznina whenCheckingException_thenInstanceOf () {Iznimka anException = novo IllegalArgumentException (novo NumberFormatException ()); assertThat (anException) .hasCauseThat () .isInstanceOf (NumberFormatException.class); }

ili na njegovu poruku:

@Test public void whenCheckingException_thenCauseMessageIsKnown () {Iznimka anException = novo IllegalArgumentException ("Loša vrijednost"); assertThat (anException) .hasMessageThat () .startsWith ("Loše"); }

5.11. Razred Tvrdnje

Postoji samo jedna važna metoda za Razred tvrdnje pomoću kojih možemo testirati može li se neka klasa dodijeliti drugoj:

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

6. Java 8 tvrdnje

Neobvezno i Stream su jedine dvije vrste Java 8 koje Istina podupire.

6.1. Neobvezno Tvrdnje

Postoje tri važne metode za provjeru Neobvezno.

Možemo testirati ima li određenu vrijednost:

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

ako je vrijednost prisutna:

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

ili ako vrijednost nije prisutna:

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

6.2. Stream Tvrdnje

Tvrdnje za a Stream su vrlo slični onima za an Iterativ.

Na primjer, možemo testirati je li određena Stream sadrži sve predmete datoteke Iterativ istim redoslijedom:

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

Dodatne primjere potražite u Iterativ Odjeljak o tvrdnjama.

7. Tvrdnje Guave

U ovom ćemo odjeljku vidjeti primjere tvrdnji za podržane vrste Guava u Istina.

7.1. Neobvezno Tvrdnje

Postoje i tri važne metode tvrđenja za Guavu Neobvezno. The hasValue () i je prisutan() metode ponašaju se točno kao kod Jave 8 Neobvezno.

Ali umjesto prazno je() tvrditi da an Neobvezno nije prisutan, koristimo isAbsent ():

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

7.2. Multimap Tvrdnje

Multimap i standardni Karta tvrdnje su vrlo slične.

Jedna je značajna razlika u tome što možemo dobiti višestruke vrijednosti ključa unutar a Multimap i iznijeti tvrdnje o tim vrijednostima.

Evo primjera koji provjerava jesu li vrijednosti tipke "jedan" dvije:

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

Dodatne primjere potražite u Karta Odjeljak o tvrdnjama.

7.3. Multiset Tvrdnje

Tvrdnje za Multiset predmeti uključuju one za Iterativ i jedna dodatna metoda za provjeru ima li ključ određeni broj pojavljivanja:

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

7.4. Stol Tvrdnje

Osim što možemo provjeriti njegovu veličinu ili gdje je prazna, možemo provjeriti i Stol kako bismo provjerili sadrži li određeno mapiranje za zadani redak i stupac:

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

ili ako sadrži određenu ćeliju:

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

Nadalje, možemo provjeriti sadrži li zadani redak, stupac ili vrijednost. Pogledajte izvorni kod za relevantne test slučajeve.

8. Prilagođene poruke o kvaru i oznake

Kada tvrdnja zakaže, Istina prikazuje vrlo čitljive poruke koje točno označavaju što je pošlo po zlu. Međutim, ponekad je potrebno tim porukama dodati više podataka kako biste pružili više detalja o tome što se dogodilo.

Istina omogućuje nam prilagodbu tih poruka o neuspjehu:

@Test public void whenFailingAssertion_thenCustomMessage () {assertWithMessage ("TEST-985: Tajni korisnik nije bio NULL!"). That (new User ()) .isNull (); }

Nakon pokretanja testa dobivamo sljedeći izlaz:

TEST-985: Tajni korisnički predmet NIJE bio null !: Nije točno da je <[email protected]> null

Također, možemo dodati prilagođenu oznaku koja će se prikazati prije našeg predmeta u porukama pogreške. Ovo može dobro doći kada objekt nema korisnu reprezentaciju niza:

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

Ako pokrenemo test, možemo vidjeti sljedeći izlaz:

Nije točno da je korisnik [John Doe] (<[e-pošta zaštićena]>) ništavan

9. Proširenja

Proširivanje Istina znači da možemo dodati podršku za prilagođene vrste. Da bismo to učinili, moramo stvoriti klasu koja:

  • proširuje Predmet razred ili jedan od njegovih podrazreda
  • definira konstruktor koji prihvaća dva argumenta - a FailureStrategy i primjerak našeg prilagođenog tipa
  • proglašava polje SubjectFactory tip, koji Istina koristit će za stvaranje primjeraka naše prilagođene teme
  • provodi statički potvrditi da () metoda koja prihvaća naš prilagođeni tip
  • izlaže naš API za tvrdnju o tvrdnji

Sad kad znamo kako produžiti Istina, stvorimo klasu koja dodaje podršku za objekte tipa Korisnik:

javna klasa UserSubject proširuje ComparableSubject {private UserSubject (FailureStrategy failureStrategy, User target) {super (failureStrategy, target); } privatni statički konačni SubjectFactory USER_SUBJECT_FACTORY = new SubjectFactory () {public UserSubject getSubject (FailureStrategy failureStrategy, User target) {return new UserSubject (failureStrategy, target); }}; javni statični UserSubject assertThat (Korisnik korisnik) {return Truth.assertAbout (USER_SUBJECT_FACTORY) .that (korisnik); } javna praznina hasName (ime niza) {if (! stvarna (). getName (). jednako (ime)) {fail ("ima ime", ime); }} javna praznina hasNameIgnoringCase (ime niza) {if (! actual (). getName (). equalsIgnoreCase (name)) {fail ("ima ime zanemarujući slučaj", ime); }} javne e-adrese IterableSubject () {return Truth.assertThat (actual (). getEmails ()); }}

Sada možemo statički uvesti datoteku potvrditi da () metode našeg prilagođenog predmeta i napišite nekoliko testova:

@Test public void whenCheckingUser_thenHasName () {User aUser = novi korisnik (); assertThat (aUser) .hasName ("John Doe"); } @Test public void whenCheckingUser_thenHasNameIgnoringCase () {// ... assertThat (aUser) .hasNameIgnoringCase ("john doe"); } @Test javna praznina givenUser_whenCheckingEmails_thenExpectedSize () {// ... assertThat (aUser) .emails () .hasSize (2); }

10. Zaključak

U ovom uputstvu istražili smo mogućnosti Istina daje nam da napišemo čitljivije testove i poruke o neuspjehu.

Prikazali smo najpopularnije metode tvrđenja za podržane tipove Java i Guava, prilagođene poruke o neuspjehu i proširene Istina s prilagođenim predmetima.

Kao i uvijek, cjeloviti izvorni kod za ovaj članak nalazi se na Githubu.


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