Sunteți pe pagina 1din 11

VVSS, Lab02: Tutorial JUnit

Informatic Romn, 2015-2016/II, S03/S04

Sumar
1.

Import JUnit n proiectul Eclipse............................................................................. 2

2.

Crearea unui Test Case folosind JUnit.....................................................................2

3.

Scrierea unui Test Case folosind JUnit....................................................................4

4.

Execuia Test Case-urilor create cu JUnit................................................................4

5.

Localizarea bug-urilor. Test Case vs. Tested Method..............................................6

6.

JUnit 3 vs. JUnit 4.................................................................................................... 6

Lista de Figuri
Figure 1 Import JUnit n proiectul curent.......................................................................2
Figure 2 Fereastra de configurare a clasei care conine Test Case-ul............................2
Figure 3 Alegerea metodelor pentru care se vor genera Test Case-uri stub.................3
Figure 4 Clasa de testare generat conine metode stub pentru Test Case-uri,
adnotate cu @Test........................................................................................................ 3
Figure 5 Rularea Test Case-urilor create.......................................................................4
Figure 6 Rularea cu succes a tuturor Test Case-urilor create bara verde...................5
Figure 7 Rulare euat pentru o parte din Test Case-uri bara roie............................5

Lista de Tabele
Table 1 JUnit 3 vs. JUnit 4............................................................................................ 10

www.cs.ubbcluj.ro/~cretu

VVSS, Lab02: Tutorial JUnit

Informatic Romn, 2015-2016/II, S03/S04

1. Import JUnit n proiectul Eclipse


1. n Eclipse, click dreapta pe numele proiectului n Project
Explorer ---> Build Path ---> Configure Build Path;
2. n tab-ul Libraries se alege opiunea Add Library se selecteaz
din lista de biblioteci disponibile JUnit, apoi Next (vezi Figure 1);
3. se alegere versiunea JUnit 4, apoi Finish i Ok pentru finalizarea
importului platformei JUnit in proiectul curent.

Figure 1 Import JUnit n proiectul curent

2. Crearea unui Test Case folosind JUnit


1. n Eclipse, click dreapta de numele pachetului pentru care se
creeaz un Test Case ---> New ---> Other;
2. se extinde arborescena Java i se selecteaz JUnit pentru care
se alege Test Case ---> Next;
3. se va deschide o fereastr care permite (vezi Figure 2):
alegerea platformei de testare: JUnit 3.x sau JUnit 4.x;
stabilirea numelui clasei care va conine Test Case-ul creat
(Class Name);
(opional) se poate bifa utilizarea metodelor stub:
setUp() pentru iniializarea strii nainte de execuia
Test Case-ului;
tearDown() pentru finalizarea testului (e.g.,
revenirea la starea anterioar execuiei Test Caseului);
numele clasei care se va testa (Class under test), folosind
butonul Browse;
4. apoi Next;

www.cs.ubbcluj.ro/~cretu

VVSS, Lab02: Tutorial JUnit

Informatic Romn, 2015-2016/II, S03/S04

Figure 2 Fereastra de configurare a clasei care conine Test Case-ul

5. se va deschide o fereastr care permite (vezi Figure 3):


alegerea metodelor pentru care se creeaz Test Case-uri
stub, care se vor modifica ulterior;
se finalizeaz alegerea tuturor metodelor testate cu Finish;
6. se obine o clas de testare care va conine Test Case-uri stub
care trebuie modificate conform Test Case-urilor proiectate (vezi
Figure 4);

Figure 3 Alegerea metodelor pentru care se vor genera Test Case-uri stub

www.cs.ubbcluj.ro/~cretu

VVSS, Lab02: Tutorial JUnit

Informatic Romn, 2015-2016/II, S03/S04

Figure 4 Clasa de testare generat conine metode stub pentru Test Case-uri, adnotate cu
@Test

3. Scrierea unui Test Case folosind JUnit


