Back to site
Since 2004, our University project has become the Internet's most widespread web hosting directory. Here we like to talk a lot about web servers, web development, networking and security services. It is, after all, our expertise. To make things better we've launched this science section with the free access to educational resources and important scientific material translated to different languages.

JUnit Testing Utility Tutorial

Ashley J.S Mills

<ashley@ashleymills.com>

1.Uvod

JUnit jeste okvir za implementaciju testiranja Java. Obezbeđuje nam jednostavan način eksplicitnog testiranja određenih delova Java programa, može se produžiti i može se primeniti pri testiranju hijerarhije programskog koda, bilo da je u pitanju jednostavnost ili višebrojne jedinice.

Žašto koristiti okvir testiranja? Korišćenje okvira tetiranja ima svojih prednosti jer vas on tera da objavite očekivane rezultate određene programske izvršne rute. Kada se nešto dekodira moguće je napisati test koji vam iznosi rezultate koje pokušavate da dostignete i onda se dekodiranje nastavlja sve dok ne dobijete željeni rezultat. Time što ćete imati više testova koji testiraju srž komponenti projekta postižete moguće modifikovanje određenih oblasti projekta i odmah vidite efekte modifikacije koji su na drugim oblastima po rezultatu testa, i na taj način propratni efekti mogu veoma brzo biti realizovani.

JUnit promoviše ideju da se prvo mora odraditi testiranje, pa onda kodiranje, i to da je moguće postaviti podatke za testiranje za jedinice koje definišu koji je očekivani rezultat i onda nastavljaju testiranje sve dok se ne postignu željeni rezultati. Veruje se da je ova praksa “malo testiranje, malo kodiranje, malo testiranje, malo kodiranje...” u porastu među programerima, da povećava produktivnost i stabilnost programskog koda, dok sa druge strane umanjuje stres kod programera i vreme koje se provodi u dekodiranju. Takođe se integriše sa Ant http://jakarta.apache.org/ant/.

2.Instalacija

Pretpostavlja se da znate kako da postavite okolinu za varijable i da instalirate softver vašeg operativnog sistema, ili pogledajte razumljivo upustvo za Windows na Configuring A Windows Working Environment , za Unix na Configuring A Unix Working Environment ili pratite ove instrukcije da bi ste instalirali JUnit:

  1. Prebacite poslednju verziju JUnit sa http://download.sourceforge.net/junit/

  2. Uradite dekompresiju zipu direktorijum po vašem izboru.

  3. Dodajte /path/to/whereyouextractedjunit/junit/junit.jar na vašu Java CLASSPATH varijablu.

3.Osnove JUnit

Ovaj deo ćemo započeti sa jdnostavnim primerom koji će ilustrovati osnove koncepta koji su uključeni u testiranje pomoću JUnit.

Primer1.Jednostavan pimer

import junit.framework.*; 1
public class SimpleTest extends TestCase { 2
   public SimpleTest(String name) { 3
      super(name);
   }

   public void testSimpleTest() {4
      int answer = 2;
      assertEquals((1+1), answer); 5
   }
}
      
1

import junit.framework.*;
          

Pošto koristimo neke konstrukcije koje su napravili markeri JUnit moramo da unesemo bilo koju klasu koju želimo da koristimo, od kojih se većina nalazi u okvirima pod direktorijuma, što je veoma bitna izjava.

2

