Spletni java test vstopne ravni. Testiranje programa, JUnit. Predpogoji za preizkus Java

Verjamem, da je razvoj programske opreme več kot le služba. Vidim se kot obrtnika, ki skuša biti vsak dan boljši. "Najlažji" način za to je, da poiščete nekaj dobrih orodij in odgovorite na naslednja vprašanja:

  • Kdaj naj uporabim orodje X?
  • Kako naj uporabljam orodje X?

Avtomatizirano testiranje je zelo pomemben del razvoja programske opreme, vendar je na blogih programerjev malo objav o uporabljenih orodjih. Ta isti članek vam bo omogočil pogled v mojo "škatlo z orodjem". Pokril bom 12 knjižnic in ogrodij, ki jih uporabljam za pisanje testov enot in integracijskih testov, ter zagotovil povezave do strani, ki vam bodo pomagale razumeti, kako jih uporabljati.

Poglejmo v mojo orodjarno

Preden lahko uporabite spodaj opisana orodja, morate nastaviti gradnjo, ki samodejno izvaja integracijske in enotne teste. Na to temo imam 2 opombi:

  • Integracijsko testiranje z Mavenom opisuje, kako lahko nastavimo gradnjo Maven z integracijo in testi enot v različnih imenikih.
  • Uvod v Gradle: integracijsko testiranje z vtičnikom TestSets pokriva enako za Gradle.

Zdaj ste pripravljeni, da si podrobneje ogledate moja orodja. Razdelil sem jih v kategorije, da vam olajšam navigacijo.

Torej, tukaj je 12 orodij, ki jih uporabljam za integracijo in testiranje enot.

Izvajanje testov

AssertJ ponuja prilagodljiv API za pisanje trditev z uporabnimi sporočili o napakah, izboljša berljivost testne kode in vam omogoča, da preizkuse spremenite v izvršljive specifikacije, ki se držijo želenega domensko specifičnega jezika.

Dodatno:

  • Uporaba Hamcresta pri testiranju pokriva, kako uporabljati Hamcrest za pisanje testov in kako razširiti njegove zmogljivosti z moduli po meri.
  • Pretvorba trditev v domensko specifičen jezik pojasnjuje, kako ustvariti trditve po meri v AssertJ.
  • Pisanje čistih testov: Zamenjava trditev z jezikom, specifičnim za domeno. Pojasnjuje, zakaj bi morali zamenjati standardne trditve JUnit z lastnimi, ki uporabljajo ustrezen domensko specifičen jezik.

Testiranje kode za dostop do podatkov

Hitra zbirka podatkov, uporabna za pisanje integracijskih testov, ki se izvajajo lokalni stroj razvijalec.

Razširitev za JUnit, ki jo je mogoče uporabiti za inicializacijo baze podatkov v znano stanje pred izvajanjem vsakega integracijskega testa in zapolnitev baze podatkov s potrebnimi podatki. DbUnit ima svoje pomanjkljivosti, vendar je zelo uporabno orodje, ki omogoča ločevanje testnih podatkov in testne kode.

Dodatno:

  • opisuje ključne komponente DbUnit, ki jih morate poznati za pisanje testov z uporabo DbUnit.
  • ponuja pet pravil za pisanje najboljših testov za kodo za dostop do podatkov.

Med iskanjem testnih nalog za Java programerje sem naletel na zanimivo stran (uporabniki Avasta naj ne gredo, zaznan je skriptni trojanec, drugi so očitno v redu) - http://www.betterprogrammer.com. Na najpreprostejši način preverja kvalifikacije Java programerjev, vendar na avtomatski način: ponuja pisanje več funkcij (metod) vse večje kompleksnosti in kopiranje kode v TextArea. Nato motor spletnega mesta naredi nekaj z nalogami (nič manj kot enotni test), izračuna določen indeks kvalifikacij na podlagi merila "hitrost-kakovost" in poda končno oceno v naslednji obliki:

Nato se začnejo vprašanja. Sam sem že drugič v življenju programiral v Javi (in sem zato preprosto preskočil zapletene naloge), tako da 82 % na tem testu ustreza ravni ne-java programer. Koliko bi torej morali zaposliti Java Junior, Java Programmer, še bolj pa Java Senior?! Kakšen rezultat lahko pričakujete od prisoten java programer - 90, 95, 99? In za konec, kaj če "programer" doseže manj kot 82, pa se kljub temu prijavi na kakšno delovno mesto?!

Testiranje ni vedno zabavno in zanimivo. Ta proces je običajno precej dolgotrajen in včasih poln monotonega dela. Zdi se, da so šele pred kratkim programerji uporabljali standardni izhod ali razhroščevalnik za testiranje razredov Java.

V tem članku bom opisal knjižnico JUnit 4, ki močno poenostavi in ​​avtomatizira proces pisanja testov.

Da bi prikazali glavne zmožnosti ogrodja JUnit, napišimo primitivni razred v Javi in ​​se mu posmehujmo. Ta razred bo imel dve metodi - iskanje faktoriala nenegativnega števila in vsoto dveh števil. Poleg tega bo primerek razreda vseboval števec klicev metode.