1. Exemplu 1: testarea metodei getDenominator():
se declar dou atribute private de tip FractionClass n
clasa FractionClassTest:

private FractionClass fc1, fc2;

referinele se iniializeaz n metoda setUp():

fc1 = new FractionClass(15,-3);


fc2 = new FractionClass(2,17);

nainte de execuia fiecrei metode de testare se execut


metoda setUp() care va instania cele dou obiecte de tip
FractionClass; adic la rularea fiecrui Test Case vor
exista obiectele fracie 15/-3 i 2/17;
n Test Case-ul testGetDenominator() se adaug codul de
testare pentru metoda getDenominator():

int result = fc1.getDenominator();


assertTrue("getDenominator() returned " + result + "
instead of 30.", result == 30);
result = fc2.getDenominator();
assertEquals(-17, result);

dac n cadrul unui Test Case unul dintre apelurile metodei


assertAAA() eueaz, execuia Test Case-ului se ncheie
imediat, iar JUnit seteaz statusul acestuia ca failed;
2. Exemplu 2: testarea metodei simplify():
n Test Case-ul testSimplify() se adaug codul de testare
pentru metoda Simplify():

www.cs.ubbcluj.ro/~cretu

fc1.Simplify();
assertEquals(5, fc1.getNumerator());
assertEquals(-1, fc1.getDenominator());

VVSS, Lab02: Tutorial JUnit

Informatic Romn, 2015-2016/II, S03/S04

metoda permite verificarea operaiei de simplificare a


fraciei de la 15/-3 la 5/-1.

4. Execuia Test Case-urilor create cu JUnit


1. n Eclipse, avnd clasa FractionClassTest ca i clas curent,
din meniul Run ---> Run as ---> JUnit Test (vezi Figure 5);
2. Java Perspective de modific prin apariia tab-ului JUnit alturi de
Project Explorer (vezi Figure 6);

Figure 5 Rularea Test Case-urilor create

3. terminarea cu succes a rulrii Test Case-urilor duce la apariia


barei de culoare verde (vezi Figure 6) n tab-ul JUnit, altfel
aceasta are culoare roie (vezi Figure 7);

Figure 6 Rularea cu succes a tuturor Test Case-urilor create bara verde

4. presupunem c metoda testSimplify() se modific cu urmtorul


cod surs:

fc2.Simplify();
assertEquals(-5, fc2.getNumerator());
assertEquals(7, fc2.getDenominator());

5. se ruleaz clasa de testare din nou, iar Test Case-ul


testSimplify() eueaz deoarece numrtorul celei de a doua
fracii dup simplificare este tot 2 i nu 5 ct se presupune n
primul apel al metodei assertEquals(...);
6. JUnit va considera Test Case-ul testSimplify() ca avnd starea
failed (vezi Figure 7);

www.cs.ubbcluj.ro/~cretu

VVSS, Lab02: Tutorial JUnit

Informatic Romn, 2015-2016/II, S03/S04

Figure 7 Rulare euat pentru o parte din Test Case-uri bara roie

7. pentru fiecare Test Case selectat, n frame-ul din partea


inferioar (Failure Trace) sunt oferite detalii cu privire la execuie
(i.e., valoare ateptat, valoare obinut, excepii aruncate, etc.).

5. Localizarea bug-urilor. Test Case vs. Tested Method


1. bug-urile puse n eviden de execuia euat a unui Test Case
sunt determinate de erori care pot aprea n:
codul surs testat (e.g., simplify()) [Tested
Method#bug];
Test Case-ul propriu-zis (e.g., testSimplify()) [Test
Case#bug];
2. se verific dac datele de intrare din etapa de proiectare a Test
Case-ului au fost preluate corect n implementare;
dup verificare i re-execuia Test Case-ului:
success ---> pentru datele de intrare furnizate,
metoda
obine
rezultatele
ateptate
[Test
Case#bug: fixed];
failed ---> exist un bug n metoda testat
[Tested Method#bug: needs debugging].

6. JUnit 3 vs. JUnit 4


1. Junit 4 beneficiaz de introducerea adnotrilor Java (engl.
annotation);
2. Test Case-urile se pot scrie mult mai uor, deoarece nu mai
exist restricii cu privire la alegerea identificatorilor metodelor;
3. n tabelul de mai jos sunt prezentate comparativ abordrilor
existente n Junit 3.x i Junit4.x;
www.cs.ubbcluj.ro/~cretu

VVSS, Lab02: Tutorial JUnit

www.cs.ubbcluj.ro/~cretu

Informatic Romn, 2015-2016/II, S03/S04

VVSS, Lab02: Tutorial JUnit


S03/S04

Informatic Romn, 2015-2016/II,

JUnit 3

JUnit 4

Observaii

Crearea clasei Test Case


public class FractionClassTest_old extends
TestCase {
}
- orice clas de testare este derivat din TestCase

public class FractionClassTest {


}

- fr constrngeri referitoare la derivare

Adnotarea @BeforeClass
public static void setUpBeforeClass() throws
Exception {
System.out.println("Setup for all subsequent
tests...");
//setup
}

@BeforeClass
public static void setUpAll() {
System.out.println("Setup for all
subsequent tests...");
//setup
}

- metoda este denumit (obligatoriu)


setUpBeforeClass;

- metoda este precedat de adnotarea


@BeforeClass;
- fr constrngeri referitoare la stabilirea
identificatorului metodei;

metod static
ce se va executa
o singur dat,
nainte de rularea
vreunui Test Case
din clas (e.g.,
conectarea la
baza de date);

Adnotarea @AfterClass
public static void tearDownAfterClass() throws
Exception {
System.out.println("\ntearing all down");
}

@AfterClass
public static void tearDownAll() {
System.out.println("\ntearing all down");
}

- metoda este denumit (obligatoriu)


tearDownAfterClass;

- metoda este precedat de adnotarea


@AfterClass;
- fr constrngeri referitoare la stabilirea
identificatorului metodei;

metod static
ce se va executa
o singur dat,
dup rularea
tuturor Test
Case-urilor din
clas (e.g.,
deconectarea de
la baza de date );

Adnotarea @Before
public void setUp() {
fc1 = new FractionClass(12,30);
fc2 = new FractionClass(-25,7);

www.cs.ubbcluj.ro/~cretu

@Before
public void setup() {
fc1 = new FractionClass(12,30);

metod care se
va executa

VVSS, Lab02: Tutorial JUnit


S03/S04

Informatic Romn, 2015-2016/II,

fc2 = new FractionClass(-25,7);


}

- metoda este denumit (obligatoriu) setUp;

- metoda este precedat de adnotarea @Before;


- fr constrngeri referitoare la stabilirea
identificatorului metodei;

nainte de fiecare
Test Case din
clas (e.g.,
iniializarea cu
date de intrare);

Adnotarea @After
public void tearDown() {
fc1 = fc2 = null;
System.out.println(fc1);
System.out.println(fc2);
}

@After
public void teardown() {
fc1 = fc2 = null;
System.out.println(fc1);
System.out.println(fc2);
}

- metoda este denumit (obligatoriu) tearDown;

- metoda este precedat de adnotarea @After;


- fr constrngeri referitoare la stabilirea
identificatorului metodei;

metod care se
execut dup
fiecare Test
Case din clas
(e.g., tergerea/
dealocarea
variabilelor
temporare);

Adnotarea @Test
public void testSimplify() {
System.out.println("\ntestSimplify");
fc1.Simplify();
assertEquals(2, fc1.getNumerator());
assertEquals(5, fc1.getDenominator());
}

- metoda ncepe (obligatoriu) cu prefixul test


(e.g., testSimplify, testGetDenominator), altfel nu
este considerat un Test Case;

@Test
public void mySimplifyTest() {
System.out.println("\ntestSimplify");
fc1.Simplify();
assertEquals(2, fc1.getNumerator());
assertEquals(5, fc1.getDenominator());
}
- metoda este precedat de adnotarea @Test;

- fr constrngeri referitoare la stabilirea


identificatorului metodei;

metod Test
Case propriu-zis
(e.g., testeaz
comportamentul
funciei
simplify() pentru
anumite date de
intrare care, de
exemplu, au fost
iniializate ntr-o
metod setUp()
sau setup());

Adnotarea @Test (expected = <<ClassException>>.class)

www.cs.ubbcluj.ro/~cretu

VVSS, Lab02: Tutorial JUnit


S03/S04

Informatic Romn, 2015-2016/II,

public void testDivisionException(){


System.out.println("\ntestDivisionException");
fc2.setDenominator(0);
try {
fc1.div(fc2);
} catch (Exception e) {
e.printStackTrace();
assertTrue(e.getMessage().equals("Division
by zero!"));
}
}

- metoda ncepe (obligatoriu) cu prefixul test ;


- se folosete un apel assertAAA() care pune n
eviden succesul sau eecul testului;

@Test (expected = Exception.class)


public void testDivisionException() throws
Exception //passed {
System.out.println("\ntestDivisionException");
fc2.setDenominator(0);
fc1.div(fc2);
}
SAU
@Test(expected=IndexOutOfBoundsException.class)
public void outOfBounds()//passed {
new ArrayList<Object>().get(1);
}
- metoda este precedat de adnotarea @Test cu

metod Test
Case propriu-zis
care pune n
eviden
aruncarea unei
excepii

clauza expected, prin care se precizeaz tipul


excepiei ateptate la execuie;
- dac metoda testat arunc excepie, Test
Case-ul va avea starea passed;
- fr constrngeri referitoare la stabilirea
identificatorului metodei;

Adnotarea @Test (timeout = <<value>>)


@Test (timeout=10)//passed
public void testDivision() {
System.out.println("\ntestDivision");
try {
fc1.div(fc2);
} catch (Exception e) {
e.printStackTrace();
}
assertEquals(-14, fc1.getNumerator());
assertEquals(125, fc1.getDenominator());
}
SAU
@Test(timeout=100)//failed
public void infinity() {

www.cs.ubbcluj.ro/~cretu
10

metod Test
Case propriu-zis
care pune n
eviden execuia
ntr-un interval
de timp precizat

VVSS, Lab02: Tutorial JUnit


S03/S04

Informatic Romn, 2015-2016/II,


while(true);
}

- metoda este precedat de adnotarea @Test cu


clauza timeout, prin care se precizeaz timpul
maxim de execuie ateptat, exprimat n
milisecunde;
- dac la execuie timpul depete valoarea
dat, Test Case-ul va avea starea failed;
- fr constrngeri referitoare la stabilirea
identificatorului metodei;

Adnotarea @Ignore
public void ttestGetDenominator() {
System.out.println(\ntestGetDenominator);
int result = fc1.getDenominator();
assertTrue(getDenominator() returned +
result + instead of 30., result == 30);
result = fc2.getDenominator();
assertEquals(7, result);
}

- orice metod care nu are prefixul test (e.g.,


ttestGetDenominator()) nu va fi considerat un
Test Case i va fi ignorat.

@Ignore
@Test
public void testGetDenominator() {
System.out.println(\ntestGetDenominator);
int result = fc1.getDenominator();
assertTrue(getDenominator() returned +
result + instead of 30., result == 30);
result = fc2.getDenominator();
assertEquals(7, result);
}
- metoda este precedat de adnotarea @Ignore;

- fr constrngeri referitoare la stabilirea


identificatorului metodei.
Table 1 JUnit 3 vs. JUnit 4

www.cs.ubbcluj.ro/~cretu
11

metod Test
Case care va fi
ignorat la
rularea testelor
(e.g., se folosete
atunci cnd codul
surs se
modific, iar Test
Case-ul
corespunztor nu
s-a adaptat nc).

S-ar putea să vă placă și