Differences

This shows you the differences between two versions of the page.

Link to this comparison view

poo-ca-cd:alte-resurse:junit-java [2020/07/28 23:08]
127.0.0.1 external edit
poo-ca-cd:alte-resurse:junit-java [2021/11/24 00:52] (current)
radu_bogdan.pavel [Unit testing]
Line 1: Line 1:
-JUnit =+===== JUnit5 =====
  
-== Obiective ==+==== Obiective ​====
  
   * familiarizarea cu noţiunea de **Unit Testing** şi folosirea framework-ului **JUnit** pentru realizarea testării   * familiarizarea cu noţiunea de **Unit Testing** şi folosirea framework-ului **JUnit** pentru realizarea testării
  
-== Unit testing ==+==== Unit testing ​====
  
 Unit testing-ul s-a impus în ultima perioadă în dezvoltarea proiectelor scrise în limbajul Java şi nu numai, pe măsura apariţiei unor utilitare gratuite de testare a claselor, care au contribuit la creşterea vitezei de programare şi la micşorarea semnificativă a numărului de bug-uri. Unit testing-ul s-a impus în ultima perioadă în dezvoltarea proiectelor scrise în limbajul Java şi nu numai, pe măsura apariţiei unor utilitare gratuite de testare a claselor, care au contribuit la creşterea vitezei de programare şi la micşorarea semnificativă a numărului de bug-uri.
  
 Printre avantajele folosirii framework-ului JUnit se numără: Printre avantajele folosirii framework-ului JUnit se numără:
-* îmbunătăţirea vitezei de scriere a codului şi creşterea calităţii acestuia +  ​* îmbunătăţirea vitezei de scriere a codului şi creşterea calităţii acestuia 
-* clasele de test sunt uşor de scris şi modificat pe măsură ce codul sursă se măreşte, putând fi compilate împreună cu codul sursă al proiectului +  * clasele de test sunt uşor de scris şi modificat pe măsură ce codul sursă se măreşte, putând fi compilate împreună cu codul sursă al proiectului 
-* clasele de test JUnit pot fi rulate automat (în suită), rezultatele fiind vizibile imediat +  * clasele de test JUnit pot fi rulate automat (în suită), rezultatele fiind vizibile imediat 
-* clasele de test măresc încrederea programatorului în codul sursă scris şi îi permit să urmărească mai uşor cerinţele de implementare ale proiectului +  * clasele de test măresc încrederea programatorului în codul sursă scris şi îi permit să urmărească mai uşor cerinţele de implementare ale proiectului 
-* testele pot fi scrise înaintea implementării,​ fapt ce garantează înţelegerea funcţionalităţii de către dezvoltator+  * testele pot fi scrise înaintea implementării,​ fapt ce garantează înţelegerea funcţionalităţii de către dezvoltator
  
 === JUnit === === JUnit ===
Line 99: Line 99:
  
 <code java Test.java>​ <code java Test.java>​
-import org.junit.Assert; +import org.junit.jupiter.api.*
-import org.junit.Before;+
  
