Online-java-testi lähtötaso. Ohjelman testaus, JUnit. Java-testin edellytykset

Uskon, että ohjelmistokehitys on enemmän kuin työtä. Näen itseni käsityöläisenä, joka yrittää tulla paremmaksi joka päivä. "Helppoin" tapa tehdä tämä on löytää hyviä työkaluja ja vastata seuraaviin kysymyksiin:

  • Milloin minun tulee käyttää Tool X:ää?
  • Kuinka minun pitäisi käyttää työkalua X?

Automaattinen testaus on erittäin tärkeä osa ohjelmistokehitystä, mutta ohjelmoijien blogeissa on vähän postauksia käytetyistä työkaluista. Tämän saman artikkelin avulla voit tarkastella "työkalulaatikkoani". Käsittelen 12 kirjastoa ja viitekehystä, joita käytän yksikkö- ja integrointitestien kirjoittamiseen, ja tarjoan linkkejä sivuille, jotka auttavat ymmärtämään niiden käyttöä.

Katsotaanpa työkalupakkistani

Ennen kuin voit käyttää alla kuvattuja työkaluja, sinun on määritettävä koontiversio, joka suorittaa automaattisesti integraatio- ja yksikkötestejä. Minulla on 2 huomautusta tästä aiheesta:

  • Integration Testing with Maven kuvaa, kuinka voimme perustaa Maven-koontiversion integraatio- ja yksikkötesteillä eri hakemistoissa.
  • Gradlen käytön aloittaminen: Integraatiotestaus TestSets-laajennuksella kattaa saman Gradlen kanssa.

Nyt olet valmis tutustumaan työkaluihini tarkemmin. Olen jakanut ne luokkiin, jotta sinun on helpompi navigoida.

Joten tässä on 12 työkalua, joita käytän integrointiin ja yksikkötestaukseen.

Testien suorittaminen

AssertJ tarjoaa joustavan sovellusliittymän väitteiden kirjoittamiseen hyödyllisillä virheilmoituksilla, parantaa testikoodin luettavuutta ja antaa sinun muuttaa testit suoritettaviksi määrityksiksi, jotka noudattavat haluttua toimialuekohtaista kieltä.

Lisäksi:

  • Hamcrestin käyttäminen testaamisessa kattaa, kuinka Hamcrestiä käytetään testien kirjoittamiseen, sekä kuinka sen ominaisuuksia voidaan laajentaa mukautetuilla moduuleilla.
  • Väitteiden muuttaminen verkkotunnuskohtaiseksi kieleksi selittää, kuinka voit luoda mukautettuja väitteitä AssertJ:ssä.
  • Puhtaiden testien kirjoittaminen: väitteiden korvaaminen verkkotunnuskohtaisella kielellä. Selittää, miksi meidän pitäisi korvata JUnitin vakioväitteet omillamme, jotka käyttävät oikeaa verkkotunnuskohtaista kieltä.

Tietojen pääsykoodin testaus

Nopea tietokanta, hyödyllinen ajettavien integrointitestien kirjoittamiseen paikallinen kone kehittäjä.

JUnitin laajennus, jota voidaan käyttää tietokannan alustamiseen tunnettuun tilaan ennen jokaisen integrointitestin suorittamista ja tietokantaan täyttämiseen tarvittavilla tiedoilla. DbUnitilla on haittoja, mutta se on erittäin hyödyllinen työkalu, jonka avulla voit erottaa testitiedot ja testikoodin.

Lisäksi:

  • kuvailee DbUnitin avainkomponentit, jotka sinun on tiedettävä voidaksesi kirjoittaa testejä DbUnitilla.
  • tarjoaa viisi sääntöä tietojen pääsykoodin parhaiden testien kirjoittamiseen.

Etsiessäni testitehtäviä Java-ohjelmoijille, törmäsin mielenkiintoiseen sivustoon (Avast-käyttäjien ei pitäisi mennä, skriptitroijalainen havaitaan, muut ovat ilmeisesti kunnossa) - http://www.betterprogrammer.com. Se testaa Java-ohjelmoijien pätevyyden yksinkertaisimmalla tavalla, mutta automaattisella tavalla: tarjoaa useiden monimutkaisempien funktioiden (menetelmien) kirjoittamisen ja koodin kopioimisen TextAreaan. Seuraavaksi sivustomoottori tekee jotain tehtävien kanssa (vähintään yksikkötestin), laskee tietyn kelpoisuusindeksin "nopeus-laatu"-kriteerien perusteella ja antaa lopullisen pistemäärän seuraavassa muodossa:

Sitten alkavat kysymykset. Itse ohjelmoin Javalla toisen kerran elämässäni (ja siksi yksinkertaisesti ohitin monimutkaisia ​​tehtäviä), joten 82% tässä testissä vastaa tasoa ei-java-ohjelmoija. Kuinka paljon Java Juniorin, Java-ohjelmoijan ja vielä varsinkin Java Seniorin pitäisi rekrytoida?! Mitä tulosta voit odottaa esittää java-ohjelmoija - 90, 95, 99? Ja lopuksi, entä jos "ohjelmoija" saa alle 82, mutta kuitenkin hakee jonkinlaista työtä?!

Testaaminen ei ole aina hauskaa ja mielenkiintoista. Tämä prosessi on yleensä melko pitkä ja joskus täynnä yksitoikkoista työtä. Näyttää siltä, ​​että ohjelmoijat käyttivät äskettäin vakiotulostusta tai debuggeria Java-luokkien testaamiseen.