Javni razred MathFunc ( int klici; javni int getCalls() ( povratni klici; ) javni dolgi faktorial(int število) ( klici++; if (število 1) ( for (int i = 1; i

Zdaj pa napišimo teste enot. Da bi to naredili, bomo ustvarili razred s številnimi testnimi metodami. Seveda lahko razred vsebuje tudi običajne pomožne metode. Da lahko preizkusni izvajalec ugotovi, kdo je kdo, morajo biti testne metode označene z @Test.

Opomba ima lahko naslednje parametre:

  • pričakovano - navedite, katero izjemo bo generirala metoda (glejte primer spodaj);
  • časovna omejitev - po kolikšnem času v milisekundah se bo test prenehal izvajati in bo štel kot neuspešen.

Če želite označiti, da je treba določen test preskočiti, ga označite s pripisom @Ignore. Čeprav lahko opombo @Test preprosto odstranite.

Včasih boste morda potrebovali nekaj konteksta, kot so vnaprej ustvarjeni primerki razreda, za izvajanje vsakega testnega primera. In po izvedbi morate sprostiti rezervirane vire. V tem primeru boste potrebovali opombe @Before in @After. Metoda z oznako @Before bo izvedena pred vsakim testnim primerom, metoda z oznako @After pa po vsakem testnem primeru.

Če je treba inicializacijo in sprostitev virov opraviti samo enkrat – oziroma pred in po vseh preizkusih – uporabite par opomb @BeforeClass in @AfterClass.

In tukaj je sam testni razred z več testnimi skripti:

Javni razred MathFuncTest ( zasebni MathFunc math; @Pred javnim void init() ( math = new MathFunc(); ) @Po javnem void tearDown() ( math = null; ) @Test public void calls() ( assertEquals(0, math .getCalls()); math.factorial(1); assertEquals(1, math.getCalls()); math.factorial(1); assertEquals(2, math.getCalls()); ) @Test public void factorial() ( assertTrue(math.factorial(0) == 1); assertTrue(math.factorial(1) == 1); assertTrue(math.factorial(5) == 120); ) @Test(pričakovano = IllegalArgumentException.class) public void factorialNegative() ( math.factorial(-1); ) @Ignore @Test public void todo() ( assertTrue(math.plus(1, 1) == 3); ) )

Metoda klicev testira veljavnost števca klicev. S faktorialno metodo se preverja, ali je faktorial pravilno izračunan za nekatere standardne vrednosti. Metoda factorialNegative preveri, ali bo za negativne faktorske vrednosti vržena izjema IllegalArgumentException. Metoda opravila bo prezrta. Ko eksperimentirate s kodo, poskusite odstraniti opombo @Ignore.

Metoda assertTrue preveri, ali je rezultat izraza resničen. Nekatere druge metode, ki bi lahko prišle prav:

  • assertEquals - pričakovani in prejeti rezultat se ujemata;
  • assertNull - rezultat izraza je nič;
  • assertNotNull - rezultat izraza je drugačen od null;
  • assertSame – pričakovani in prejeti objekt sta isti objekt.
  • fail - metoda generira izjemo AssertionError - dodamo jo tja, kjer izvajanje programa ne bi smelo iti.

V našem sodobni svet IDE lahko najdejo in preprosto izvajajo teste v projektu. Kaj pa, če jih želite zagnati ročno s programsko kodo. Če želite to narediti, lahko uporabite Runner. Obstajajo besedilne različice - junit.textui.TestRunner, grafične različice - junit.swingui.TestRunner, junit.awtui.TestRunner.

Ampak malo več sodobna metoda je uporaba razreda JUnitCore. V razred MathFuncTest dodajte naslednjo glavno metodo:

Javni statični void main(String args) vrže izjemo ( JUnitCore runner = new JUnitCore(); Rezultat rezultata = runner.run(MathFuncTest.class); System.out.println("izvedi teste: " + result.getRunCount()); System.out.println("neuspešni testi: " + result.getFailureCount()); System.out.println("prezrti testi: " + result.getIgnoreCount()); System.out.println("uspeh: " + rezultat .wasSuccessful()); )

In rezultat izvedbe:

Izvedite teste: 3 neuspeli testi: 0 prezrti testi: 1 uspeh: res

V več prejšnje različice Za pisanje testnega razreda JUnit je bilo treba ustvariti potomca junit.framework.TestCase. Nato je bilo treba definirati konstruktor, ki vzame String kot parameter - ime metode - in ga posreduje nadrejenemu razredu. Vsaka testna metoda se je morala začeti s testom predpone. Za inicializacijo in sprostitev virov sta bili uporabljeni metodi setUp in tearDown. Skratka, groza. No, zdaj je vse preprosto, ja.

To je vse za danes. Prepričan sem, da vam bo JUnit Framework zelo pomagal. Komentarji in vprašanja o članku so dobrodošli.




Vrh