Junit pentru javarush sau un pic despre testarea la domiciliu

JUnit pentru JavaRush sau puțin despre testarea la domiciliu.

Obosit de tastarea de zeci de ori în datele testului din consola pentru a testa sarcina dvs.? Bine ați venit la pisică, vă voi spune ce puteți face în legătură cu aceasta.

Scopul final al acestui material va fi acela de a automatiza începutul problemei care trebuie rezolvat cu diferiți parametri și de a verifica rezultatele fără a face modificări în codul sursă. Așa cum probabil ați înțeles deja de la antet, JUnit va fi principalul nostru asistent în această chestiune destul de simplă.

Dacă nu ați auzit despre testarea unității și testele unității. Vă sugerez să vă distrați puțin și să vă familiarizați cu aceste concepte pe cont propriu, binele este suficient pe Internet. Nu, nu? Bine, cred că nu este o mare problemă pentru a înțelege ce se întâmplă. La urma urmei, știi ce test și teste în general? Faceți asta de fiecare dată când porniți sarcina, introduceți datele inițiale și comparați rezultatul cu ceea ce ați așteptat să vedeți.

Bună ziua, lumea JUnit!


Ce este JUnit? Pe proiectul of.sayte putem citi această descriere:
JUnit este un cadru simplu pentru a scrie teste repetabile. Este o instanță a arhitecturii xUnit pentru cadrele de testare a unităților.
Pentru noi, aceasta înseamnă abilitatea de a scrie clase special concepute, ale căror metode vor interacționa cu programul nostru, vor compara rezultatul cu cel de referință și ne vor informa dacă nu coincid.

Pentru a înțelege principiul, să luăm în considerare un exemplu simplu.
Să presupunem că avem o clasă auxiliară, una dintre metodele care ia două variabile de tip int și returnează suma lor:

Junit pentru javarush sau un pic despre testarea la domiciliu

După ce specificați unde să creați standuri de testare, oferta IDEA biblioteca selectați Test (în acest material Eu folosesc JUnit4, pentru clasele de bibliotecă au fost conectate la proiect trebuie să faceți clic «Fix»), metode de testare și opțiuni.

Junit pentru javarush sau un pic despre testarea la domiciliu

IDE va ​​crea un șablon de clasă de testare:
ClassName = numele TestClass + "Test"
MethodName = "test" + Denumirea metodei de testare

Junit pentru javarush sau un pic despre testarea la domiciliu

Putem umple doar corpul metodei. Acest lucru va ajuta la așa-numitele "afirmații". metode oferite de JUnit. Munca lor este simplificată în felul următor: rezultatul așteptat și rezultatul apelării metodei testate sunt transmise metodei .assert *, pentru comoditate primul parametru poate fi adăugat un mesaj explicativ. Dacă parametrii nu se potrivesc în timpul testului, veți fi informați despre acest lucru. Puteți rula clasa de test la fel ca în clasa normală, prefer să utilizez comanda rapidă de la tastatură Ctrl + Shift + F10

Junit pentru javarush sau un pic despre testarea la domiciliu

Specificăm problema


În teorie, totul este simplu și frumos, dar în contextul exemplului propus, nu este absolut necesar, putem încredința computerului să adauge două numere. Suntem mai interesați de modul în care vor fi lucrurile cu sarcinile reale rezolvate de studenții JavaRush, de exemplu, vă sugerez să luați nivelul iubit05.lesson12.bonus03.
/ * Problema pe algoritmi
Scrieți un program care:
1. Intră din consola cu numărul N> 0
2. apoi introduce N numere din consola
3. Afișează numărul maxim de numere N introduse.
* /
Trebuie să scriem trei teste pentru numere pozitive, negative și un set mixt.

Mai departe, în pădure.


Aici suntem așteptați de câteva surprize:

  • Logica programului este plasată în metoda principal ()
  • Datele sursă nu sunt transferate la metodă, ci sunt introduse de la tastatură.
  • Metoda principală () nu returnează rezultatul, ci o transmite în consola.

Dacă primul element nu este deosebit de problematic (putem numi metoda principală () ca de obicei), atunci următoarele două ne fac să intrăm mai adânc în subiect și să întindem girațiile. Am găsit câteva soluții la această problemă:
  1. Punerea logicii găsirii maximului într-o metodă separată.
    • Pro: abordarea corectă în ceea ce privește refactorizarea
    • Contra: Programul este supraaglomerat cu cod, structuri inutile, cel puțin o matrice sau ArrayList este adăugat (pentru gust și culoare.). Se verifică numai mecanismul de detectare a valorii maxime, nu este verificată introducerea datelor, cum ar fi ieșirea.
  2. Scrierea pachetelor de împachetare pentru System.in/System.out.
    • Pro: Nu folosim biblioteci terțe.
    • Contra: Calea nu este pentru incepatori. Complexitatea relativă a implementării testului, cantitatea de cod din test poate fi mai mare decât în ​​sarcina de testare.
  3. Utilizați biblioteci suplimentare pentru teste.
    • Pro: codul curat în teste, simplitatea relativă de scriere a testului. Codul sursă al clasei testate nu se modifică.
    • Contra: necesitatea de a vă conecta la bibliotecile de proiect terțe părți.

Sincer, cea de-a treia opțiune mi-a plăcut cel mai mult, iată-o și încercați să o implementați.
Reguli de sistem

După pornire, sarcina noastră cere să introduceți din consola N + 1 numere, unde primul număr raportează câte numere îl urmează. În Regulile de sistem pentru aceste scopuri este clasa TextFromStandardInputStream, inițial trebuie să adăugăm un câmp de acest tip la clasa noastră de testare și să îl marcați cu adnotarea @Rule:

Apoi, direct în metoda de testare specificăm datele necesare:


După cum puteți vedea, numerele sunt transmise în formă text și separate prin ruperea liniei "\ n". Continuând de aici, se pare că N la noi va fi egal cu 4, iar pentru a căuta un maxim vom fi de la numere.

Apoi, trebuie să creați o instanță a clasei testate și să apelați metoda principal (). Programul nostru ia în considerare datele din sistemulInMock, le procesează și imprimă rezultatul și îl putem conta și compara doar cu standardul. Pentru aceasta, regulile de sistem ne oferă clasa StandardOutputStreamLog.
Adăugăm un câmp de tipul specificat:

Puteți citi datele tipărite folosind metoda .getLog (), dar trebuie să țineți cont de prezența caracterului feed-line, opțiunile finale pot fi:

Între încercări, pentru a evita întărirea datelor, este necesară curățarea jurnalului


Textul integral al clasei mele de test:

Fugiți și bucurați-vă.

Acest material este furnizat NUMAI în scopuri informative, nu garantez o reușită a testării sarcinilor pe server în cazul în care există o clasă străină în pachet cu sarcina. Înainte de a trimite o sarcină serverului, ștergeți toate fișierele străine: fișierele inutile, clasele suplimentare, codul comentat.

Finalizarea cu succes a testelor pe care le-ați inventat nu garantează trecerea cu succes a testelor pe server.

Articole similare