Dio 1 – Test proces
Dio 2 – Nivoi testiranja
Dio 3 – Vrste testova i statičko testiranje
Praksa – recenzija zahtjeva DeliveryApp
Materijale priredio Erkan Islamović
erkan.islamovic@eubd.edu.ba · erkan.islamovic@gmail.com
Petnaest sedmica: svaka ima tri časa teorije i tri časa praktične nastave. Danas: poglavlje 2 (Sedmica 2, označeno). Isti primjer kroz knjigu: DeliveryApp, narudžba N-1001.
| Sed. | Poglavlje | Teorija (3 časa) | Praksa (3 časa) |
|---|---|---|---|
| 1 | Zašto testiramo | Uvodne priče; greška, defekt, otkaz; sedam principa; DeliveryApp | Tabela očekivanih cijena rukom |
| 2 | Proces i nivoi | Test proces; nivoi i V-model; vrste; statičko testiranje | Recenzija zahtjeva DeliveryApp |
| 3 | Manuelno testiranje | Test slučaj; izvještaj o defektu; istraživačko testiranje | Test slučajevi za web stranicu |
| 4 | Automatizovano testiranje | Šta automatizovati; piramida testova; prvi test | Prvi pytest |
| 5 | Jedinično testiranje | AAA; fixture, parametri, izuzeci; TDD | Testovi za dostavu i popust |
| 6 | Bijela kutija | Graf toka; pokrivenost; ciklomatska složenost | coverage.py do 100 % grana |
| 7 | Tok podataka | Definicija i upotreba; anomalije; statička analiza, mutacije | ruff, mypy, ručna mutacija |
| 8 | Crna kutija | Ekvivalencija i granice; tabela odlučivanja; stanja | Lov na pet grešaka |
| Sed. | Poglavlje | Teorija (3 časa) | Praksa (3 časa) |
|---|---|---|---|
| 9 | Model i integracija | Model; strategije integracije; API | TestClient za API |
| 10 | Sistemsko testiranje | Sistemsko; performanse i sigurnost; prihvatno i BDD | Locust, Gherkin |
| 11 | OO testiranje | Stanje objekta; nasljeđivanje; dvojnici | Narudzba, unittest.mock |
| 12 | Paralelne aplikacije | Trka podataka; zastoj; nestabilni testovi | Niti, 1000 ponavljanja |
| 13 | Web aplikacije | Web i DOM; Playwright; Page Object, pristupačnost | Playwright za DeliveryApp |
| 14 | Upravljanje testiranjem | Test plan i rizik; metrike; CI/CD | GitHub Actions |
| 15 | Alati, AI, projekat | Pregled alata; AI u testiranju; ISTQB | Odbrana projekta |
Dana 27. marta 2008. godine na londonskom aerodromu Heathrow otvoren je novi, ogroman Terminal 5, ponos britanske avijacije, napravljen za nekoliko milijardi funti. Srce terminala bio je automatski sistem za prtljag: kilometri traka i računari koji su trebali svaki kofer odvesti do pravog aviona. Prvog jutra sistem je počeo zastajati. Radnici nisu mogli ući na vrijeme jer nisu znali gdje je parking za osoblje, nekoliko traka je stalo, a softver nije znao šta da radi s koferima koji su stigli kad ih nije očekivao. Već prvog dana otkazani su deseci letova, a putnici su putovali bez prtljaga.
Prema izvještajima iz tih dana, u prvih nekoliko dana otkazano je skoro 300 letova, a oko 15 000 kofera odvojeno je od vlasnika. Sistem je prije otvaranja testiran, ali uglavnom dio po dio. Ono što nije dovoljno testirano bilo je sve zajedno: hiljade stvarnih kofera, stvarni radnici koji prvi put rade u novoj zgradi, i sve situacije koje se dešavaju u pravom jutru na aerodromu. Jedan dio sistema radio je, drugi dio je radio, ali sistem nije radio.
U poglavlju 1 naučili smo šta su defekt i otkaz i zašto testiramo, i napravili prvu tabelu očekivanih rezultata. Ovo poglavlje odgovara na pitanje kako je testiranje organizovano. Prvo upoznajemo test proces: korake od planiranja do izvještaja. Zatim nivoe testiranja, od jedne funkcije do cijelog sistema u rukama korisnika, i kako se slažu u V-model i u agilni rad. Na kraju vrste testova i statičko testiranje: pronalaženje defekata čitanjem, bez pokretanja programa. Na praktičnoj nastavi radimo recenziju zahtjeva DeliveryApp i nalazimo nejasnoću koja je promakla svima, pa i programerima.
Nakon poglavlja možete:
nabrojati aktivnosti test procesa i za svaku reći šta nastaje; izvesti iz pravila test uslove i test slučajeve i povezati ih sljedivošću; razlikovati komponentno, integraciono, sistemsko i prihvatno testiranje po cilju, osnovi, okruženju i izvršiocu; objasniti V-model i testiranje u agilnom timu; razlikovati funkcionalno i nefunkcionalno, potvrdno i regresiono testiranje i dim-test; objasniti statičko testiranje i četiri vrste recenzija; provesti recenziju zahtjeva DeliveryApp i zapisati nejasnoće; pokazati da Python zaokružuje 214,5 centi na 214 i objasniti zašto je to defekt u zahtjevu, a ne nužno u kodu.
| Čas | Sadržaj | Na času |
|---|---|---|
| Teorija 1 | 2.1–2.3 Test proces; test uslov i test slučaj; sljedivost | Od PP-4 do četiri test slučaja |
| Teorija 2 | 2.4–2.6 Nivoi; V-model; testiranje u agilnom timu | Heathrow T5: dijelovi rade, sistem ne |
| Teorija 3 | 2.7–2.9 Vrste testova; statičko testiranje; recenzije | 21,45 € → popust 2,14 € ili 2,15 €? |
Testiranje nije jedna radnja („pokreni program i vidi”), nego niz aktivnosti. ISTQB ih opisuje ovako, a mi ih pratimo na pravilu PP-4 DeliveryApp (od 30,00 € dostava je besplatna):
| Aktivnost | Pitanje | Šta nastaje (PP-4) |
|---|---|---|
| Planiranje | Šta testiramo, kako, ko, do kada, kada smo gotovi? | plan: obračun cijene testira se prvi, jer je najrizičniji |
| Praćenje i kontrola | Idemo li po planu? Šta mijenjamo? | sedmični pregled: koliko testova napisano, koliko prolazi |
| Analiza | Šta treba provjeriti? | test uslovi: „besplatna dostava na granici”, „dostava ispod granice” |
| Dizajn | Kako to provjeriti? | test slučajevi: 30,00 € na 5 km → 0,00 €; 29,99 € → 3,00 € |
| Implementacija | Šta treba pripremiti? | podaci (jelovnik, adrese), okruženje, skripte testova |
| Izvršavanje | Pokrećemo i poredimo | rezultat: prolazi / pada; izvještaj o defektu za ono što pada |
| Završetak | Šta smo naučili? | izvještaj o testiranju, arhiviran testni materijal, pouke |
Aktivnosti se ne moraju raditi strogo jedna za drugom. U agilnom timu (2.6) one se ponavljaju u svakom sprintu, za svaku korisničku priču, a neke se preklapaju. Ali svaka se mora desiti. Najčešće se preskače analiza: tester odmah piše test slučajeve, i onda pokrije ono što mu prvo padne na pamet, a ne ono što je važno.
Sve što testiranje proizvede (plan, uslovi, slučajevi, podaci, skripte, izvještaji) zove se testni materijal (testware). Čuva se kao i kod: u Gitu, s verzijama.
Tri pojma vode od pravila do testa:
| Test uslov (iz PP-4 i PP-5) | Test slučaj | Ulaz | Očekivano |
|---|---|---|---|
| TU-4.1 besplatno od 30,00 € | TS-4.1a | artikli 30,00 €, 5 km | dostava 0,00 € |
| TU-4.1 | TS-4.1b | artikli 32,00 €, 2,5 km (N-1002) | dostava 0,00 €, ukupno 32,00 € |
| TU-4.2 plaća se ispod 30,00 € | TS-4.2a | artikli 29,99 €, 5 km | dostava 3,00 € |
| TU-4.3 besplatno gleda iznos prije popusta | TS-4.3a | artikli 32,00 €, 2,5 km, STUDENT10 | dostava 0,00 €; popust 3,20 €; ukupno 28,80 € |
Posljednji red je zanimljiv. Poslije popusta artikli koštaju 28,80 €, ispod 30,00 €. Da je pravilo glasilo „gleda iznos poslije popusta”, dostava bi se plaćala. PP-5 kaže „prije popusta”, pa je dostava besplatna. Bez ovog test uslova, takav detalj lako promakne i programeru i testeru.
Jedan test uslov obično ima više test slučajeva (granica i vrijednost daleko od granice), a jedan test slučaj ponekad pokriva više uslova.
Sljedivost znači da se za svaki test zna koje pravilo provjerava, i za svako pravilo koji ga testovi provjeravaju. Pravi se kao tabela, matrica sljedivosti:
| Pravilo | Test uslovi | Test slučajevi | Stanje |
|---|---|---|---|
| PP-1 | TU-1.1 odbija ispod 5,00 €; TU-1.2 prima od 5,00 € | TS-1.1a (4,99 €), TS-1.2a (5,00 €) | 2 / 2 prolaze |
| PP-2 | TU-2.1 do 3 km; TU-2.2 započeti km | TS-2.1a (3 km), TS-2.2a (3,1 km), TS-2.2b (4,2 km) | 3 / 3 |
| PP-4 | TU-4.1, TU-4.2, TU-4.3 | TS-4.1a, TS-4.1b, TS-4.2a, TS-4.3a | 4 / 4 |
| PP-6 | TU-6.1 otkazivanje dozvoljeno u NOVA i PRIHVAĆENA; TU-6.2 nije u U_PRIPREMI | … | … |
Sljedivost odgovara na tri pitanja koja tester stalno dobija:
Odgovori: tipka R ili klik na zamućeno polje.
Sistem se testira na više nivoa, od najmanjeg dijela do cijelog sistema u rukama korisnika. Svaki nivo ima svoj cilj, osnovu, okruženje i izvršioca:
| Nivo | Šta testiramo | Test baza | Ko obično | Primjer u DeliveryApp |
|---|---|---|---|---|
| Komponentno (jedinično) | jednu funkciju, klasu ili modul, izolovano | kod, dizajn | programer | cijena_dostave(4.2, 2150) == 300 |
| Integraciono | saradnju komponenti ili sistema | arhitektura, API ugovor | programer, tester | API prima narudžbu i upisuje je u bazu |
| Sistemsko | cijeli sistem, s kraja na kraj | zahtjevi, slučajevi korištenja, NZ | tester | kupac naruči kroz aplikaciju, restoran prihvati, dostavljač preda |
| Prihvatno | da li sistem odgovara korisniku i poslu | potrebe korisnika, ugovor, propisi | korisnici, naručilac | vlasnik Picerije R-1 jedan dan radi sa DeliveryApp |
Na integracionom nivou razlikuju se dvije vrste: integracija komponenti (dijelovi našeg sistema: API i baza) i integracija sistema (naš sistem i tuđi: DeliveryApp i sistem plaćanja, servis mapa).
Prihvatno testiranje ima nekoliko oblika: korisničko (UAT, user acceptance testing: rade li krajnji korisnici svoj posao?), operativno (mogu li ljudi koji održavaju sistem napraviti kopiju, vratiti je, pratiti sistem?), ugovorno i regulatorno (ispunjava li ugovor i zakon, npr. o zaštiti podataka) i alfa i beta testiranje (alfa: korisnici probaju u našem okruženju; beta: odabrani korisnici koriste sistem kod sebe prije zvaničnog početka).
Priča s Heathrowa je udžbenički primjer šta se desi kad su niži nivoi dobro pokriveni, a sistemsko i operativno prihvatno testiranje nisu urađeni u stvarnim uslovima: s pravim brojem kofera, s radnicima koji prvi put rade u zgradi, sa svim neočekivanim situacijama jednog jutra.
Slika iz života: gradnja automobila. Komponentno testiranje provjerava kočnicu na stolu. Integraciono provjerava kočnicu spojenu s papučicom i točkom. Sistemsko provjerava cijeli auto na poligonu. Prihvatno je kad kupac proba auto u svom gradu i kaže „to je to”.

