Online-testi Java-aloitustasolle. Ohjelman testaus, JUnit. Java-testin edellytykset

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

  • Milloin minun pitäisi käyttää X-työkalua?
  • Kuinka minun pitäisi käyttää työkalua X?

Automaattinen testaus on erittäin tärkeä osa ohjelmistokehitystä, mutta ohjelmoijablogeissa on vain vähän postauksia käytetyistä työkaluista. 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 sinua ymmärtämään, kuinka niitä käytetään.

Katsotaanpa työkalulaatikkoani

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:

  • Integraatiotestaus Mavenin kanssa kuvaa, kuinka voimme perustaa Maven-koontiversion integraatio- ja yksikkötesteillä erillisissä hakemistoissa.
  • Gradlen käytön aloittaminen: Integraatiotestaus TestSets-laajennuksella kuvaa samaa 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 testaamiseen selittää, kuinka Hamcrestiä käytetään testien kirjoittamiseen ja kuinka sitä 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 JUnit-vakioväitteet omillamme, jotka käyttävät oikeaa verkkotunnuskohtaista kieltä.

Tietojen pääsykoodin testaus

Nopea tietokanta, hyödyllinen kirjoitettaessa integrointitestejä, jotka suoritetaan paikallinen kone kehittäjä.

JUnitin laajennus, jota voidaan käyttää alustamaan tietokanta tunnettuun tilaan ennen jokaisen integrointitestin suorittamista ja tietokannan täyttämistä halutuilla tiedoilla. DbUnitilla on haittoja, mutta se on hyvin hyödyllinen työkalu A, 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 testaustehtäviä java-ohjelmoijille, törmäsin mielenkiintoiseen sivustoon (Avast-käyttäjien ei pitäisi mennä, komentosarjottu troijalainen havaitaan, loput ilmeisesti voivat) - http://www.betterprogrammer.com. Se tarkistaa Java-ohjelmoijien pätevyyden yksinkertaisimmalla, mutta automaattisesti: tarjoaa useiden monimutkaisempien funktioiden (menetelmien) kirjoittamisen ja koodin kopioimisen TextAreaan. Seuraavaksi sivustomoottori tekee jotain tehtävien kanssa (ei muuta kuin yksikkötestausta), laskee tietyn kelpoisuusindeksin "nopeus-laatu"-kriteerien mukaan ja antaa lopullisen arvion tässä muodossa:

Sitten alkavat kysymykset. Itse ohjelmoin Javalla toisen kerran elämässäni (ja siksi jätin vain monimutkaiset tehtävät väliin), joten 82% tässä testissä vastaa tasoa ei-java-ohjelmoija. Kuinka paljon Java Juniorin, Java Programmerin ja vielä enemmän Java Seniorin pitäisi saada? Mitä tulosta odottaa esittää java-ohjelmoija - 90, 95, 99? Ja lopuksi, entä jos "ohjelmoija" saa alle 82, mutta hakee silti johonkin työhön?!

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 aivan äskettäin vakiotulostusta tai debuggeria Java-luokkien testaamiseen.

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

Havainnollistaaksemme JUnit Frameworkin pääpiirteitä, 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 luodaan luokka, jossa on useita testimenetelmiä. Luonnollisesti luokka voi sisältää myös tavanomaisia ​​apumenetelmiä. Jotta testin suorittaja voi määrittää, kuka on kuka, testimenetelmiin on lisättävä @Test-merkintä.

Annotaatiolla voi olla seuraavat parametrit:

  • odotettu - määritä, minkä poikkeuksen menetelmä heittää (katso alla oleva esimerkki);
  • aikakatkaisu - minkä ajan kuluttua millisekunteina testin suorittaminen lopetetaan ja se lasketaan epäonnistuneeksi.

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

Sattuu niin, että tarvitset jonkin kontekstin, esimerkiksi valmiiksi luotuja luokkaesiintymiä, jokaisen testiskenaarion suorittamiseen. 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 menetelmä, joka on merkitty @After, suoritetaan jokaisen testitapauksen jälkeen.

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

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 oikeellisuuden. Faktoriaalimenetelmä tarkistaa, onko faktoraali laskettu oikein joillekin standardiarvoille. FactorialNegative-menetelmä tarkistaa, että Facotrialin negatiivisille arvoille heitetään IllegalArgumentException. Todo-menetelmä jätetään huomioimatta. Harkitse @Ignore-merkinnän poistamista, kun kokeilet koodia.

AssertTrue-menetelmä tarkistaa, onko lausekkeen tulos tosi. Joitakin muita tapoja, joista voi olla hyötyä:

  • asserEquals - odotettu tulos ja saatu tulos ovat samat;
  • assertNull - lausekkeen tulos on null;
  • assertNotNull - lausekkeen tulos ei ole tyhjä;
  • assertSame - odotettu ja vastaanotettu objekti ovat sama objekti.
  • epäonnistua - menetelmä luo AssertionError-poikkeuksen - lisäämme sen sinne, missä ohjelman suorittamisen ei pitäisi päästä.

Meidän moderni maailma IDE:t voivat löytää ja helposti suorittaa testejä projektissa. Mutta entä jos haluat suorittaa ne manuaalisesti ohjelmakoodin avulla. Voit tehdä tämän käyttämällä Runner "th. On teksti - 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

Aiemmissa JUnitin versioissa testiluokan kirjoittamiseksi piti luoda alaluokka junit.framework.TestCase. Sitten piti määritellä konstruktori, joka ottaa parametriksi Stringin - metodin nimen - ja välittää sen yläluokkaan. Jokaisen testimenetelmän oli aloitettava testietuliitteellä. 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äosa