Vous êtes sur la page 1sur 14

Apstraktni tipovi podataka

Pojam tipa. Apstraktni kontretni tipovi


= Pojam tipa: za ovo nisam 100% siguran, to moram jos da proverim
Struktura podatka i tip podatka jesu dva modela organizacije podataka. Ova dva
modela su suprotstavljeni s obzirom na opti pristup njihovom razmatranju.
1. Aktuelistiki pristup podrazumeva da je neka kategorija unapred zadata. Na
primer, broj tri se aktuelistiki zadaje tako to definie samog sebe.
2.
dobijanja.

Konstruktivistiki pristup

kategoriju posmatra kroz proces njenog algoritamskog

Ako posmatramo niz X od etiri elementa: -1, 3, 0 i 2, aktuelistikim pristupom


doi emo do strukture podataka. Konstruktivistiki bi trebalo smisliti nain da niz zadamo
procesom njegovog konstruisanja smiljajui operacije. Na primer, neka operacija
Asgn(niz, indeks, vrednost) kao rezultat daje niz. Uveemo i apstraktnu konstantu
nula_niz.
Niz
X
konstruktivistiki
dobijamo
na
sledei
nain:
X = Asgn(Asgn(Asgn(Asgn(nula_niz, 1, -1), 2, 3), 3, 0), 4, 2). Ovo je karakteristino za
tipove podataka.
= Znaci tip podatka je u stvari model organizacije podataka koji
konstruktuvisticki pristupa razmatranju organizacije podataka.
Tipove podataka delimo na apstraktne i konkretne. Apstraktni odgovaraju logikim
strukturama, a konkretni fizikim strukturama. Dakle apstraktni i konkretni tipovi stoje u
odnosu kao logika i fizika struktura podataka.
Istom apstaktnom tipu se moe pridruiti vie konkretnih, tj. jedan apstraktni tip
se moe konkretizovati na vie naina.
= Dakle apstraktni tipovi su ono kako mi logicki zamisljamo tip podatka, a
konkretni je nacin na koji realizujemo dati ATP (apstraktni tip podataka). Znaci Apstrktni
tip graf mozemo konkretno realizovati na racunaru na vise nacina.
Signatura i specifikacija tipa
Apstraktni tip definiu sledee stavke (paralelno je dat i primer definisanja take u
Dekartovom sistemu u ravni):

Tacka
naziv tipa

real
primitivni tipovi

- iz kojih se izvodi dati tip


Create(x,y: real): Tacka

- naziv (koji moe biti i


simbol), domen (argumenti operacije sa GetX(t: Tacka): real
svojim tipovima) i kodomen (tip
GetY(t: Tacka): real
rezultata operacije)
sintaksa operacija

Displ(t: Tacka): real

Naziv tipa, primitivni tipovi i sintaksa operacija ine signaturu tipa koja je isto
formalna, bez ikakvog znaenja. Primetimo da je data samo sintaksa operacija koja ne
odreuje i ta data operacija radi.
Da bi tip bio do kraja definisan, treba dodati opis oeracija i to tako to signaturi
pridruujemo aksiome koje moraju zadovoljiti date operacije. Dakle, apstraktni tip se
sastoji od signature i skupa aksioma. Sinonim za apstraktni tip je specifikacija tipa.
Evo nekih primera aksioma:
A <=> za svako

(A x,y :Real)GetX(Create(x,y))=y
(A x,y :Real)GetY(Create(x,y))=y
(A t :Tacka)Displ(t)=sqrt(GetX2(t) + GetY2(t))
= znaci da je signatura tipa ustvati samo ime tipa i opis primitivnih tipova i
sintaksne operacije. Dakle signatura tipa (sintaksni opis tipa) nije dovoljan da se u
potpunosti opishe ATP. Da bi tip bio do kraja definisan opisujemo operacije aksiomama i
tako dobijamo specifikaciju tipa. Dakle kompletan opis ATP je specifikacija tipa.
Genericki tipovi
Generiki tipovi (tipovi koji su parametrizovani drugim tipovima), tip ima za
parametar drugi tip ili vie tipova. Genericki tipovi slue da se njima obuhvate svi
apstraktni tipovi a istim ili slicnim opisom.
Na primer, za stack moramo znati koji je stack u pitanju, da bi funkcija Top mogla
vratiti vrednost. Zato zadajemo neki tip T prilikom deklaracije funkcije
(Top(s: Stack) : T), a njega definiemo kasnije ve prema potrebi. Generiki tip se