public class SimpleTest extends TestCase {
          

Naša jednostavna klasa bi trebalo da definiše svoju sopstvenu metodu testiranja da bi, zapravo, bila od bilo kakve koristi u produživanju TestCase, koji nam omogućava korišćenje mogućnosti definisanja naše sopstvene metode testiranja.

3

public SimpleTest(String name) {
   super(name);
}  
          

Svaki test je imenovan, tako da kada se kasnije pregledaju rezultati celokupnog testiranja možemo videti koji test je imao koju grešku i kako je ona generisana, ako test ne uspe. Tvorac nam ovu mogućnost obezbeđuje tako što prenosi parametre na konstrukciju trenutne klase.

4

public void testSimpleTest() {
   int answer = 2;
   assertEquals((1+1), answer);
}
          

Ovo je jedan od testova koji je uključen unutar TestCase, u ovom trenutku ovo je jedini test, ali vi možete da dodate koliko god vi želite. Vidite da se varijable mogu definisati i izvoditi aritmetički kao i bilo koji Java program.

5

public void testSimpleTest() {
   int answer = 2;
   assertEquals((1+1), answer);
}
          

Ovaj jednostavni test proverava da li je 1+1 jednako vrednosti u odgovoru. Ovo je jedan veoma jednostavan primer, u većini situacija bi, verovatno, želeli da testirate rezultate neke funkcije, pretpostavljam funkcije koju želite da ogolite sa svim “a” karakterima u nizu. A to možete testirati ovako:

public void testStringStripFunction() {
   String expected = "bb"
   StringStripper stripper = new StringStripper();
   assertEquals(expected, stripper.stringStrip("aabaaaba"));
}
          

Što će dovesti do primene Equals koji neće uspeti ako stringStrip metoda ne uradi ono što je očekivano, u tom slučaju bi trebalo popraviti kod i pokrenuti test ponovo sve dok sve n bude u savršenom redu.

Kopirajte primer u vaš omiljen tekst editor i sačuvajte ga kao SimpleTest.java. Sada želimo da probamo ovaj test, postoje tri moguća korisnička interfejsa za JUnit TestRunner:

Da bi ste odabrali interfejs izvršite sledeću komandu ili niz komandi.

java junit.USERINTERFACE.TextRunner classfile

Na primer ako bi želeli tekst bazirani autput za TestCase izvršićemo niz komandi:

java junit.textui.TestRunner SimpleTest

Kompajlirajte fajl i onda probajte ovo, i onda bi trbalo da vidite neki sličan ovome izgled:

.
Time: 0

OK (1 tests)

Vidi se da je naš, očigledno savim ispravan test, prošao, tačnije nije došlo ni do jedne greške. Promenite vrednost odgovora u primeru na nešto drugačije od broja 2, rekompajlirajte fajl i ponovo pokrenite test, i onda će izgled biti sličan ovome.

.F
Time: 0.01
There was 1 failure:
1) testSimpleText(SimpleTest)junit.framework.AssertionFailedError: expected:<2> but was:<3>
        at SimpleTest.testSimpleTest(SimpleTest.java:9)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

FAILURES!!!
Tests run: 1, Failure: 1, Errors: 0
    

Kada bi ovo bio stvaran program sada bi krenuli i pokušali da popravimo grešku, pa onda da rekompajliramo i restartujemo i tako u nedogled sve dok se greška ne popravi. Sada bi već trebalo da imate neku ideju o tome kako da postavite sasvim jednostavan test.

4.Neposredan primer

Poslednja sekcija je bila samo brzi test i lagani uvod u JUnit, a u ovom odeljku ćemo istraživati naprednije primere.

// A Class that adds up a string based on the ASCII values of its
// characters and then returns the binary representation of the sum.
public class BinString {
  public  BinString() {}

   public String convert(String s) {
      return binarise(sum(s));
   }

   public int sum(String s) {
      if(s=="") return 0;
      if(s.length()==1) return ((int)(s.charAt(0)));
      return ((int)(s.charAt(0)))+sum(s.substring(1));
   }

   public String binarise(int x) {
      if(x==0) return "";
      if(x%2==1) return "1"+binarise(x/2); 
      return "0"+binarise(x/2); 
   }
}        
    

Kopirajte gornji kod u vaš omiljeni editor i sačuvajte ga kao BinString.java, sve što će program uraditi jeste konvertovanje ASCII niza u sumu njegovog karaktera koji je predstavljen binarnim nizom. Razlog što sam odabrao ovaj tip funkcije jeste arbitraran, ali želeo sam da ilustrujem testiranje programa sa pomoćnim metodama. Kopirajte donji kod testa u vaš omiljeni editor i sačuvajte ga kao BinStringTest.java.

import junit.framework.*;
public class BinStringTest extends TestCase {
   private BinString binString;

   public BinStringTest(String name) {
      super(name);
   }

   protected void setUp() { 1
      binString = new BinString();
   }

   public void testSumFunction() { 2
      int expected = 0;
      assertEquals(expected, binString.sum(""));
      expected = 100;
      assertEquals(expected, binString.sum("d"));
      expected = 265;
      assertEquals(expected, binString.sum("Add"));
   }

   public void testBinariseFunction() { 3
      String expected = "101";
      assertEquals(expected, binString.binarise(5));
      expected = "11111100";
      assertEquals(expected, binString.binarise(252));
   }

   public void testTotalConversion() { 4
     String expected = "1000001";
     assertEquals(expected, binString.convert("A"));
   }
}      
    
1

protected void setUp() {
   binString = new BinString();
}
        

TestCase nam dozvoljava da koristimo setUp metod da bismo namestili sve potrebne varijable ili objekte. Imajte na umu da je binString već objavljen na vrhu fajla kao uvek sa privatnim Binstring binstringom;. setUp je pozvan pre evaluacije svakog testa , setUp ima brata pod imenom tearDown koji se poziva posle evaluacije svakog testa i može da se koristi da dereferencira varijable ili šta god već tako da bi svaki test da bude izvršen bez problema sa strane koji mogu da utiču na rezultate drugih testova.