Tässä artikkelissa kuvaan JUnit 4 -kirjastoa, joka yksinkertaistaa ja automatisoi huomattavasti testien kirjoittamisprosessia.

JUnit Frameworkin tärkeimpien ominaisuuksien osoittamiseksi kirjoitetaan primitiivinen luokka Java-kielellä ja pilkataan sitä. Tällä luokalla on kaksi menetelmää - ei-negatiivisen luvun kertoimen ja kahden luvun summan löytäminen. Lisäksi luokkainstanssi sisältää menetelmäkutsulaskurin.

Julkinen luokka MathFunc ( int kutsut; julkinen int getCalls() ( paluukutsut; ) julkinen pitkä factorial(int numero) ( kutsut++; if (numero 1) ( for (int i = 1; i

Nyt kirjoitetaan yksikkötestit. Tätä varten luomme luokan, jossa on useita testimenetelmiä. Luonnollisesti luokka voi sisältää myös tavallisia apumenetelmiä. Jotta testin suorittaja voi määrittää, kuka on kuka, testimenetelmiin on merkittävä @Test.

Annotaatiolla voi olla seuraavat parametrit:

  • odotettu - ilmoittaa, mikä poikkeus menetelmä luo (katso esimerkki alla);
  • aikakatkaisu - minkä ajan kuluttua millisekunteina testi pysähtyy ja laskee sen epäonnistuneeksi.

Jos haluat osoittaa, että tietty testi tulee ohittaa, merkitse se @Ignore-merkinnällä. Vaikka voit yksinkertaisesti poistaa @Test-merkinnän.

Saatat joskus tarvita kontekstia, kuten valmiiksi luotuja luokkaesiintymiä, suorittaaksesi jokaisen testitapauksen. Ja suorituksen jälkeen sinun on vapautettava varatut resurssit. Tässä tapauksessa tarvitset @Ennen ja @Jälkeen merkinnät. @Before-merkitty menetelmä suoritetaan ennen jokaista testitapausta ja @After-merkitty menetelmä suoritetaan jokaisen testitapauksen jälkeen.

Jos alustus ja resurssien vapauttaminen on tehtävä vain kerran - ennen ja jälkeen kaikki testit - käytä merkintöjä @BeforeClass ja @AfterClass.

Ja tässä on itse testiluokka useilla testiskripteillä:

Julkinen luokka MathFuncTest ( yksityinen MathFunc math; @Ennen public void init() ( math = new MathFunc(); ) @After public 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(odotettu = IllegalArgumentException.class) public void factorialNegative() ( math.factorial(-1); ) @Ohita @Test public void todo() ( assertTrue(math.plus(1, 1) == 3); ) )

Puhelut-menetelmä testaa puhelulaskurin kelpoisuuden. Faktoriaalimenetelmä tarkistaa, onko faktoraali laskettu oikein joillekin standardiarvoille. FactorialNegative-menetelmä tarkistaa, että negatiivisille tekijäarvoille heitetään IllegalArgumentException. Todo-menetelmä jätetään huomioimatta. Kokeile poistaa @Ignore-merkintä, kun kokeilet koodia.

AssertTrue-menetelmä tarkistaa, onko lausekkeen tulos tosi. Jotkut muut menetelmät, jotka voivat olla hyödyllisiä:

  • asserEquals - odotettu tulos ja vastaanotettu tulos täsmäävät;
  • assertNull - lausekkeen tulos on null;
  • assertNotNull - lausekkeen tulos on eri kuin null;
  • assertSame - odotettu ja vastaanotettu objekti ovat sama objekti.
  • epäonnistua - menetelmä luo AssertionError-poikkeuksen - lisäämme sen sinne, missä ohjelman suorittamisen ei pitäisi mennä.

Meidän moderni maailma IDE:t voivat löytää ja yksinkertaisesti suorittaa testejä projektissa. Mutta entä jos haluat suorittaa ne manuaalisesti ohjelmakoodin avulla. Voit tehdä tämän käyttämällä Runneria, josta löytyy tekstiversiot - junit.textui.TestRunner, graafiset versiot - junit.swingui.TestRunner, junit.awtui.TestRunner.

Mutta vähän enemmän moderni menetelmä on JUnitCore-luokan käyttö. Lisää seuraava päämenetelmä MathFuncTest-luokkaan:

Julkinen staattinen void main(String args) heittää poikkeuksen ( JUnitCore runner = uusi JUnitCore(); Tulostulos = runner.run(MathFuncTest.class); System.out.println("suorita testit: " + result.getRunCount()); System.out.println("epäonnistuneet testit: " + result.getFailureCount()); System.out.println("ohitatut testit: " + result.getIgnoreCount()); System.out.println("onnistuminen: " + tulos .onnistui()); )

Ja suorituksen tulos:

Suorita testit: 3 epäonnistunutta testiä: 0 ohitettua testiä: 1 onnistunut: tosi

Enemmässä aikaisemmat versiot JUnit-testiluokan kirjoittamiseksi oli tarpeen luoda junit.framework.TestCase jälkeläinen. Sitten oli tarpeen määritellä konstruktori, joka ottaa parametriksi Stringin - metodin nimen - ja välittää sen yläluokkaan. Jokaisen testimenetelmän oli aloitettava etuliitetestillä. Resurssien alustamiseen ja vapauttamiseen käytettiin setUp- ja tearDown-menetelmiä. Lyhyesti sanottuna kauhu. No, nyt kaikki on yksinkertaista, kyllä.

Siinä kaikki tältä päivältä. Olen varma, että JUnit Framework auttaa sinua paljon. Kommentit ja kysymykset artikkelista ovat tervetulleita.




Ylös