oznaava uglastim zagradama, npr. Stack[T]. Dakle, za generike tipove vai da je bar
jedan tip iz definicije nedoreen i dato mu je samo ime.
U C-u pimer je niz, jer je on generiki tip podataka (Svi nizovi imaju jednu istu
operaciju-Indexiranje).

Testiranje programa
Definicija specifikacije konkretnog programa arene test-skupa
= I ovde nisam bas siguran kako tacno treba ukmbinovati sve ovo dole napisao da
bi se u potpunosti odgovorilo na pitanje
Specifikacija jeste precizan opis onoga ta program treba da radi. Drugaije
reeno specifikacija S povezuje skup ulaza X sa skupom izlaza Y, tj. S = X Y.
Specifikaciona relacija izmeu X i Y i oznaava se sa [S]. Ako je specifikaciona relacija
[S] X Y, onda je X domen specifikacije i obuhvata sve ulazne podatke za koje se
program zavrava.
Korektan program je onaj za koji je dom([P] [S]) = dom([S]). Dakle program
mora da se zaustavi i d izlaz obuhvaen skupom S, ne moe da obuhvati neto to nije
sadrano u specifikaciji.
Testiranje se izvodi nad skupom ulaza D. Skup ulaza je podskup skupa svih
moguih ulaznih podataka.
Dakle, testiramo program P raen u skladu sa specifikacijom S ulaznim podacima
D. Ureena trojka (P, S, D) se zove arena.
Testna stavka (eng. test case) je primerak skupa ulaznih podataka takav da moe
da pokrene program. Prilikom testiranja, od svih moguih testnih stavki biramo jedan
skup kojim proveravamo program. Taj skup se zove test skup (eng. test set).

Testiranje programa bez primene racunara


= Ovde takodje moram da skontam sta je BDA, ali po nekoj logici stvari to bi
trbalo da bude onaj diagram programa.
Ovaj postupak obavljaju ljudi bez primene raunara. U originalnom obliku se
vrila analiza BDA, a danas se ovaj metod svodi na traenje greke analizom teksta. Na
ovaj nain se moe otkriti 30-70% greaka (danas i do 82%). Sigurno se ne mogu otkriti
suptilne greke.

Kada je u pitanju testiranje, koriste se meovite metode. Analizom kda se saznaje da


postoji greka i ona se odmah locira. Analiza programa bez primene raunara ima dve
metode:
1. analiza programskih segmenata (eng. code inspection) i
2. simulacija raunara (eng. walkthrough).
Kod analize segmenata ideja je da program podelimo prema nekom kriterijumu na logiki
zaokruene celine. Ova analiza se radi timski, u timovima sa tri do pet ljudi. Tim
sainjavaju:
moderator vodi sesije (sastanke). Moderator je, po pravilu, strunjak za
programiranje, a poeljno je i da je strunjak za kvalitet softvera;

autor(i) programa ne testiraju program, samo objanjavaju delove kda i sl. i

lanovi (uglavnom dva) koji vre testiranje programa.

Kod metode simulacije raunara, umesto deljenja programa na segmente, proveravaju se


trase izvravanja programa. Preporuka za sastav tima bi bila:

moderator vodi sesije;

sekretar belei greke;

izvoa testa;

dva lana koji proveravaju izvoaa i

autor(i) programa samo objanjavaju nejasne delove programa.

Testiranje bez primene raunara se koristi na poetku procesa testiranja koji se ne sme
zavriti samo na ovoj metodi. Takoe se koristi ako u daljem testiranju nekom drugom
metodom otkrijemo da postoje greke.

Metode bele kutije za testiranje


Ranije je ova metoda bila bazirana na poznavanju BDA. Dodue, u praksi je jako
teko osloniti se na BDA, jer se odavno gotovo uopte ne piu. Ova strategija ima vie
metoda.
Da bismo testirali svaku od njih, uzeemo za primer sledei BDA:

Metoda prekrivanja naredbi