2

public void testSumFunction() {
   int expected = 0;
   assertEquals(expected, binString.sum(""));
   expected = 100;
   assertEquals(expected, binString.sum("d"));
   expected = 265;
   assertEquals(expected, binString.sum("Add"));
}
        

Ovde testiramo pomoćnu funkciju sum iz našeg primera.

3

public void testBinariseFunction() {
   String expected = "101";
   assertEquals(expected, binString.binarise(5));
   expected = "11111100";
   assertEquals(expected, binString.binarise(252));
}
        

Ovde testiramo pomoćnu funkciju binarise koja konvertuje an int u binarni string.

4

public void testTotalConversion() {
  String expected = "1000001";
  assertEquals(expected, binString.convert("A"));
}
        

Ovde testiramo convert funkciju koja poziva pomoćne metode da bi izvela konverziju iz stringa u integer u binarni string.

Kompajlirajte oba fajla i onda pokrenite tester na TestCase izvršavanjem komande za sledeći niz:

java junit.textui.TestRunner BinStringTest

Doći će do sledećih grešaka:

..F.
Time: 0.01
There was 1 failure:
1) testBinariseFunction(BinStringTest)junit.framework.AssertionFailedError: expected:<11111100> but was:<00111111>
 at BinStringTest.testBinariseFunction(BinStringTest.java:26)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

FAILURES!!!
Tests run: 3,  Failures: 1,  Errors: 0
    

To nam govori da je došlo do greške kod Binarise funkcije i čak nam govori stvarni rezultat koji je upoređen sa očekivanim rezultatom. Letimični pogled pokazuje da je binarni niz u stvari autput unazad, tako da ovo treba da popravimo menjanjem binarne metode kod BinString.java fajla u:

public String binarise(int x) {
   if(x==0) return "";
   if(x%2==1) return binarise(x/2)+"1"; 
   return binarise(x/2)+"0"; 
}
    

Rekompajlirajte ovo i izvršite ponovo test i onda ćete videti:

...
Time: 0.01

OK (3 tests)
    

Što ukazuje da je sve prošlo kako treba. Pokušajte ovo, napišite komentar za ovaj niz kod BinString.java fajla:

if(s.length()==1) return ((int)(s.charAt(0)));
    

Rekompajlirajte ovaj fajl i ponovo uradite test, i onda ćete videti:

.E..E
Time: 0.01
There were 2 errors:
1) testSumFunction(BinStringTest)
java.lang.StringIndexOutOfBoundsException: String index out of range: 0
 at java.lang.String.charAt(String.java:455)
 at BinString.sum(BinString.java:13)
 at BinString.sum(BinString.java:13)
 at BinStringTest.testSumFunction(BinStringTest.java:17)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
2) testTotalConversion(BinStringTest)
java.lang.StringIndexOutOfBoundsException: String index out of range: 0
 at java.lang.String.charAt(String.java:455)
 at BinString.sum(BinString.java:13)
 at BinString.sum(BinString.java:13)
 at BinString.convert(BinString.java:7)
 at BinStringTest.testTotalConversion(BinStringTest.java:31)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

FAILURES!!!
Tests run: 3,  Failures: 0,  Errors: 2
    

Imajte na umu da nije bilo nikakvih nedostataka, a fajl je opet pao, to je zato što jeste bilo grešaka, grešaka koje su izazvane potpuno neočekivano, kao što je očekivanje grešaka u porukama, kao što je ranije prikazano. Svaki put kada niz kao što je assertEquals propadne izbaciće AssertionFailedError koji se hvata za JUnit okvir. Nekada ćete morati da testirate određeni input koji izaziva izuzetak, na primer, možemo imati metodu String manipulacije koja bi trebalo da malo osvetli izuzetak, ako se prazan niz prebaci. Možemo koristiti sledeći test koji takođe to radi:

try {
   stringmanipulationmethod("");
   fail("Should raise a someDefinedException exception here");
} catch(somedefinedException e) {
   // successful test
}
    

Ako metoda manipulacije nizom nije dovela do izuzetka, onda će programska kontrola biti usmerena na pogrešnu izjavu i dobićemo informativnu poruku nakon što izvršimo testiranje jedinice.





Published (Last edited): 21-02-2013 , source: http://supportweb.cs.bham.ac.uk/documentation/tutorials/docsystem/build/tutorials/junit/junit.html