V-model crta razvoj i testiranje kao slovo V. Lijeva strana se spušta od opšteg ka detaljnom (zahtjevi korisnika, zahtjevi sistema, arhitektura, detaljan dizajn, kod), a desna se penje od detaljnog ka opštem, s testovima koji provjeravaju svaku lijevu fazu:
| Lijevo (šta odlučujemo) | Desno (kako provjeravamo) |
|---|---|
| potrebe i zahtjevi korisnika | prihvatno testiranje |
| zahtjevi sistema | sistemsko testiranje |
| arhitektura | integraciono testiranje |
| detaljan dizajn i kod | komponentno testiranje |
Najvažnija ideja V-modela nije oblik slova, nego to da se test planira i dizajnira u istom trenutku kad nastaje ono što provjerava. Kad analitičar napiše PP-4, tester odmah piše TS-4.1a i TS-4.2a. Ako pri tome pita „a šta je s tačno 30,00 €?”, nejasnoća se ispravlja dok je to samo rečenica. Ovo je princip 3 iz poglavlja 1 (rano testiranje), nacrtan.
U agilnom timu (Scrum, poglavlje 2 udžbenika Projektovanje informacionih sistema) sistem se pravi u kratkim sprintovima od dvije sedmice, a svaki sprint mora dati inkrement koji radi. Testiranje se zato ne ostavlja „za kraj projekta”, nego se radi u svakom sprintu, za svaku priču:
Ovaj pristup se zove i pomjeranje ulijevo (shift left): na vremenskoj liniji projekta testiranje se pomjera s kraja prema početku. Postoji i pomjeranje udesno (shift right): testiranje i praćenje sistema i poslije isporuke, u radu, kroz nadzor i postepenu isporuku (CrowdStrike, poglavlje 1).
Ni u agilnom timu nivoi ne nestaju. Komponentni, integracioni, sistemski i prihvatni testovi postoje i dalje, samo se rade u malim komadima, stalno.
„U agilnom timu nema testera, programeri sve testiraju sami.” Programeri pišu mnogo testova, ali pogled testera (šta bi moglo poći naopako, šta korisnik zaista radi) i dalje je potreban. Nekad ga nosi posebna osoba, nekad cijeli tim, ali ga ne smije nestati.
Odgovori: tipka R ili klik na zamućeno polje.
Nivo kaže gdje testiramo. Vrsta kaže šta testiramo:
| Vrsta | Pitanje | Primjer u DeliveryApp |
|---|---|---|
| funkcionalno | Radi li sistem ono što treba? | cijena dostave po PP-2 do PP-4 |
| nefunkcionalno | Kakav je dok to radi? | 95 % odgovora ≤ 2 s (NZ-1), kontrast (NZ-4), sigurnost (NZ-3) |
| bijela kutija | Je li prošao svaki dio koda? | svaki if u cijena_dostave izvršen u oba smjera (poglavlje 6) |
| crna kutija | Radi li po specifikaciji, bez gledanja koda? | granice 3 km, 10 km, 30,00 € (poglavlje 8) |
| potvrdno | Je li ispravljen defekt zaista ispravljen? | ponovo pokrenut test za 30,00 € poslije ispravke |
| regresiono | Je li izmjena pokvarila nešto drugo? | poslije ispravke popusta, ponovo svi testovi cijene |
| dim-test | „Diše” li sistem uopšte? | aplikacija se otvara, jelovnik se učitava, N-1001 košta 24,50 € |
Razlika između potvrdnog i regresionog testiranja važna je i često se brka. Potvrdno testiranje provjerava isto mjesto: test koji je pao sada prolazi. Regresiono provjerava sva ostala mjesta: da popravka česme nije poplavila kupatilo. Programer koji ispravi > u >= u PP-4 može slučajno promijeniti i nešto drugo; regresioni testovi to uhvate. Zato se regresioni testovi skoro uvijek automatizuju i pokreću pri svakoj izmjeni (poglavlje 4).
Dim-test (smoke test) je kratak skup od nekoliko testova najvažnijih funkcija, koji se pokrene odmah poslije isporuke nove verzije. Ime dolazi iz elektronike: kad se novi uređaj prvi put uključi, prvo se gleda da li se dimi. Da je Knight Capital imao dim-test koji provjerava da li svih osam servera radi istu verziju, priča iz poglavlja 1 bi bila kraća.
Do sada smo testirali pokretanjem programa: to je dinamičko testiranje. Ali mnogo defekata može se naći bez pokretanja, čitanjem dokumenata i koda ili alatima koji kod analiziraju. To je statičko testiranje, i ono je najjeftinije, jer nalazi defekte najranije, često prije nego što kod uopšte postoji.
Statičko testiranje nalazi stvari koje dinamičko teško nalazi:
Primjer iz DeliveryApp pokazuje snagu statičkog testiranja. PP-5 kaže da STUDENT10 daje 10 % popusta. Recenzent pita: 10 % od 21,45 € je 2,145 €; da li je popust 2,14 € ili 2,15 €? U pravilu to ne piše. A kod DeliveryApp koristi Pythonovu funkciju round, koja zaokružuje „na parno” (banker's rounding): broj tačno na pola zaokruži prema parnom broju. Zato je popust(2145, "STUDENT10") jednako 214 centi (2,14 €), a popust(2155, "STUDENT10") jednako 216 centi (2,16 €). Većina ljudi bi u školi naučila da se 214,5 zaokružuje na 215.
Je li to defekt u kodu? Ne nužno. To je defekt u zahtjevu: pravilo ne kaže kako se zaokružuje, pa programer nije imao po čemu da odluči. Kupac koji ručno izračuna 2,15 € i vidi 2,14 € mogao bi pomisliti da ga aplikacija vara za cent. Statičko testiranje je ovo našlo čitanjem, a ispravka je jedna rečenica u PP-5 („popust se zaokružuje na cijeli cent, pola centa naviše”) i jedan red koda.
Pitanje zaokruživanja novca nije sitnica. Zakoni i pravila mnogih zemalja tačno propisuju kako se zaokružuju porezi i cijene, a banke i fiskalne kase moraju to raditi isto, jer cent na milion računa postaje deset hiljada eura.
Recenzija je pregled dokumenta ili koda od strane drugih ljudi, radi pronalaženja defekata i poboljšanja. Recenzije se razlikuju po formalnosti:
| Vrsta | Kako izgleda | Kada |
|---|---|---|
| neformalna | kolega pogleda izmjenu i kaže šta misli | svakodnevno, npr. pull request |
| prolaz (walkthrough) | autor vodi grupu kroz dokument i objašnjava | da tim razumije i nađe pitanja |
| tehnička recenzija | stručnjaci pregledaju po listi i dogovore odluke | arhitektura, važni dizajn |
| inspekcija | najformalnija: uloge (moderator, čitač, zapisničar), lista, mjerenje broja nađenih defekata | sigurnosno kritičan softver |
Bez obzira na vrstu, dobra recenzija ima nekoliko pravila:
Lista za pregled pravila DeliveryApp, koju koristimo na praktičnoj nastavi:
| Pitanje | Primjer nalaza |
|---|---|
| Šta je tačno na granici? | PP-2: tačno 3 km? (jasno: 2,00 €) PP-4: tačno 30,00 €? (jasno: „i više”) |
| Kako se zaokružuje? | PP-5: 10 % od 21,45 € nije rečeno |
| Šta s praznim, nultim, negativnim? | PP-3: 0 km je dozvoljeno; da li je adresa restorana u restoranu (0 km) moguća narudžba? |
| Ima li protivrječnosti? | PP-4 i PP-5: koji iznos gleda besplatna dostava (riješeno: prije popusta) |
| Šta nedostaje? | Šta ako restoran ne odgovori? Šta ako se jelo rasproda dok je u korpi? |
| Može li se testirati? | „Dostava mora biti brza” bi pala; PP-2 je provjerljiv |
Odgovori: tipka R ili klik na zamućeno polje.
Cilj je provesti pravu recenziju pravila DeliveryApp, zapisati nalaze, potvrditi jedan nalaz u kodu i napraviti matricu sljedivosti. Radi se u grupama od četiri studenta, a rezultati idu u repozitorij deliveryapp-testovi.
SADRZAJ.md (ili uvoda knjige).recenzija.md:| ID | Pravilo | Nalaz | Vrsta | Ozbiljnost | Prijedlog |
|---|---|---|---|---|---|
| R-01 | PP-5 | nije rečeno kako se zaokružuje 10 % (npr. 21,45 € → 2,145 €) | nejasnoća | srednja | „zaokružuje se na cijeli cent, pola naviše” |
Vrste: nejasnoća, nedostaje, protivrječnost, neprovjerljivo. Ozbiljnost: niska, srednja, visoka.
Provjerite nalaz o zaokruživanju u Pythonu:
>>> from deliveryapp import popust
>>> popust(2145, "STUDENT10")
214
>>> popust(2155, "STUDENT10")
216
>>> round(214.5), round(215.5), round(2.5), round(3.5)
(214, 216, 2, 4)Zapišite u recenzija.md zašto je ovo defekt u zahtjevu i šta bi trebalo promijeniti i u pravilu i u kodu. (U Pythonu se zaokruživanje „pola naviše” za pozitivne cijele cente može napisati kao (iznos * procenat + 50) // 100; provjerite da za 2145 daje 215.)
Napišite listu od pet koraka dim-testa koji bi se pokretao odmah poslije svake nove verzije DeliveryApp. Za svaki korak navedite očekivani rezultat (npr. „N-1001 u pregledu korpe pokazuje 24,50 €”).
Dajte AI asistentu pravila PP-1 do PP-6 i zatražite: „Kao recenzent zahtjeva, nađi nejasnoće, nedostatke i protivrječnosti.” Uporedite s nalazima svoje grupe. Koji nalaz je našao AI, a grupa nije, i obrnuto? Provjerite svaki AI nalaz: je li zaista nejasnoća, ili AI nije pažljivo pročitao pravilo (npr. tvrdi da nije rečeno šta je s tačno 30,00 €, iako PP-4 kaže „i više”)?
Rezultat koji se predaje: recenzija.md s najmanje deset nalaza i odlukama, potvrdom nalaza o zaokruživanju, tabelom test uslova i slučajeva, matricom sljedivosti s nivoima i dim-testom od pet koraka.
Rješenja su sakrivena – tipka R ili klik na okvir.
U kojoj aktivnosti test procesa nastaje: a) odluka da se obračun cijene testira prvi; b) tabela „30,00 € na 5 km → 0,00 €”; c) baza s izmišljenim jelovnikom za testove; d) izvještaj da je od 40 testova 38 prošlo; e) zaključak da treba više testova za popust jer je tamo nađeno najviše defekata.
a) planiranje; b) dizajn; c) implementacija; d) izvršavanje (i praćenje); e) završetak (pouke) ili kontrola.
Na kojem nivou je test? a) popust(8000, "STUDENT10") == 500; b) DeliveryApp šalje iznos sistemu plaćanja i dobija potvrdu; c) kupac kroz aplikaciju naruči N-1001, restoran je prihvati, dostavljač preda; d) vlasnik R-2 tri dana koristi DeliveryApp u svom restoranu.
a) komponentno; b) integraciono (integracija sistema); c) sistemsko; d) prihvatno (korisničko, odnosno beta, ako je prije zvaničnog početka).
Programer je ispravio defekt da kod student10 (mala slova) ne daje popust. Tester pokreće: a) test s student10; b) sve testove obračuna cijene; c) test N-1001 sa STUDENT10. Koji je potvrdni, a koji regresioni?
a) potvrdni (isto mjesto: provjerava ispravku). b) regresioni (sve ostalo). c) regresioni (provjerava da je raniji, ispravan slučaj i dalje ispravan).
Napišite tri test uslova za PP-5 i za svaki jedan test slučaj s očekivanim rezultatom.
TU-5.1 važeći kod daje 10 %: artikli 21,50 € sa STUDENT10 → popust 2,15 €. TU-5.2 velika i mala slova i razmaci se zanemaruju: " student10 " na 21,50 € → 2,15 €. TU-5.3 gornja granica 5,00 €: artikli 80,00 € → popust 5,00 € (ne 8,00 €). (Prihvatljivi su i nepoznat kod → 0,00 € i popust ne dira dostavu.)
Za iznose artikala 21,45 €, 21,55 € i 21,65 € izračunajte popust od 10 % „školski” (pola naviše) i kako ga računa Python round. U kojim slučajevima se razlikuju?
10 % su 2,145, 2,155 i 2,165 €, odnosno 214,5, 215,5 i 216,5 centi. Školski: 215, 216, 217 centi. Python round (na parno): 214, 216, 216 centi. Razlikuju se za 21,45 € (214 umjesto 215) i 21,65 € (216 umjesto 217); za 21,55 € su isti (216).