Test skup se formira tako da se obezbedi da se svaki funkcionalni vor izvri bar
jednom. Na primer: A = 2, B = 0, a X uzima proizvoljne vrednosti. Ova metoda se
karakterie tim da je najjednostavnija u smislu da se test najlake definie. Takoe, ova
metoda je i najmanje efikasna.
Poznato je gde se prave logike greke. One se retko prave na naredbama, ee
na odlukama.
Metoda prekrivanja odluka
Odluka u programu je ekvivalentna celom simbolu odluke u BDA. Ova metoda je
koncipirana tako da odaberemo test skup koji obezbeuje da svaka odluka bude izvrena
(i tano i netano). Test skup bi bio: A = 0, B je proizvoljno i X = 0; A = 2, B = 0 i X
je proizvoljno.
Metoda prekrivanja uslova
Uslovi su ono to se nalazi unutar simbola odluke na BDA. Ova metoda uslove
posmatra nezavisno. Test skup je takav da obezbedi da svaki uslov jednom bude taan i
jednom netaan. Test skup bi bio: A = 1, B = 0 i X = 3; A = 2, B = 1 i X = 0.
Metoda prekrivanja odluka-uslova
Ovo je sinteza prethodne dve metode. Na primer za test se uzmu takvi podaci da
uslovu (A > 1) (B = 0) odgovaju ulazi A > 1 i B = 0, a uslovu (A = 2) (X > 1) ulazi
A = 2 i X = 1. Dakle, test skup je: A = 2, B = 0 i X = 3; A = 1, B = 1 i X = 1.
= Ovo predhodno nisam bas shvatio.

Metoda prekrivanja viestrukih uslova


Ova metoda je najkomplikovanija, ali daje najbolje rezultate (najpreciznija je).
Za njeno razumevanje emo ralaniti dati BDA na sledei nain:

Dakle ralanjujemo viestruke uslove tako to emo obezvediti da test skup bude
takav da se svaki uslov izvri i za tano i za netano, za sva stanja ostalih uslova.
Pa bi test skup bio:
A=2B=0X=3
A=2B=1X=1
A=1B=0X=3
A=1B=1X=1
Strategija bele kutije je veoma efikasna, tj. verovatnoa pronalaenja greke (ako
postoji) je veoma velika. Generalno loa osobina ove strategije je formiranje test skupa.
Poto ne postoji BDA test skup je teko formirati. Sa druge strane, svi parametri jednog
dela programa mogu biti prorauni nekog drugog dela, to dodatno komplikuje
formiranje skupa.

Testiraju se delovi programa, a ne celi programi.

Metode granicnih vrednosti za testiranje


Ova metoda je izgraena oko empirijske injenice da ako program ima greaka,
velika je verovatnoa da se one nalaze oko graninih vrednosti ulaznih podataka.
Za ovu metodu postoji grupa pretpostavki o ulaznim podacima:

ulazni podaci se nalaze u nekom rasponu;

ulazni podaci su meusobno nezavisni i

otkazi ne nastaju simultanim uticajem vie defekata (single fault assumption).

Postoje etiri varijante ove metode:


1. parcijalni test graninih vrednosti;
2. totalni test graninih vrednosti;
3. parcijalni test robustnosti i
4. totalni test robustnosti.
Polazei od pretpostavke da se ulazne promenljive nalaze u nekom opsegu,
teorijski mogua ideja da se kao test podaci daju sve mogue kombinacije vrednosti
ulaznih podataka postaje praktino neizvodljiva. Zbog toga se za svaku promenljivu uoi
njen opseg i nezavisno za svaku se izdvaja pet vrednosti: xmin najmanja dozvoljena
vrednost, xmin+ - prva vea od xmin, xnom nominalna vrednost (bilo koja relativno udaljena
od graninih), xmax- - prva manja od xmax i xmax najvea dozvoljena vrednost. Svaka od n
promenljivih uzima po jednu od ovih vrednosti formirajui ureene n-torke i na taj nain
se dobije 5n testnih stavki.
Parcijalni test graninih vrednosti podrazumeva da se uoi jedna promenljiva
koja dobija svih pet vrednosti, a preostale n-1 imaju nominalnu vrednost. Indeks uoene
promenljive u n-torci ide od 1 do n. Poto se n-1 puta pojavljuje sluaj gde sve
promenljive imaju nominalnu vrednost, broj testnih stavki je 4n+1.
Primer testa za: xmin = 1, xmin+ = 2, xnom = 50, xmax- = 99 i xmax = 100. Test plan:

bro
j
1
2
3
4
5
6
7
8
9
10
11
12
13

rezultat

1
50 50
ravnokraki
2
50 50
ravnokraki
50 50 50 jednakostranian
99 50 50
ravnokraki
100 50 50
nije trougao
50
1
50
ravnokraki
50
2
50
ravnokraki
50 99 50
ravnokraki
50 100 50
nije trougao
50 50
1
ravnokraki
50 50
2
ravnokraki
50 50 99
ravnokraki
50 50 100
nije trougao

Vidimo da se ne pojavljuje mogunost da je trougao raznostranian, a sa druge


strane ima dosta pojavljivanja jednakokrakih, jer se nominalne vrednosti poklapaju (zbog
doslovne primene metode).
Parcijalni test robustnosti je slian parcijalnom testu graninih vrednosti, s tim to
obuhvata i dva invalidna ulazna podatka. Dakle, pored nabrojanih vrednosti promenljivih
jo se izdvajaju i xmax+ i xmin- kao invalidni podaci.
Generalno se metoda graninih vrednosti vrlo iroko koristi i relativno je laka.
Posebna prednost joj je to moe da se automatizuje. Nedostatak ove metode je njena
relativna neefikasnost (vidi se na primeru) to je posledica toga da se test plan radi
iskljuivo na osnovu ulaznh vrednosti.
Totalni test robustnosti i totalni test graninih vrednosti podrazumevaju da sve
promenljive uzimaju svih 7 (5 za totalni test graninih vrednosti) moguih vrednosti i
kombinujemo ih svaku sa svakom. Pa je onda broj testnih stavki za totalni test robustnosti
6n + 1 a za totalni test graninih vrednosti 5n + 1.

Metode klasa slicnosti za testiranje


Poznato je da se program u toku izvravanja odvija kroz neku trasu. Svaka trasa je
jedan od moguih puteva izvravanja programa. Jedna ista trasa se ne prolazi za samo
jednu n-torku ulaznih promenljivih, ve se program jednako ponaa za itav skup testnih
stvki.

Odatle je osnovna ideja ove metode locirati takve skupove testnih stavki za koje
se program jednako ponaa i testirati samo po jednog predstavnika jedne klase. Problem
je postaviti kriterijume za odreivanje ovih skupova. Skup testnih stavki za koje se
program jednako ponaa se zove klasa ekvivalencije. Zbog ove injenice, ulazne
promenljive ne moraju biti logiki nezavisne. Postoje grupe ulaznih podataka koji ine
logike celine.
Deljenje programa na klase ekvivalencije moe da predstavlja problem.
Ono se moe realizovati na vie naina:
na osnovu ulaza
na osnovu izlaza
Deljenje programa na klase ekvivalencije na osnovu ulaza ima vie varijanti: parcijalni i
totalni test i tzv. klasinu metodu klasa ekvivalencije (provera robusnosti).
Ilustrujmo deljenje programa na klase ekvivalencije na osnovu ulaza.
Skup V je skup ulaznih promenljivih, a X(V) je skup njenih vrednosti. X(V) se
deli na klase i bira se po jedan predstavnik koji je, u stvari, ureena n-torka promenljivih.
Uzeemo za primer da je V = {p, q, r, z, i, j}. Onda X(V) obuhvata sve mogue
vrednosti ovih est prmenljivih. Neka p, q i r generiu tri klase ekvivalencije: A1, A2 i A3;
z generie etiri: B1, B2, B3, B4, a i i j dve: C1 i C2. Drugim reima u odnosu na ureenu
trojku (p, q, r) program se moe ponaati trojako, u odnosu na promenljivu z na etiri
naina, a u odnosu na ureeni par (i, j) na dva naina. Iz svake klase izdvojiemo po
jednog predstavnika i program pokreemo samo sa svih est vrednosti.
Test plan za parcijalni test je prikazan u sledeoj tabeli:
bro
j
1
2
3
4

b1
b2
b3
b4

a1
a2
a3
a1

c1
c2
c1
c2

Testne stavke su zadate tako da je u prvoj koloni klasa ekvivalencije sa najvie