-public class Test {+public class GroupTest ​{
     private Group group;     private Group group;
  
-    @Before+    @BeforeEach
     public void setup() {     public void setup() {
         group = new Group();         group = new Group();
     }     }
  
-    @org.junit.Test+    @Test
     public void testNoStudentInGroup() {     public void testNoStudentInGroup() {
-        ​Assert.assertEquals(false,​ group.areStudentsInGroup());​+        ​Assertions.assertEquals(false,​ group.areStudentsInGroup());​
     }     }
  
-    @org.junit.Test+    @Test
     public void testAddStudent() {     public void testAddStudent() {
         Student st = new Student("​Elena",​ "​11"​);​         Student st = new Student("​Elena",​ "​11"​);​
         group.addStudent(st);​         group.addStudent(st);​
  
-        ​Assert.assertTrue(group.getStudent("​Elena"​).equals(st));​+        ​Assertions.assertTrue(group.getStudent("​Elena"​).equals(st));​
     }     }
-    @After void tearDown() {+    ​ 
 +    ​@AfterEach  
 +    public ​void tearDown() {
         group = null;         group = null;
     }     }
Line 130: Line 131:
  
 **Observaţii:​** **Observaţii:​**
-* fiecare metodă de test are adnotarea: ''​@Test''​ +  ​* fiecare metodă de test are adnotarea: ''​@Test''​ 
-* metodele de **setUp** (având adnotarea: ''​@Before''​) şi **tearDown** (având adnotarea: ''​@After''​) se apelează înainte, respectiv după fiecare test. Se întrebuinţează pentru iniţializarea/​eliberarea resurselor ce constituie mediul de testare, evitându-se totodată duplicarea codului şi respectându-se principiul de independenţă a testelor. Pentru exemplul dat ordinea este: +  * metodele de **setUp** (având adnotarea: ''​@BeforeEach''​) şi **tearDown** (având adnotarea: ''​@AfterEach''​) se apelează înainte, respectiv după fiecare test. Se întrebuinţează pentru iniţializarea/​eliberarea resurselor ce constituie mediul de testare, evitându-se totodată duplicarea codului şi respectându-se principiul de independenţă a testelor. Pentru exemplul dat ordinea este: 
-    * ''​@Before ​setUp''​+    * ''​@BeforEach ​setUp''​
     * ''​@Test testNoStudentInGroup''​     * ''​@Test testNoStudentInGroup''​
-    * ''​@After tearDown''​ +    * ''​@AfterEach ​tearDown''​ 
-    * ''​@Before ​setUp''​+    * ''​@BeforeEach ​setUp''​
     * ''​@Test testAddStudent''​     * ''​@Test testAddStudent''​
-    * ''​@After tearDown''​ +    * ''​@AfterEach ​tearDown''​ 
-* În contextul moștenirii dacă ChildTest extends ParentTest ordinea de execuţie este urmatoarea:​ +  * În contextul moștenirii dacă ChildTest extends ParentTest ordinea de execuţie este urmatoarea:​ 
-    * ''​**ParentTest** @Before ​setUp''​ +    * ''​**ParentTest** @BeforeEach ​setUp''​ 
-    * ''​ChildTest @Before ​setUpSub''​+    * ''​ChildTest @BeforeEach ​setUpSub''​
     * ''​ChildTest @Test testChild1''​     * ''​ChildTest @Test testChild1''​
-    * ''​ChildTest @After tearDownSub''​ +    * ''​ChildTest @AfterEach ​tearDownSub''​ 
-    * ''​**ParentTest** @After tearDown''​ +    * ''​**ParentTest** @AfterEach ​tearDown''​ 
-* Pentru compararea rezultatului aşteptat cu rezultatul curent se folosesc apeluri ''​assert'':​+  * Pentru compararea rezultatului aşteptat cu rezultatul curent se folosesc apeluri ''​assert'':​
     * ''​assertTrue''​     * ''​assertTrue''​
     * ''​assertFalse''​     * ''​assertFalse''​
     * ''​assertEquals''​     * ''​assertEquals''​
     * ''​assertNull''​ / ''​assertNotNull''​     * ''​assertNull''​ / ''​assertNotNull''​
-* **Rulare teste**: Click dreapta clasă test -> //Run as// -> //Junit test// +  ​* **Rulare teste**: Click dreapta clasă test -> //Run as// -> //Junit test// 
-* **Rulare test**: Selectare test -> click dreapta ->  //Run as// -> //Junit test//+  * **Rulare test**: Selectare test -> click dreapta ->  //Run as// -> //Junit test//
  
  
 <note important>​ <note important>​
-În cadrul laboratorului vom folosi framework-ul ​JUnit adăugând fişierele [[:​poo-ca-cd:​http://​search.maven.org/​remotecontent?​filepath=junit/​junit/​4.12/​junit-4.12.jar|junit.jar]] şi [[:poo-ca-cd:https://​storage.googleapis.com/​google-code-archive-downloads/​v2/​code.google.com/​hamcrest/​hamcrest-all-1.3.jar|hamcrest-all-1.3.jar]] cu acesta ​la proiectele create. +Pentru a folosi framework-ul ​JUnit5, consultațtutorialul din [[poo-ca-cd:​laboratoare:colectii|laboratorul 8]], aflat la secțiunea **Unit testing**.
- +
-Pentru a importa un //jar// într-un proiect din ''​Eclipse''​ parcurgeţi următorii paşi: //click dreapta proiect// -> //Build path// -> //Configure build path// -> //​Libraries//​ -> //Add jars (Add external jars)//.+
 </​note>​ </​note>​
  
 Câteodată avem nevoie să testăm funcționalitatea unor clase ce folosesc metode din alte clase netestate sau care nu pot fi testate. De asemenea, există cazuri în care vrem sa testăm comportamentul clasei în situații extreme sau foarte greu de replicat (erori de disc, epuizarea spațiului pe disc, obținerea unei anumite valorii în cazul in care folosim generatoare random). Câteodată avem nevoie să testăm funcționalitatea unor clase ce folosesc metode din alte clase netestate sau care nu pot fi testate. De asemenea, există cazuri în care vrem sa testăm comportamentul clasei în situații extreme sau foarte greu de replicat (erori de disc, epuizarea spațiului pe disc, obținerea unei anumite valorii în cazul in care folosim generatoare random).
  
-Pentru a rezolva ușor aceste necesități putem folosi obiecte de tip **mock**. Aceste obiecte simulează comporatamentul clasei mock-uite și sunt controlate din interiorul unit testelor. Pentru mai multe detalii puteți consulta pagina [[:poo-ca-cd:http://​en.wikipedia.org/​wiki/​Mock_object|Mock Object]].+Pentru a rezolva ușor aceste necesități putem folosi obiecte de tip **mock**. Aceste obiecte simulează comporatamentul clasei mock-uite și sunt controlate din interiorul unit testelor. Pentru mai multe detalii puteți consulta pagina [[http://​en.wikipedia.org/​wiki/​Mock_object|Mock Object]].
  
 <note tip> <note tip>
-În Java pentru a implementa mock-uri puteți folosi framework-ul **JMock**. Un scurt tutorial de instalare si folosire găsiți [[:poo-ca-cd:http://​www.askeygeek.com/​jmock-for-beginners/​|aici]]. Pentru exemple mai detaliate puteţi consulta [[:poo-ca-cd:http://​www.jmock.org/​cookbook.html|cookbook-ul]] pus la dispozitie pe site-ul jmock.org.+În Java pentru a implementa mock-uri puteți folosi framework-ul **JMock**. Un scurt tutorial de instalare si folosire găsiți [[http://​www.askeygeek.com/​jmock-for-beginners/​|aici]]. Pentru exemple mai detaliate puteţi consulta [[http://​www.jmock.org/​cookbook.html|cookbook-ul]] pus la dispozitie pe site-ul jmock.org.
 </​note>​ </​note>​
  
-== Exerciţii ==+==== Exerciţii ​facultative====
  
-  - **(2p)** ​Creaţi clasa  ''​Animal''​ şi clasa ''​Zoo''​. Clasa ''​Zoo''​ conţine un vector de animale. Implementaţi metodele: ''​addAnimal(Animal a)'',​ ''​removeAnimal(Animal a)'',​ ''​boolean areAnimals(),​ getAnimals()'',​ ''​size()''​. Creaţi o clasa ''​Test''​ unde veţi verifica diverse __scenarii__:​+  - Creaţi clasa  ''​Animal''​ şi clasa ''​Zoo''​. Clasa ''​Zoo''​ conţine un vector de animale. Implementaţi metodele: ''​addAnimal(Animal a)'',​ ''​removeAnimal(Animal a)'',​ ''​boolean areAnimals(),​ getAnimals()'',​ ''​size()''​. Creaţi o clasa ''​Test''​ unde veţi verifica diverse __scenarii__:​
     * La rularea fiecărei metode veti instanţia clasa ''​Zoo''​.     * La rularea fiecărei metode veti instanţia clasa ''​Zoo''​.
     * Metoda ''​testAddAnimal''​ - adaugă un obiect ''​Animal''​ şi verifică daca adăugarea a avut loc cu succes. Folosiţi: **''​assertEquals''​**     * Metoda ''​testAddAnimal''​ - adaugă un obiect ''​Animal''​ şi verifică daca adăugarea a avut loc cu succes. Folosiţi: **''​assertEquals''​**
Line 175: Line 174:
     * Metoda ''​testAreAnimalsInZoo''​ - testul pică dacă metoda returnează ''​false''​. //Hint//: **''​Assert.fail()''​** ​     * Metoda ''​testAreAnimalsInZoo''​ - testul pică dacă metoda returnează ''​false''​. //Hint//: **''​Assert.fail()''​** ​
     * Metoda ''​testGetAnimals''​ - adăugaţi două obiecte ''​Animal''​. Verificaţi ca adăugarea a avut loc cu succes. Folosiţi **assertFalse**.     * Metoda ''​testGetAnimals''​ - adăugaţi două obiecte ''​Animal''​. Verificaţi ca adăugarea a avut loc cu succes. Folosiţi **assertFalse**.
-  - **(2p)** ​Acest exerciţiu urmăreşte identificarea unor cazuri de test, strict pe baza specificaţiei,​ în absenţa accesului la codul sursă şi a cunoaşterii modului intern de funcţionare a sistemului. Se consideră o clasa ''​GeometricForms''​ avand un constructor ce primeste un String ce poate fi unul din valorile enum-ului ''​Forms''​.+  - Acest exerciţiu urmăreşte identificarea unor cazuri de test, strict pe baza specificaţiei,​ în absenţa accesului la codul sursă şi a cunoaşterii modului intern de funcţionare a sistemului. Se consideră o clasa ''​GeometricForms''​ avand un constructor ce primeste un String ce poate fi unul din valorile enum-ului ''​Forms''​.
     * Adăugaţi în build path-ul proiectului clasele din scheletul de laborator.     * Adăugaţi în build path-ul proiectului clasele din scheletul de laborator.
     * Metodele ''​isTriangle'',​ ''​isCircle''​ si ''​isRectangle''​ au drept scop evaluarea stării obiectului ''​GeometricForms''​.     * Metodele ''​isTriangle'',​ ''​isCircle''​ si ''​isRectangle''​ au drept scop evaluarea stării obiectului ''​GeometricForms''​.
Line 186: Line 185:
 </​code>​ </​code>​
  
-== Resurse ==+==== Resurse ​====
  
-* <​html><​a class="​media mediafile mf_pdf"​ href="/​poo/​laboratoare/​exceptii?​do=export_pdf">​PDF laborator</​a></​html>​ +  ​* <​html><​a class="​media mediafile mf_pdf"​ href="/​poo/​laboratoare/​exceptii?​do=export_pdf">​PDF laborator</​a></​html>​ 
-* [[:​poo-ca-cd:​http://​search.maven.org/​remotecontent?​filepath=junit/​junit/​4.12/​junit-4.12.jar|Junit Download]] +  * {{:​poo-ca-cd:​alte-resurse:​junit-java:​skel.zip|Schelet}} 
-* [[:​poo-ca-cd:​http://​search.maven.org/​remotecontent?​filepath=org/​hamcrest/​hamcrest-core/​1.3/​hamcrest-core-1.3.jar|Hamcrest Core]] +  * {{:​poo-ca-cd:​alte-resurse:​solutie-junit.zip|Solutie}}
-* {{:​poo-ca-cd:​alte-resurse:​junit-java:​skel.zip|Schelet}} +
-* {{:​poo-ca-cd:​alte-resurse:​junit-java:sol.zip|Soluție}}+
  
-== Referinţe ==+==== Referinţe ​====
  
-* [[:poo-ca-cd:http://​en.wikipedia.org/​wiki/​Mock_object|Mock Object]] +  ​* [[http://​en.wikipedia.org/​wiki/​Mock_object|Mock Object]] 
-* [[:poo-ca-cd:http://​www.askeygeek.com/​jmock-for-beginners/​|JMock for beginners]] +  * [[http://​www.askeygeek.com/​jmock-for-beginners/​|JMock for beginners]] 
-* [[:poo-ca-cd:http://​www.jmock.org/​cookbook.html|JMock Cookbook]]+  * [[http://​www.jmock.org/​cookbook.html|JMock Cookbook]]
poo-ca-cd/alte-resurse/junit-java.1595966902.txt.gz · Last modified: 2020/08/18 22:32 (external edit)
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0