Za program Triangle Analysis implementirati i ispitati test slučajeve definisane u Excel fajlu. Na kraju istog fajla se nalazi i zadatak u kome je potrebno osmisliti test scenario i implementirati ga.
Nakon što rešite zadatak, možete uporediti svoje rezultate sa ponuđenim rezultatima, kao i kod sa ponuđenim rešenjem
Za kod sa slike odredi tabelu LCSAJ sekvenci. Obavezno je dati kratak komentar za svaki unos u tabeli. Nije potrebno kreirati test primere na osnovu kreirane tabele.
Odgovor:
Krećemo od definicije metode, što je u ovom kodu linija 1
.
Postoje 2 pristupa za obeležavanje skoka:
}
)Na ovom kursu koristimo 2. pristup. Tim pristupom je omogućeno da se skok izvrši na komentar ili praznu liniju.
Kada završimo inicijalnu identifikaciju sekvenci koje kreću od definicije metode, naredne sekvence započinjemo
od linija na koje je izvršen skok (u tabeli, to su vrednosti u koloni Skok
).
Početne sekvence u nekim pristupima kreću od definicije metode, a u drugim od prve linije tela te metode. Radi jednostavnosti i usklađenosti, na ovom kursu je izabran prvi pristup.
Kada iscrpimo sve mogućnosti za sekvence koje počinju sa jednom od tih vrednosti (iz koloneSkok
), prelazimo na sledeću vrednost.
Oznaka sekvence | Početak sekvence | Kraj sekvence | Skok | Komentar |
---|---|---|---|---|
s01 | 01 | 05 | 20 | skok u 5. liniji jer uslov i < words.size() nije ispunjen |
s02 | 01 | 09 | 14 | skok u 9. liniji jer uslov j < words.size() nije ispunjen |
s03 | 01 | 10 | 13 | skok u 10. liniji jer uslov word.equals(words.get(j)) nije ispunjen |
s04 | 01 | 13 | 09 | došlo je do linearnog izvršenja kroz oba for -a i if . Pošto je izvršeno telo unutrašnje petlje, imamo skok na njen početak radi provere uslova |
s05 | 20 | 23 | -1 | return -om na 23. liniji izlazimo iz metode |
s06 | 14 | 15 | 19 | skok u 15. liniji jer uslov count > maxCount nije ispunjen |
s07 | 14 | 19 | 05 | uslov count > maxCount je ispunjen pa se kod izvršava do kraja petlje, nakon čega sledi skok na 5. liniju radi provere uslova |
s08 | 13 | 13 | 09 | sekvenca kreće od 13. linije, ali pošto je reč o kraju petlje, samo vršimo skok na početak petlje, tj. na 9. liniju |
s09 | 09 | 09 | 14 | izvršava se 9. linija, utvrđuje se da uslov j < words.size() nije ispunjen pa sledi skok |
s10 | 09 | 10 | 13 | skok u 10. liniji jer uslov word.equals(words.get(j)) nije ispunjen |
s11 | 09 | 13 | 09 | cela unutrašnja petlja je izvršena pa se vrši skok sa njenog kraja na početak |
s12 | 19 | 19 | 05 | sekvenca kreće od 19. linije, ali pošto je reč o kraju petlje, samo vršimo skok na početak petlje, tj. na 5. liniju |
s13 | 05 | 05 | 20 | izvršava se 5. linija, utvrđuje se da uslov i < words.size() nije ispunjen pa sledi skok |
s14 | 05 | 09 | 14 | skok u 9. liniji jer uslov j < words.size() nije ispunjen |
s15 | 05 | 10 | 13 | skok u 10. liniji jer uslov word.equals(words.get(j)) nije ispunjen |
s16 | 05 | 13 | 09 | kod se linearno izvršavao do kraja unutrašnje petlje nakon čega je usledio skok na 13. liniji (povratak na proveru uslova) |
Oznaka greške | Greška | Opis | Rešenje / Savet |
---|---|---|---|
e01 | Završavanje sekvence u poslednjoj liniji nekog bloka (npr. pre } u if -u) |
Sekvence: (1, 11, 13), (9, 11, 13), (14, 17, 19), … | Kada se linije izvršavaju jedna za drugom, kao što je slučaj pri prolazu kroz if u datom primeru, nema prekida sekvence kada je uslov ispunjen. Ispravne sekvence iz primera (respektivno): s04, s11, s07 |
e02 | Skok na liniju koja se nalazi pre linije na koju treba skočiti | Sekvenca (1, 5, 19) nije ispravna jer je 19. linija deo koda koji se preskače | Sekvenca (1, 5, 20) je ispravna jer kod preskače 19. liniju koja je deo datog iskaza i skače na 20. liniju, od koje neka naredna sekvenca treba da nastavi izvršenje koda |
e03 | Ignorisanje return iskaza na kraju metoda |
return mostCommonWord na 23. liniji iz datog primera. Loše identifikovana sekvenca: (20, 24, -1) |
(20, 23, -1) je ispravna sekvenca zato što dolazi do izlaska iz metode nakon izvršenja ovog iskaza. Ovo je slična situacija sa primerom koji sadrži break , dolazi do skoka pa se na tom mestu završava sekvenca |
e04 | Izostavljena sekvenca za true odluku |
Pronađu se sekvence s01, s02, ali ne i sekvence u kojima je j < words.size() ispunjeno |
Uzeti u obzir situaciju kada je j < words.size() ispunjeno. Tada možemo ući u telo petlje koje sadrži if . On može imati skok ukoliko njegov uslvo nije ispunjen pa imamo 2 moguće sekvence: jednu u kojoj dolazi do tog skoka i drugu u kojoj ne dolazi do njega, tj. s03 i s04 |
e05 | Nisu identifikovane sekvence koje se nastavljaju na neki skok | Identifikovali smo sekvencu s02, tj. (1, 9, 14), ali nismo identifikovali sekvence koje nastavljaju na ovu sekvencu, počevši od 14. linije | Tamo gde jedna linearna sekvenca treba da skoči, druga počinje. Tačnije, mi skačemo sa jedne na drugu. Ako trebamo da skočimo dalje na 14. liniju, to onda znači da ćemo imati barem jednu sekvencu koja će početi od ove linije. Primer sekvenci koje možemo identifikovati: s06, s07 |
e06 | Linearna sekvenca je nemoguća jer sadrži skok | Sekvenca (5, 15, 19) nije moguća jer nije reč o linearnoj sekvenci | Da bismo došli do 15. linije, potrebno je da prođemo for , a on sadrži uvek skok: skok koji zaobilazi telo petlje (kada je uslov false ) i skok kojim se nakon izvršenog tela petlje vraćamo na proveru uslova (kada je uslov true ). To znači da nikada ne bismo imali linearnu sekvencu do 15. linije |
e07 | Nije identifikovana sekvenca čija početna linija sadrži odluku | Neka je identifikovana sekvenca s16, tj. (5, 13, 9). To znači da treba da se nastavi na sekvencu koja počinje sa 9. linijom. Jedna od takvih sekvenci je sekvenca s09, tj. (9, 9, 14). U toj sekvenci izvršavamo 9. liniju, ali pošto uslov j < words.size() nije ispunjen, dolazi do skoka na 14. liniju |
Obratiti pažnju kod ovakvih slučajeva. Ukoliko se kreće od linije koja sadrži odluku, uvek ćemo imati sekvencu dužine 1 (slučaj kada se taj iskaz odluke evaluira na false ) |
e08 | Nije identifikovana sekvenca koja počinje i završava se sa krajem petlje | Sekvenca s08, tj. (13, 13, 9) je sekvenca u kojoj nemamo nikakav konkretan kod. Sadrži samo } koje predstavlja kraj scope-a tela petlje i nakon njegovog izvršavanje potrebno je izvršiti skok nazad na početak petlje. |
Ove sekvence se najčešće javljaju kada sledeća linija nakon izlaska iz nekog bloka skokom predstavlja liniju kojom se završava petlja. Tada je početak ujedno i kraj, a onda se vrši skok na početak petlje kako bi se proverio uslov |
e09 | Nevalidno definisanje skoka za izlazak iz metode | Sekvence (20, 24, 24) ili (20, 23, 24) nisu validne jer tada nije potrebno da se izvršenje vrati na 24. liniju, koja je deo tela metode, već da se preusmeri pozivaocu date metode. Dolazi do izlaska iz metode | Ukoliko imamo skok iz metode, kao što je return ili dolazak do kraja tela te metode (} ), taj skok obeležavamo sa -1 , END ili kraj . Sekvenca se završava skokom |
e10 | Skok na pogrešan deo koda | Vrši se skok na deo koda koji nije u blizini odgovarajuće linije na koju treba skočiti. Na primer, sekvenca od 1 do 13 se greškom skoči na 5. liniju umesto na 9. liniju pošto se dati skok odnosi na unutrašnju petlju. | Ovakve greške se najčešće javljaju slučajno kada pomešamo kontekste / scope u žurbi. Zbog toga ovakve situacije u kojima imamo neke skokove na neke ranije linije treba pažljivo analizirati. Praćenje linije koju crta IDE između početka i kraja bloka može da nam olakša ovakve situacije |
e11 | Izostavljena sekvenca za false odluku |
||
e12 | Sekvenca se završava na pogrešnoj liniji | (1, 9, 13) umesto (1, 10, 13) | |
e13 | Više sekvenci koje se razlikuju samo po skoku | (1. 9, 13) i (1. 9, 15) | |
e14 | Skok je linija nakon kraja sekvence (ne odnosi se na GOTO) | ||
e15 | Nije definisana sekvenca, tj. trojka (početak, kraj, skok) |
Koliko nam testova treba za 100% Statement Coverage, a koliko za 100% Decision Coverage?
if (a > b) { // L1; O1
if (a > c) { // L2; O2
if (a > d) { // L3; O3
if (a > e) { // L4; O4
System.out.println("a je najveci broj"); // L5
} // L6
} // L7
} // L8
} // L9