predstavnika, u drugoj prva sledea itd. Poto je oigledno da e prilikom popunjavanja
tabele u drugoj koloni ostati slobodno mesto, ponovo se upisuje prvi predstavnik. Ukupan
broj testnih stavki jeste etiri.

Totalni test podrazumeva da se kao testne stavke navedu sve trojke iz skupa
{a1, a2, a3}{b1, b2, b3, b4}{c1, c2}.
Klasina metoda se takoe bazira na trasama s tom razlikom to je usmerena na
invalidne podatke, odnosno proveru robustnosti. Formiraju se klase ekvivalencije sa
invalidnim i validnim ulaznim podacima. Od validnih ulaznih podataka se pravi to manji
skup testnih stavki, a zatim se za svaku klasu ekvivalencije uoe invalidni podaci. Za njih
se testne stavke formiraju bez kombinovanja, tj. svaka klasa ekvivalencije moe sadrati
samo jednu invalidnu vrednost.
Kod testiranja na osnovu ulaza, izlaz je posledica ulaza. Dok kod testiranja na
osnovu izlaza, ulaz je posledica izlaza.
=Ovo to sledi je iyvlaeno iz gomile raznih beleki i tano je u principu ali ne
znam koliko je razumljivo.
Primer za testiranje na osnovu ulaza bi bio onaj program za prvoveru da li tri
broja mogu da cine trougao i da li je taj trougao jednakostranian, jednakokarak ili
raznostran.
Ovde se klase ekvivalencije formiraju tako da se svi ulazni podatci koji generiu
isti izlaz smetaju u jednu klasu ekvivalencije.
=Dakle ovo nije dovreno zbog nedostatka materijala iz kog bi mogli da
zakljuimo nesto vise o deljenje programa na klase ekvivalencije na osnovu izlaza.

Metode simbolickog izvrsavanja za testiranje


Konstruktivno testiranje za cilj ima da se dokae da program ne sadri greke.
Metoda simbolikog izvravanja programa je najednostavnija metoda konstruktivnog
testiranja. Podsea na testiranje programa bez primene raunara. Izvrava se praenjem
trasa sa ciljem da se dokae da nema greke. Metoda uopte nije jednostavna za
izvoenje.
Program za koji se po specifikaciji trai raunanje y = (a 2 b2)x bi se mogao
realizovati na sledei nain:
readln(x, a, b);
y := x * b;
x := x * a;
y := (x y) * (a + b);
writeln(y);

Kod simbolikog izvravanja za testiranje ovog programa se ne daju konkretni


ulazi, ve se za ulazne podatke zadaju neke simbolike vrednosti. Na primer, ako je x =
X, a = A, b = B, gde su X, A i B neke realne konstante. Ako za ove ulazne podatke
dobijemo rezultat da je y = (A2 B2)X, program je uspeno testiran. Zaista,
readln(x, a, b);
y := x * b;

----> y= X*B

x := x * a;

----> x= X*A

y := (x y) * (a + b); ----> y= (X*A X*B)*(A + B)


=X*(A - B)*(A + B)
=X*(A2 B2)
writeln(y);
Simboliko testiranje programa se moe vriti i na papiru, ali se uglavnom radi
pomou specijalizovanog softvera. Ve programi koji postavljaju uslove (if) se
uslonjavaju time to se moraju dati simboliki ulazi i za DA i za NE. Za cikluse se
koristi indukcija, to se jako komplikuje ako su ciklusi ugnenjeni.
Zbog toga se simboliko testiranje najee koristi kod malih kritinih delova
programa zajedno sa drugim metodama. Takoe, ako nije neophodno dokazati ispravnost
programa za svih 100% sluajeva, za neke promenljive se daju i konkretne vrednosti, radi
uproavanja procesa testiranja.

Testiranje slozenih programa


Sve do sada reeno o testiranju programa se odnosilo na jednostavnije programe.
Program koji je modularno izveden, mora se modularno i testirati. Naravno, ako je svaki
od modula ispravan, ne znai da e takav biti i ceo sistem. Posebno se mora testirati
razmena podataka meu modulima koja je izuzetno podlona grekama. Sve od
navedenih metoda se mogu primeniti i za testiranje sloenih programa, dodue postoje i
neke druge specijalizovane za ovu oblast.
Najvanije je zapamtiti da se program nikad ne testira kao celina, jer je ceo
postupak izuzetno komplikovan. Takoe, ako neka od destruktivnih metoda ustanovi
greku, nju je prilino teko locirati.

Posmatrajmo program ija je modularnost prikazana na sledeem dijagramu:

Da bismo testirali modul A, moramo imati testirane module P, D i E. Za testiranje


P nam je potreban testiran A, B i C. Dakle, izgleda da program moramo testirati kao
celinu. Ve je reeno da se to ne radi.
Zbog ovoga, piu se zamene za module, tzv. pseudomoduli. Oni oponaaju rad
stvarnih modula. Dakle, softver se dopisuje test programima za module. Za ovaj
programski sistem su nam potrebni:

za testiranje P, potrebe su zamene: AP, BP i CP;

za testiranje A, potrebne su zamene: PA, DA i EA;

za testiranje B, potrebne je zamena: PB;

za testiranje C, potrebne su zamene: PC, FC i GC;

za testiranje D, potrebna je zamena AD;

za testiranje E, potrebna je zamena AE;

za testiranje F, potrebna je zamena CF i

za testiranje G, potrebna je zamena CG.

Treba voditi rauna da npr. PA, PB i PC nikako nisu isti programi. PA ima
maskirane pozive za B i C itd. Pisanje pseudomodula nije ni malo jednostavno.
Pseudomodul sa stanovita upotrebe mora verno oponaati originalni, a ne sme biti
isuvie komplikovan, kako bi bili sigurni da je napisan bez greke.

Dakle, vidimo da je za program od osam modula potrebno dopisati 14 (duplo


vie!) pseudomodula. Zbog toga se ova metoda ne primenjuje doslovno, ve se uvodi
jedno vrlo jednostavno poboljanje. Jednom testiran modul se primenjuje kao takav, za
njega se ne pie pseudomodul. Zbog toga u daljem testiranju broj pseudomodula
monotono opada, jer broj testiranih raste.
Ove metode su poznate kao tzv. metode inkrementalnog testiranja. Izdvajaju se
dve najbitnije: sa vrha ka dnu i s dna ka vrhu. Ni jedna od ovih metoda nije apsolutno
bolja od one druge.
Testiranje od vrha ka dnu (top-bottom)
Dakle testiranje se vri od vrha ka modulima nieg nivoa, zamenjujui ve testirane
module. Za na primer bi bilo:

za testiranje P, potrebe su zamene: AP, BP i CP;

za testiranje A, potreban je modul P i zamene: DA i EA, BP i CP;

za testiranje B, potreban je modul P i zamene: AP i CP;

za testiranje C, potreban je modul P i zamene: FC i GC;

za testiranje D, potreban je modul A i zamena EA;

za testiranje E, potreban je modul A i zamena DA;

za testiranje F, potreban je modul C i zamena GC i

za testiranje G, potreban je modul C i zamena FC.

Dakle, potrebno je pisati samo sedam pseudomodula. U optem sluaju njihov broj je
znatno manji od broja stvarnih modula.
Prednost ovakvog naina testiranja je to je u ranim fazama razvoja softvera jasan njegov
osnovni skelet ili prototip. On slui u demonstracione svrhe i omoguava da se jo u ranoj
fazi testiranja softvera daju primedbe i izvre korekcije. Nedostatak je to se
pseudomoduli neto tee izvode nego kod druge metode.
Testiranje s dna ka vrhu
Za ovu metodu je karakteristino da se kompletno testirani program pojavljuje tek na
kraju procesa. Ovo je osnovni nedostatak ove metode.

Prednost je u tome to se pseudomoduli piu samo za one module koji pozivaju neki
drugi modul. Tako imamo:

za testiranje D, piemo pseudomodul AD;

za testiranje E, piemo pseudomodul AE;

za testiranje F, piemo pseudomodul CF;

za testiranje G, piemo pseudomodul CG;

za testiranje A, koristimo module D i E, a piemo pseudomodul DA;

za testiranje B, piemo pseudomodul PB;

za testiranje C, koristimo module F i G, a piemo pseudomodul PC i

za testiranje P, koristimo module A, B i C.

Dakle, pie se samo sedam pseudomodula.