You are on page 1of 40

ti: Mn Nguyn L Lp Trnh 1

PHN I
L THUYT V KIM CHNG CHNG TRNH.
I. CC M HNH PHT TRIN PHN MM 1. M hnh phn mm khi qut ha l thuyt kim chng chng trnh trc tin chng ta tm hiu cc m hnh pht trin phn mm c bn th hin cc bc pht trin phn mm v trong c tm quan trng ca giai on kim chng chng trnh. M thc nc truyn thng.

M hnh c mi quan h song song

trnh cc khuyt im trong qu trnh pht trin phn mm do khng c lin kt cht ch gia cc khu trng yu th m hnh mi ra i nh sau cn gi l (Defect Prevention)

L Hng V Th Hin - Nguyn nh Hin Phm o Minh V Trng Quang Bnh Long

Trang 1

ti: Mn Nguyn L Lp Trnh 1

M hnh V-MODEL

M hnh V-MODEL static test

L Hng V Th Hin - Nguyn nh Hin Phm o Minh V Trng Quang Bnh Long

Trang 2

ti: Mn Nguyn L Lp Trnh 1

M hnh V-MODEL Dynamic Test Trong tt c cc m hnh pht trin phn mm trn th trong giai on kim chng chng trnh (test) l rt quan trng quyt nh n gi tr ca phn mm c sn xut ra.
2. GII THII V KIM CHNG CHNG TRNH

Kim chng chng trnh l mt trong nhng bc quan trng trong quy trnh pht trin sn phm phn mm. m bo cho chng trnh phn mm chy n nh trnh nhng sai st ch quan khi a vo ng dng thc t. Vy thc hin tt vic kim chng chng trnh sao cho c hiu qu v c quy trnh r rngcn c cc nguyn l v tnh cht sau: II. PHM CHT CA CHNG TRNH. Cc chng trnh phn mm khi c pht trin v a vo ng dng thc t cn phi t c nhng phm cht c bn sau: Tnh ng n, chnh xc (Correctness) Tnh chc chn (robustness) Tnh thn thin vi ngi dng (User friendliness) Kh nng thch nghi (adapability):chng trnh phn mm c kh nng thch ng v tin ha theo yu cu chung ph hp vi thc t a ra. Tnh ti s dng (reuseability): chng trnh c th dng lm mt phn trong mt chng trnh khc ln hn. Tnh tng lin (Interoperability)

L Hng V Th Hin - Nguyn nh Hin Phm o Minh V Trng Quang Bnh Long

Trang 3

ti: Mn Nguyn L Lp Trnh 1

Tnh hiu qu (efficiency) Tnh kh chuyn (porability): c kh nng chuyn i d dng gia cc mi trng pht trin khc nhau. Tnh an ton h thng (Security).

Ngoi 9 phm cht trn cn c phm cht quan trng na l tnh dng ca chng trnh. Nm 1985-1986 LENARD ni rng Khng th tn ti mt chng trnh kim tra tnh dng ca mt chng trnh. II. CC PHNG PHP KIM CHNG CHNG TRNH 1. Cu trc kim chng chng trnh C cc phng thc chnh kim chng tnh ng n ca chng trnh da trn cc cng trnh nghin cu a ra nh sau: Kim chng ton b cc nhnh r ca chng trnh. Sao cho mi lnh ca chng trnh u phi qua t nht mt ln (Black-Box). To b d liu th nghim ngu nhin pht hin ra li gi hay li tht. Kim tra nhng im nt Chn cc lnh kim tra logic mi on chng trnh.(White -Box) Khi chng trnh thc hin m xy ra sai st th c rt nhiu nguyn nhn nhng c 3 ngun gc xy rai st chnh l. D liu u vo: do d liu nhp vo ban u thiu tnh rng buc nn s xy ra sai st khi thc hin khi kim chng th dng b kim tra d liu ngu nhin, hay c trng tu . C php : Dng trnh bin dch pht hin Ng ngha: Li ny rt kh pht hin dng test logic, Heuristic test kim tra. Mi chng trnh u c rng buc v tnh ng n i vi iu kin input u vo. x,P(x) : iu kin i vi x Q(y): iu kin i vi y Ta c : P(x)^Program(x,y) Q(y)

2. Tnh ng n ca chng trnh

L Hng V Th Hin - Nguyn nh Hin Phm o Minh V Trng Quang Bnh Long

Trang 4

ti: Mn Nguyn L Lp Trnh 1

x,P(x)

Q(y)

Input:x V d 1:

Program(x,y)

Output:y

Kim chng chng trnh gii phng trnh bc 2 Ta c phn tch s kim chng nh sau:
a,b,c,P(a,b,c): b2-4ac>=0

X1,x2:Q(ax12+bx1+c=0,a x22+bx2+c=0) Program (ax2+bx+c=0) Output: x1,x2

Input: a,b,c

V d 2: Kim chng tnh ng n ca chng trnh tnh thng v d s a/b vi chng trnh nh sau: r:=a;q:=0; While r>b do Begin r:=r-1; q:=q+1; end; Kt qu: q: l thng s, r : l d s. Kim tra : iu kin ca php chia b<>0. Nu b=0 vng lp s khng dng c dn n chng trnh sai.
Trang 5

L Hng V Th Hin - Nguyn nh Hin Phm o Minh V Trng Quang Bnh Long

ti: Mn Nguyn L Lp Trnh 1

Cc cn : vi a=b dn n kt qu sai v d s r=x v thng q=0. Chng trnh ng c vit li nh sau : r:=a;q:=0; While r>=b do Begin r:=r-1; q:=q+1; end;

3. Tnh chc chn ca chng trnh Cn phn tch chng trnh thnh cc chng trnh con sao cho tnh c lp gia cc chng trnh con cng cao cng tt. V d : i :=n While i>0 do Begin Read(a[i]); i:=i-1; end; for j:=1 to n do i:=i+a[j]; writeln(tong so=,i); Chng trnh s thc hin sai nu n<0 do bin i c dng chung cho c hai vng lp. 4. Kim chng chng trnh vi m hnh nghch o kim tra tnh logic ca chng trnh ta c th s dng phng php nghch o kim chng li tnh ng n thc t ca chng trnh: V d 1: Thut ton nhn n c pht trin nh sau: Input: x,y Output: z=x*y Thut Ton : Nhp x,y If x le then z=y; Else
L Hng V Th Hin - Nguyn nh Hin Phm o Minh V Trng Quang Bnh Long

Trang 6

ti: Mn Nguyn L Lp Trnh 1

z=0 End if While x>1 do Begin x:=x div 2; y:=y*2; If x l then z:=z+y; End; z:=z+y; kim chng chng trnh trn ta lp trnh li v chn thm dng lnh kim chng nghch o kim chng chng trnh nh sau : Promgram nhan_ando ; var x,y,k,m,n :word ; BEGIN repeat write(nhap gia tri x=) ;readln(x) until x>=0 ; repeat write(nhap gia tri y=) ;readln(y) until y>=0 ; m :=x ; n :=y ; if (x mod 2)=1 then k:=y; else k :=0 ; if y<>0 then begin while x>1 do begin x :=x shr 1 ; y :=y shl 1 ; if ((x mod 2)=1) then k :=k+y ; end ; k :=k+y ; writeln(x*y=,k) ; (* chn thm on lnh kim chng*) if ((k/n)=m) and ((k/m)=n) then write(Thuat toan dung) ; else writeln(thuat toan sai !) ; readln ; end ; (* END OF IF*) END ; 5. Kim chng chng trnh dng phng php quy np.

L Hng V Th Hin - Nguyn nh Hin Phm o Minh V Trng Quang Bnh Long

Trang 7

ti: Mn Nguyn L Lp Trnh 1

Phng php ny da vo phng php chng minh quy np trong ton hc. c pht biu nh sau : chng minh mt tn t P(n) ph thuc vo s t nhin l ng vi mi n. th ta cn chng minh hai iu sau y : (i) P(0) l ng. (ii) Nu P(n) c gi nh l ng th s suy ra P(n+1) cng ng. Khng nh P(0) c gi l c s v bc chng minh (ii) l bc quy np. Khi c hai iu chng minh (i) v (ii), a vo nguyn l quy np ton hc ta kt lun P(n) ng vi mi s t nhin n. Ngoi ra cn c phng php chng minh quy np mnh c pht biu nh sau : chng minh P(n) ng vi mi s t nhin ta chng minh hai iu sau : (i) (ii) P(0) ng Nu gi nh l P(0),P(1),...P(n) u ng th P(n+1) cng ng.

V d 1 : u vo l x,y,n c u ra l x=x.yn ta vit on chng trnh tnh nh sau : while n<>0 do begin x :=x*y ; n :=n-1 ; end ; ketqua :=x ; Hy chng minh on chng trnh trn thc hin ng ca ngi vit. Xt v t S(n) cho on chng trnh sau : x,y R, n N : nu u vo l x,y,n th u ra l : x=x*yn ta chng minh bng nguyn l quy np : Khi n=0 th vng lp khng thc hin c, ketqua cua on chng trnh l x, vy S(0) ng. Ta gi s S(k) ng, tc u ra l x=x*yk
L Hng V Th Hin - Nguyn nh Hin Phm o Minh V Trng Quang Bnh Long

Trang 8

ti: Mn Nguyn L Lp Trnh 1

Ta cn chng minh S(k+1) ng : Tht vy do k>=0 ==> k+1>0 nn vng lp s thc hin t nht l thm 1 ln na suy ra x=x*y=x*yk*y = x=yk+1 ngha l S(k+1) ng Vy on chng trnh trn l ng vi ca ngi lp trnh. V d 2 : u vo l x,y,n c u ra l x=x+n*y ta vit on chng trnh nh sau : While n<>0 do begin x :=x+y ; n :=n-1 ; end ; ketqua :=x ; Hy chng minh on chng trnh trn ng vi ca ngi vit. Ta xt v t S(n) cho on chng trnh trn nh sau : x,y R, n N : nu u vo l x,y,n th u ra l : x=x+n*y Chng minh bng quy np : Vi n=0 th vng lp khng thc hin c chng trnh thc hin c k qu = x+0*y=x vy S(0) ng. Ta gi s S(k) ng tc u ra ca on chng trnh l x=x+k*y. Ta cn chng minh S(k+1) ng. Tht vp do k>=0 ==> k>0 nn vng lp s thc hin thm t nht l mt ln na suy ra x=x+y=x+k*y+y=x+(k+1)*y ngha l S(k+1) ng. Vy on chng trnh trn l ng vi ca ngi vit. i tng ca nhng phng php kim chng logic l tm ra nhng bng chng tng qut sao cho bn khng cn theo di ht mi iu kin c th. Thc hin iu ny lin quan n mt vi dng i din logic bng biu tng v cc k thut thc hin nhng php suy lun logic. Mt trong nhng k thut mnh nht cho mc ch ny l phng php ton hc gi l php qui np. Phng php ny p dng cho nhng biu thc logic vi nhng tham s nguyn. N c tnh trng nh sau : 1. Nu biu thc f (n) c th c chng minh l ng i vi mt gi tr n0 no 2. Khi n > n0 v khi f (n) ng, f (n + 1) cng c chng minh l ng 3. Th f (k) ng vi mi k >= n0
L Hng V Th Hin - Nguyn nh Hin Phm o Minh V Trng Quang Bnh Long

Trang 9

ti: Mn Nguyn L Lp Trnh 1

S dng khi nim ny c th tit kim nhiu thi gian trong kim tra logic. Bn bt u bng cch chng minh rng logic ca mt chng trnh ( y l mt biu thc logic) l ng cho trng hp c bn. Sau bn chng minh rng nu logic ny ng cho mt gi tr n ln hn no th n cng ng cho n + 1, iu ny l mt bng chng y d cho mi gi tr ln hn ca n v bn khng cn tm thm mt bng chng no na. y l mt nguyn l mnh m, n phi c quan tm s dng. Gi s rng bn ang thc hin mt vng lp nh sau: For i = 1 to 1000 BEGIN Do x y z END Nu bn kim tra v chng thc rng logic hp l nhng gi tr i = 1 , i =5 , i = 6 bn c th kt lun rng n ng vi mi gi tr cao hn ca i. Tuy nhin r rng y c mt vn khi m i = 1001. Bi ton y l cch m kim chng c thc hin. Sau khi cho rng logic l ng i = 1, k n bn cn kim tra trng hp i = n. Bn cho rng logic l ng khi gi tr i = n, n cng ng cho i = n + 1. Ch rng bn khng c chng minh n ng cho i = n ; bn gi s iu ny. Kho st bi ton, bn c th thy rng logic s khng lm vic khi n = 1000. trnh iu ny bn nn thc hin cuc kim tra vi logic c sa i nh sau: For i = 1 to limit BEGIN Do x y z END u tin bn chng thc rng hm logic ng limit = 1 ; k n bn chng minh rng nu ng vi limit = n th n cng ng cho limit = n + 1. Khi n cng ng vi mi gi tr cao hn ca limit. y n l mt gi tr nguyn dng. Li na bn cng cn bo m rng khng c nhng gi tr phi s trong hm xyz n c th lm sai lch cc cuc thc nghim ny. Mt cch khc tip cn nguyn l ny l xem c th tm thy bt k mt gi tr n hay khng, ni m chng trnh th ng limit = n nhng khng ng limit n + 1. Nhng vn nh th c gy nn bi nhng rng buc v b nh hoc l kch thc ca h thng s 6. Thc hin bng biu tng
Logic sau y a ra bi Mills cho thy thc hin bng biu tng lm vic nh th no trong trng hp n gin
L Hng V Th Hin - Nguyn nh Hin Phm o Minh V Trng Quang Bnh Long

Trang 10

ti: Mn Nguyn L Lp Trnh 1

Procedure Substitution (V1, V2, V3, V4) BEGIN V1 : = V2 ; V2 : = V4 ; V3 : = V1 ; V4 : = V3 ; END Bng sau cho ta kt qu. Logic ny trng n gin nhng logic n gin ny dng nh tr thnh rt phc tp khi n lin quan n tin trnh tun t. u im ca kim chng bng biu tng l n bao ph ht tt c gi tr c trng hn l mt s cc trng hp c test Chu k # Lnh Tr khi ng 1 V1 : = V2 2 V2 : = V4 3 V3 : = V1 4 V4 : = V3 Gi tr sau cng Function: Substitution (V1, V2, V3, V4) V1 V2 V3 A B C B D B B D B V4 D

B B

Khng c nhng hng dn tng qut no cho vic l khi no v lm th no s dng s thc thi bng biu tng, tuy nhin bn nn kim tra chng trnh ca mnh v s dng iu ny trong bt k trng hp no m bn thy trong thc t. Mt trong nhng im hay nht ca nhng phng php kim chng bng ton hc l n cung cp mt cch c cu trc ha kim chng mt chng trnh mt cch logic. 7. CHNG THC I TNG STATE MACHINE

Khi m sn phm ca bn c mt state machine, bn nn chng minh rng n c thit k mt cch hp l v s dng mt cch ng n . quyt nh mt chng trnh c l state machine hay khng cn kim tra hnh x bn ngoi ca n. Mt v d l hnh x ca b c k t i vi b m .B c s gi tt c k t ti b m.Tuy nhin, khi n pht hin bt u mt dng ch thch, n s b qua tt c nhng k t theo sau cho n cui dng ch thch. y th b c k t c hai trng thi: dng ch thch v dng chng trnh. Vi nhng k t r rng l input, trong mt trng hp n khng to ra output v trong trng hp cn li n s gi cc k t input ra output, khi mt state machine c thit k ng n th n phi c kh nng tr ra cho chng trnh nhng trng thi m mi iu kin trng thi phi y
L Hng V Th Hin - Nguyn nh Hin Phm o Minh V Trng Quang Bnh Long

Trang 11

ti: Mn Nguyn L Lp Trnh 1

v trc giao vi nhau, bn nn kim tra nhng ng cnh ln hn ca chng trnh m bo rng tt c cc state machine c nh ra r rng v c s dng mt cch nht qun. Ngi ta nh ngha mt tp cc hm l y ngha l hi ca mi thnh vin l ng. V d nh l mt tp y cc hm s ph mi hnh vung trn mt bng Kanaugh. Mt tp hm gi l trc giao ngha l mi phn giao ca cc thnh vin l rng hoc bng zero. Mt tp cc hm trc giao khng gi chng ln nhau trn bng Kanaugh. Do , vi mt tp trc giao cc chuyn dch v trng thi, mi mt chuyn dch l duy nht v khng c s nhm ln v trng thi k tip. kim tra iu ny th mt state machine th thch hp hn v theo nhng bc nh sau : Kim tra cu trc ca state machine bo m rng khng c nhng ci by tm n hoc cc vng lp n khng th dnh vo trong mt vng lp v hn no v khng bao gi tr v cho ta mt tnh trng c Kim tra thit k chng trnh bo m rng mi tnh trng c th c phn nh r. N c y hay khng ? Mt thit k chng trnh l y khi m mt trng thi c nh ngha cho mi ci ni kt c th ca nhng gi tr thuc tnh. Kim tra tnh trc giao ca tnh trng, l, i vi mi tp cc iu kin th ch c duy nht mt v ch mt trng thi c th Kim chng rng cc chuyn dch t mi trng thi l y v trc giao, l, t mi mt trng thi mt tnh trng duy nht k tip c nh ngha cho mi ni kt c th ca nhng gi tr input Hai phn sau y s cho ta nhng v d lm th no kim tra tnh ng n ca state machine. Th nht l state machine n gin Bset, th hai l Cdata
Kim tra Bset v State Machine Mu m t trng thi Bset c cho nh sau 8. Kim Mu m t Pop or Subtract Empty State Push or Add Member State n>0 Pop ( n = 1) or Subtract ( n = 1 v D thuc Bset ) tra Bset v State Machine trng thi Bset c cho nh sau

L Hng V Th Hin - Nguyn nh Hin Phm o Minh V Trng Quang Bnh Long

Add or Push orTrang 12>1 ) or Pop ( n Subtract ( D khng thuc Bset ) or Subtract ( n >1 )

ti: Mn Nguyn L Lp Trnh 1

Dng trn cng m t trng thi rng v 2 dng ngay bn di cho trng thi k t trng thi rng Khi Bset l Empty State cc th tc Pop hoc Subtract c gi. Dng k tip Member State, ch ra rng khi Bset trong trng thi Empty s tr thnh Member State khi hoc l Push hoc l Add c gi. Trong Member State, iu kin th phc tp hn mt cht. Member State s tr thnh Empty khi th tc Pop c gi v ch c mt thnh phn duy nht trong Bset ( n = 1). N cng kt thc trong Empty State khi Bset c mt thnh vin D v th tc Subtract c gi vi tham s D Empty State Empty State Member State Member State Empty State Member State Tp khng c thnh vin n=0 Pop ( & D ) Subtract ( D ) Push ( D ) Add ( D ) Tp c 1 hoc nhiu thnh vin n >= 1 Pop ( & D ) ( n = 1 ) [ ( Subtract ( D ) ( n = 1 ) D Bset ) ] Push ( D ) Add ( D ) [ Pop ( & D ) ( n > 1) ] [ Subtract ( D ) D Bset ] [ Subtract ( D ) (n>1)]

Cc phng thc c trnh by nh sau Push ( D ) : thm tp D vo Bset v tr th nht, y mi thnh vin ang tn ti ln 1 v tr Pop ( D ) : xa t v tr u tin ca Bset, t vo trong D, v di chuyn mi thnh vin trong Bset xung 1 v tr Add ( D ) : nu D khng l thnh vin ca Bset, Push ( D ) Subtract ( D ) : nu D l thnh vin ca Bset, xa n v gim i mt v tr ca tt c thnh vin cao hn ca Bset kim tra xem State machine c hot ng tt hay khng hy hi cc cu hi sau y 1. Bset c n cha vng lp hay khng ?
L Hng V Th Hin - Nguyn nh Hin Phm o Minh V Trng Quang Bnh Long

Trang 13

ti: Mn Nguyn L Lp Trnh 1 2. Bset c l State machine y khng ? i vi Bset ch c mt thuc tnh m ta quan tm l n : s cc thnh vin trong Bset C 2 trng thi ca Bset l N = 0 v n >= 1 3. Cc trng thi ca Bset c trc giao hay khng ? R rng l trc giao v khng th c n = 0 v n 0 ng thi 4. Cc chuyn dch t mi trng thi c y v trc giao hay khng ?

L Hng V Th Hin - Nguyn nh Hin Phm o Minh V Trng Quang Bnh Long

Trang 14

ti: Mn Nguyn L Lp Trnh 1 Kim tra cc by tim n hoc cc vng lp 1 EmptySet List State = = 0 List Position = = 0 6 11 7 First and Only List State = = 1 List Position = = 1 12 8 22 First of Several List State = = 2 List Position = = 1 14 18 23 13 21 2

16

19

Middle of Several List State = = 3 1 < List Position < N

20 24

List of Several List State = = 4 List Position = = N

25

Hnh v ny c xy dng t mu trng thi v trnh by mi chuyn dch trong s cc trng thi. V d : EmptySet chuyn dch ti First & Only theo iu kin 2. iu kin 2 xy ra khi hoc l phng thc Push hoc AddSet c gi. Hnh trn cng cho ta thy rng State machine ny khng c by hoc cc vng lp tim n, n c th bt k trng thi no v chuyn ti bt k trng thi khc. V d t trng thi LastOfSeveral c th n EmptySet theo iu kin 21. Tng t trng thi Empty State c th chuyn dch ti LastOfSeveral bi dy input 2, 8, 15.

L Hng V Th Hin - Nguyn nh Hin Phm o Minh V Trng Quang Bnh Long

Trang 15

ti: Mn Nguyn L Lp Trnh 1 Kim tra mi trng thi c th Kim tra mi trng thi c th lin quan vic phn nh tt c cc iu kin c th ca h thng. State machine lin quan n tp d liu cha mt s thnh vin v mt pointer tr n mt trong cc thnh vin ny. Trong v d State machine, ch c 5 trng thi l c ch i vi chng trnh ang c thit k. Nhng trng thi ny l h thng c khng, mt hoc vi s thnh vin ln hn v cc pointer khng tr n g c, n thnh vin u tin hoc thnh vin gia, hoc thnh vin cui cng. Cc trng thi l nh sau: EmptySet , ListState = 0 ; pointer khng tr g c v vy ListPosition = 0 First & Only , ListState = 1 ; ch duy nht mt thnh vin, pointer phi tr n n, v vy ListPosition = 1 First of Several , ListState = 2 ; c mt vi thnh vin, pointer tr n ci u tin, v vy ListPosition = 1 Middle of Several , ListState = 3 ; khi pointer tr n thnh vin gia, phi c t nht 3 ci. Do listpointer ln hn 1 v b hn N, vi N l s thnh vin trong tp hp LastOfSeveral , ListState = 4 ; phi c 2 hoc nhiu thnh vin hn vi pointer tr n ci cui cng, v vy ListPosition = N 9. Kim tra tnh trc giao ca trng thi xc nh trng thi l trc giao, bn cn xc nh 2 trng thi bt k tn ti di cng mt tham s. Bng cch kim tra gi tr ca ListState v ListPosition, bn c th thy rng gi tr ca ListState l duy nht cho mI mt kt ni ca N v cc tham s ListPosition. Vy th, vi mi kt ni ca N v ListPosition c mt v ch mt gi tr ListState. Trng thi nh th gi l trc giao

III.

LU VT CHNG TRNH :

C nhiu cch khc nhau kim chng Logic Specification Template trc khi bn ci t hoc test mt chng trnh. N bao gm bng thi hnh, bng lu vt v kim chng bng ton hc. Phn ny v cc m t theo sau s minh ha cc tip cn lm vic nh th no. Bng thi hnh (Execution Table) Bng thi hnh cung cp mt cch th t kim tra dng logic trong LST. Phng php ny tn km v thi gian c bit i vi cc chng trnh di v phc tp nhng rt ng tin cy v l phng php kim chng n gin. Ta c on chng trnh sau Clear Space ( Input State ) 1. Length = length ( Input ) State = 0 2. Repeat until ( State = 3 or length = 0 ) 3. if Input [ length ] = { 1 k t trng cuI chui Input } 4. length = length 1 5. if State < 2 State = State + 1
L Hng V Th Hin - Nguyn nh Hin Phm o Minh V Trng Quang Bnh Long

Trang 16

ti: Mn Nguyn L Lp Trnh 1 6. until ( State = 3 or length = 0 ) 7. 8. 9. 10. First = true 11. Input = Output Clear Space dng xa cc khong trng u v cui mt chuI k t v n tr v chui xa cc khong trng. Hm s tr v mt gi tr State Clear Space Logic Specification Template c minh ha nh sau State = 0 Non space if length > 0 for N = 1 to length do if ( Input [ N ] < > or First ) Output = Output + Input [ N ] else State = 3

space State = 1 space

Non space State = 3 Non space

State = 2 space

Khi input l chui rng, tr v emptystring vi state = 0 Khi input l 1 k t trng, tr v emptystring vi state = 1 Khi input l chui c 2 hay nhiu khong trng m khng c k t khc khong trng, mt emptystring tr v vi state = 2 Khi input l chui cha k t khc khong trng v d __ab___, chui ab c tr v vi state = 3

Sau khi thc hin, ta c bng thc thi. Nhng bc u tin kim tra phn ui ca chui xem c khong trng khng. Nu c, chiu di chuI c gim i cho n khi gp c k t khng l khong trng u tin v state c xc lp l 3

Bng thc thi


Name Clear Space Base Class Input empty : : ( return = empty ) State = 0 Trang 17 State ( 0 3 )

L Hng V Th Hin - Nguyn nh Hin Phm o Minh V Trng Quang Bnh Long

ti: Mn Nguyn L Lp Trnh 1 ( Input ; State ) Input = = 1 space : : ( return = empty ) State = 1 Input > = 2 space : : ( return = empty ) State = 2 Input c k t khc khong trng : : ( return = Input (khng c khong trng u v ui)) State =

Cc bng lu vt Bng lu vt thng hiu qu hn bng thc thi cho vic chng thc tnh ng n logic. Bng lu vt lin quan n cc k thut h tr cho nhau 1. Thc thi bng biu tng 2. Kim tra bng lu vt ca tt c trng hp c th 3. Nguyn l qui np Kim tra logic bng bng lu vt bng cch phn nh mi trng hp logic c th v kim tra tng trng hp ring l. i vI hm Clear Space thc hin bng cch nh ngha mt chui Input c chiu di k nh sau 1. 0, 1, hoc m character trong chui vi k t bt u v kt thc khng l khong trng 2. 0, 1, hoc j khong trng u chui 3. 0, 1, hoc n khong trng cui chui Clear Space ( Input State ) 1. Length = length ( Input ) State = 0 2. if length >0 3. Repeat until ( State = 3 or length = 0 ) 4. if Input [ length-1 ] = { 1 k t trng cuI chui Input } 5. length = length 1 6. if State < 2 State = State + 1 7. else State = 3 until ( State = 3 or length = 0 ) 8. if length > 0 9. for N = 1 to length do 10. if ( Input [ N-1 ] < > or First ) 11. Output = Output + Input [ N -1] First = true 12. Input = Output y j, m, n c th l bt k gi tr nguyn dng no vI k = j + m + n
L Hng V Th Hin - Nguyn nh Hin Phm o Minh V Trng Quang Bnh Long

Trang 18

ti: Mn Nguyn L Lp Trnh 1 Theo nguyn l qui np, ta cn kim tra cc trng hp 0 v 1 sau kim chng logic vi s q v q + 1 no . Nu bn chng t logic ng cho cc trng hp ny bn c th tin rng logic l ng. R rng chng trnh thao tc ng n khi chui rng. N li Length = 0 v State = 0 Cng th, bc 1 n bc 11 b b qua khi Length = 0 v kt qu cui cng Input = Output. Tuy nhin iu ny ny sinh cu hi Output l g khi chiu di Input = 0. Cu tr li Output nn khi ng l chui rng K tip kim tra trng hp khng c khong trng ui cng nh khng c khong trng u v c tng k Input k t. R rng trng hp ny ng khi k = 1. Kim tra cc k t cn li bng phng php qui np, gi s chng trnh ng vi k = q v xem c bt k gi tr no ca n, ni chng trnh khng ng vi gi tr k = q + 1. Mt kim tra logic cho thy rng khng c trng hp nh th Minh ha 1.Hnh dung rng logic ng i vi gi tr k0 no . iu ny ng vi k = 2, v vy k0 = 2 2. Gi s rng logic l ng vi gi tr k no ln hn k0 3. Bit rng logic ng vi k = q, chng t rng n vn ng vi k = q + 1. R rng trng hp q + 1 l thm vo mt vng quay cho bng lu vt trc v to ra Output thch hp Du kim chng bng lu vt rt mt thi gian, n khng c nhiu phn nh cho tt c cc trng hpkim tra logic ca chng trnh. Nu bn mun pht trin cuc kim tra nh trn th bn s kim chng tnh ng n ca chng trnh. Tuy nhin nu bn khng d nh thc hin, bn phi kim tra cn thn trong sut qu trnh thit k.

L Hng V Th Hin - Nguyn nh Hin Phm o Minh V Trng Quang Bnh Long

Trang 19

ti: Mn Nguyn L Lp Trnh 1

PHN II THC NGHIM KIM CHNG CHNG TRNH


1. Trng hp n gin Bn mun bit an m lnh c thc hin hay khng ? Lm sao kim chng iu ny? C rt nhiu cch. S dng k thut by li (debug) hay chy tng bc kim tra kt qu tng an chng trnh. k thut by li l tng kh hay nhng li khng t ng kim tra, bn phi thc hin mi khi c s thay i. K thut chy tng bc cng tt nhng n lm cho an m lnh khng c d nhn v hn ht l kt qu a ra c nhiu thng tin d tha. Kim chng bng CppUnit c th thc hin t ng, d ci t v bn ch phi vit mt ln. Kim chng bng CppUnit gip bn thy t tin v cht lng an m lnh thc hin vic kim chng, tt c nhng g bn phi lm l to 1 lp con TestCase, c Override phng thc runTest(). Khi bn mun kim tra, gi CPPUNIT_ASSERT(bool) v truyn vo biu thc cn kim tra. Nu kt qu tr v l True th vic kim chng thnh cng. y l mt v d cho vic kim chng so snh hai s phc: Class ComplexNumberTest: public CppUnit::TestCase { Public: ComplexNumberTeast (std::string name) : CppUnit::TestCase(name) {}
L Hng V Th Hin - Nguyn nh Hin Phm o Minh V Trng Quang Bnh Long

Trang 20

ti: Mn Nguyn L Lp Trnh 1 Void runTest() { CPPUNIT_ASSERT (Complex (10,1) ==Complex(10,1)); CPPUNIT_ASSERT (!Complex (1,1) ==Complex(2,2)); } }; Nh bn thy, chng trnh trn rt n gin. Tuy nhin thng ta cn kim chng nhiu trng hp nh v ta mun kim chng trn cng mt tp cc i tng. thc hin iu ny ta s dng Fixture 2. Fixture Fixture l mt tp cc i tng m phc v cho lp Test case c s. Fixture s m bo chc chn khi bn kim chng Chng ta s kho st mu ny. Gi s chng ta thc s mun pht trin mt lp s phc. Chng ta bt u bng vic nh ngha lp Complex rng nh sau: Class Complex (); By gi chng ta s to mt th hin ca lp ComplexNumberTest trn, bin dch, chy v xem kt qu. Trc tin, chng ta s thy li bin dch. Chng trnh test s dng tan t ==, nhng cha nh ngha. Chng ta s sa nh sau: Bool operato == (const Complex &a, const Complex &b) { Return true; } By gi, bin dch li v chy. Lc ny bn s khng thy li bin dch na. Chng ta cn thm mt cht vo operator == nh sau:
L Hng V Th Hin - Nguyn nh Hin Phm o Minh V Trng Quang Bnh Long

Trang 21

ti: Mn Nguyn L Lp Trnh 1

Class Complex { Friend bool operator == (const Complex &a, Const Complex &b Double real, imaginary; Public: Complex (double r, double i=0): real (r), imaginary (i) {} }; Bool operator== (const Complex &a, const Complex &b) { Return a.real== b.real && a.imaginary == b.imaginary; } Chng ta bin dch li v vic kim chng ca chng ta xong. Tip theo chng ta thm mt php ton mi v kim chng v ta lm nh sau: Thm bin cho mi phn ca fixture Override setUp() khi to bin Override tearDown() gii phng bt c ti nguyn no ang tn ti trong setUp() Class ComplexNumberTest: public CppUnit::TestFixture{ Private: Complex *m_10_1, *m_1_1, *m_11_2; Public: Void setUp() { m_10_1 = new Complex(10,1); m_1_1= new Complex(1,1); m_11_2 = new Complex (11,2); } void tearDown () {
L Hng V Th Hin - Nguyn nh Hin Phm o Minh V Trng Quang Bnh Long

Trang 22

ti: Mn Nguyn L Lp Trnh 1 delete m_10_1; delete m_1_1; delete m_11_2 ; }

} 3. Test Case Lm th no gi kim chng s dng fixture? C hai bc Vit testcase nh l phng thc trong lp fixture To mt TestCaller m chy nh phng thc ngoi l

y l mt v d testcase: Class ComplexNumberTest: public CppUnit::TestFixture { Private: Complex *m_10_1, *m_1_1, *m_11_2; Public: Void setUp() { m_10_1 = new Complex(10,1); m_1_1= new Complex(1,1); m_11_2 = new Complex (11,2); } void tearDown () { delete m_10_1; delete m_1_1; delete m_11_2 ; }
L Hng V Th Hin - Nguyn nh Hin Phm o Minh V Trng Quang Bnh Long

Trang 23

ti: Mn Nguyn L Lp Trnh 1 void testEquality () { CPPUNIT_ASSERT (*m_10_1== *m_10_1); CPPUNIT_ASSERT (!(*m_10_1)==*m_11_2); } void testAdditiion() { CPPUNIT_ASSERT (*m_10_1 + *m_1_1== *m_11_2); } }; Ta to v chy nhng th hin cho mi testcase ging nh sau: CppUnit::TestCaller<ComplexNumber> tests (testEquality, &ComplexNumberTest::testEquality); CppUnit::TestResult result; Test.run (&result); Tham s th hai trong TestCaller l a ch ca phng thc ComplexNumberTest. Khi chng trnh chy, phng thc c t s chy. iu ny th khng c ch lm, tuy nhin kt qu phn tch khng hin th. Thng s dng TestRunner hin th kt qu 4. Suite Lm sao ci t chng trnh test ca bn m bn c th chy chng tt c ch mt ln ? CppUnit cung cp 1 lp TestSuite m chy vi bt k s TestCases Chng ta kho st cch chy mt chng trnh testcase n gin to mt b gm 2 hay nhiu b test, ta lm nh sau: CppUnit::TestSuite suite;
L Hng V Th Hin - Nguyn nh Hin Phm o Minh V Trng Quang Bnh Long

Trang 24

ti: Mn Nguyn L Lp Trnh 1 CppUnit::TestResult result; Suite.addTest (new CppUnit::TestCaller<ComplexNumberTest> (testEquality, &ComplexNumberTest::testEquality)); Suite.addTest(new CppUnit::TestCaller<ComplexNumberTest>(testAddition, &ComplexNumberTest::testAddition)); Suite.run (&result); TestSuite khng ch bao gm li gi hm TestCases.Chng c th cha bt k i tng m c ci t mc giao din (interface) Test. V d, bn c th to mt TestSuite trong on m lnh ca bn v ti c th to TestSuite trong on m lnh ca ti, v chng ta c th chy cng nhau bi vic to mt TestSuite cha c hai nh sau: CppUnit::TestSuite suite; CPPUnit::TestResult result; Suite.addTest(ComplexNumberTest::suite()); Suite.addTest(SurrealNumberTest::suite()); Suite.run (&result); 5. TestRunner Lm sao bn chy chng trnh test ca bn v thu thp cc kt qu ? Mi khi bn c mt test suite, bn mun chy n. CppUnit cung cp cng c cho php bn nh ngha suite chy v hin th kt qu. Bn to mt suite truy cp vo chng trnh TestRunner vi phng thc tnh la suite tr v mt test suite. V d, to mt suite ComplexNumber ti TestRunner, thm on code sau vo ComplexNumberTest: Public : Static : CppUnit::Test *suite() { CppUnit::TestSuite *suiteOfTests = new CppUnit::TestSuite (ComplexNumberTest);
L Hng V Th Hin - Nguyn nh Hin Phm o Minh V Trng Quang Bnh Long

Trang 25

ti: Mn Nguyn L Lp Trnh 1 suiteOfTests -> addTest(new CppUnit::TestCaller<ComplexNumberTest>(testEquality,&ComplexNumberTest::t estEquality)); suiteOfTests->addTest (new CppUnit::TestCaller<ComplexNumberTest>(testAddition, &ComplexNumberTest::testAddition)); return suiteOfTests; } s dng li, ta include tp tin TestRunner.h vo tp tin Main.cpp #include <cppunit/ui/text/TestRunner.h> #include ExampleTestCase.h #include ComplexNumberTest.h V thm li gi hm addTest(CppUnit::Test *) trong hm main () Int main (int argc, char **argv) { CppUnit::TextUi::TestRunner runner; Runner.addTest (ExampleTestCase::suite()); Runner.addTest(ComplexNumberTest::suite()); Runner.run (); Return 0; } TestRunner s chy on kim chng. Nu tt c chy qua, bn s nhn c mt thng bo. Ngc li, bn s nhn c nhng thng bo sau: Tn ca test case sai Tn ca tp tin ngun cha kim chng Dng b li Ni dung trong CPPUNIT_ASSERT s hin th CppUnit phn bit gia failures v errors. Faiure l nhng li c th on, cn error th khng on trc c. V d nh li chia cho 0 l dng error.
L Hng V Th Hin - Nguyn nh Hin Phm o Minh V Trng Quang Bnh Long

Trang 26

ti: Mn Nguyn L Lp Trnh 1

6. Helper Macros Nh ta thy, phng thc suite() c lp i lp li, kt xut c to t ng. on m lnh sau vit li phng thc ComplexNumberTest #include <cppunit/extensions/HelpMacros.h> Class ComplexNumberTest: public CppUnit::TestFixture {} Trc ht, ta khai bo suite, gi tn lp vo marco CPPUNIT_TEST_SUITE (ComplexNumberTest); Suite c to t phng thc site() c tn sau tn lp. Sau , chng ta s khai bo cho mi test case ca fixture: CPPUNIT_TEST (testEquality); CPPUNIT_TEST (testAddition); Cui cng, chng ta khai bo: CPPUNIT_TEST_SUITE_END(); Ti thi im ny, phng thc sau c ci t: Static CppUnit::TestSuite *suite(); Phn cn li ca fixture th khng thay i: Private: Complex *m_10_1, *m_1_1, *m_11_2; Public: Void setUp() { m_10_1 = new Complex(10,1); m_1_1= new Complex(1,1); m_11_2 = new Complex (11,2); }
L Hng V Th Hin - Nguyn nh Hin Phm o Minh V Trng Quang Bnh Long

Trang 27

ti: Mn Nguyn L Lp Trnh 1 void tearDown () { delete m_10_1; delete m_1_1; delete m_11_2 ; } void testEquality () { CPPUNIT_ASSERT (*m_10_1== *m_10_1); CPPUNIT_ASSERT (!(*m_10_1)==*m_11_2); } void testAdditiion() { CPPUNIT_ASSERT (*m_10_1 + *m_1_1== *m_11_2); } }; Tn ca TestCaller thm vo suite l s kt hp ca tn fixture v tn ca phng thc. Lc ny, tn ca fixture l : ComplexNumberTest.testEquality v ca phng thc l ComplexNumberTest.testAddition Helper Macros gip bn vit xc nhn chung chung. V d, kim tra ComplexNumber thng qua MathException khi chia cho 0: Thm mt trng hp bng vic s dng CPPUNIT_TEST_EXCEPTION, c t loi exception ny Vit mt phng thc kim tra CPPUNIT_TEST_SUITE (ComplexNumberTest); //{...} CPPUNIT_TEST_EXCEPTION (testDivideByZeroThrows, MathException);
L Hng V Th Hin - Nguyn nh Hin Phm o Minh V Trng Quang Bnh Long

Trang 28

ti: Mn Nguyn L Lp Trnh 1 CPPUNIT_TEST_SUITE_END(); // {...} void testDivideByZeroThrows() { // Hm sau nn gi qua MathException *m_10_1/ComplexNumber(0); } Nu exception khng c thc thi th s xc nhn s hin th ln. 7. TestFactoryRegistry TestFactoryRegistry dng gii quyt 2 li: Qun thm fixture site vo Test runner Gii quyt s c tc nghn c chai khi include tt c cc test case vo header TestFactoryRegistry c khai bo ni c th c ng k ti thi im khi to ng k ComplexNumber, trong tp tin .cpp, thm vo: #include <cppunit/extensions/HelperMacros.h> CPPUNIT_TEST_SUITE_REGISTRATION (ComplexNumberTest); Khi bin AutoRegisterSuite c khai bo, trong constructor, n s ngk TestSuiteFactory vo TestsFactoryRegistry. TestSuiteFactory tr v TestSuite trong ComplexNumber::suite() chy kim chngn, s dng Test Runner, chng ta khng cn phi include na #include <cppunit/extensions/TestFactoryRegistry.h> #include <cppunit/ui/text/TestRunner.h> int main (int argc, char **argv) { CppUnit::TestUi::TestRunner runner; }
L Hng V Th Hin - Nguyn nh Hin Phm o Minh V Trng Quang Bnh Long

Trang 29

ti: Mn Nguyn L Lp Trnh 1

Trc ht, chng ta truy cp th hin ca TestFactoryRegistry: CppUnit::TestFactoryRegistry &registry = CppUnit::TestFactoryRegistry::getRegistry(); Sau o, chng ta thm TestSuite bi TestFactoryRegistry m cha tt c nhng kim chng bng vic s dng CPPUNT_TEST_SUITE_REGISTRATION() Runner.addTest(registry.makeTest()); Runner.run (); Return 0; 8. Post- build check By gi, chng ta c chng trnh kim chng. Vic tch hp modul ny vo tin trnh buid th sao? lm iu ny, ng dng phi tr v mt gi tr khc 0 ch ra mt li. TestRunner::run() tr v TRUE nu thnh cng. Cp nht li chng trnh chnh nh sau: #include <cpp/extensions/TestFactoryRegistry.h> #include <cppunit/ui/text/TestRunner.h> int main (int argc, char **argv) { CppUnit::TestUi::TestRunner runner; CppUnit::TestFactoryRegistry & registry = CppUnit::TestFactoryRegistry::getRegistry(); Runner.addTest (registry.makeTest()); Bool wasSuccessful = runner.run(, false); Return wasSuccefull; } By gi, sau khi bin dch chng ta c th chy ng dng Vi Visual C++, lm iu ny trong Project Ssetting/Post-Build step bng cch thm vo dng lnh sau: example/cppunittest/CppUnitTestMain.cpp

L Hng V Th Hin - Nguyn nh Hin Phm o Minh V Trng Quang Bnh Long

Trang 30

ti: Mn Nguyn L Lp Trnh 1

PHN III D N MONEY MT V D C TH I. Chun b cho d n Money

1. Bin dch v ci t th vin CppUnit


Th vin CppUnit l th vin cn thit cho cc chng trnh mun b sung thm chc nng kim chng tnh ng n ca chng trnh m mnh ang pht trin. Trc tin hy truy cp vo a ch http://cppunit.sourceforge.net download phin bn mi nht ca th vin ny (phin bn mi nht l 1.10.2) v gii nn vo mt th mcno gi l $CPPUNIT. a. Bin ch th vin CppUnit Khi ng VC++ v m d n $CPPUNIT/src/CppUnitLibaries.dsw. Chn mc Batch Build t trnh n Build. Trong hp i thoi Batch Build, chn tt c d n v nhn nt Build. Nhng th vin cn thit s c to ra th mc $CPPUNIT/lib. b. Thit lp thng s mi trng Khi bin dch thnh cng th vin, bc tip theo chng ta cn lm l ch cho VC++ bit ni no cha cc tp tin header v cc th vin c th s dng c cho cc d n khc. Chn lnh Tool Options, mt khung i thoi s c m ra. bng Directories, chn mc Include files combo box Show directories for, v thm mi 1 mc vo danh sch Directories di. Mc mi ny tr n $CPPUNIT/includes. Lp li bc trn cho mc Library files combo box Show directories for, vi gi tr l $CPPUNIT/lib. Lp li bc trn cho mc Source files combo box Show directories for, vi gi tr l $CPPUNIT/scr/cppunit.

L Hng V Th Hin - Nguyn nh Hin Phm o Minh V Trng Quang Bnh Long

Trang 31

ti: Mn Nguyn L Lp Trnh 1

2. Bt u vi mt d n n gin
Chng ta bt u tm hiu th vin CppUnit bng vic dng AppWizard to mt ng dng Console n gin vi tn l MoneyApp. Tip theo ta thc hin vic lin kt th vin CppUnit vo d n hin hnh thng qua lnh Project Settings nh sau: mc Category trong bng C++ chn Code generation, chn gi tr Multithreaded DLL cho cu hnh release v Debug Multithreaded DLL cho cu hnh debug. mc Category trong bng C++ chn C++ Language, bt chc nng enable Run-Time Type Information (RTTI) cho tt c cc cu hnh. mc Object libary/modules trong bng Link, thm vo cppunitd.lib cho cu hnh debug v cppunit.lib cho cu hnh release. n thi im ny, hm main ca d n m chng ta va to vn hon ton trng rng v by gi l lc to mt test n gin. Trong v d ny chng ta s dng TextTestRunner vi CompilerOutputter thc hin bi test ngay sau khi bin dch chng trnh.
MoneyApp.cpp #include "stdafx.h" #include <cppunit/CompilerOutputter.h> #include <cppunit/extensions/TestFactoryRegistry.h> #include <cppunit/ui/text/TestRunner.h> int main(int argc, char* argv[]) { // Get the top level suite from the registry CppUnit::Test *suite = CppUnit::TestFactoryRegistry::getRegistry().makeTest(); // Adds the test to the list of test to run CppUnit::TextUi::TestRunner runner; runner.addTest( suite ); // Change the default outputter to a compiler error format outputter runner.setOutputter( new CppUnit::CompilerOutputter( &runner.result(),std::cerr ) ); // Run the tests. bool wasSucessful = runner.run(); // Return error code 1 if the one of test failed. return wasSucessful ? 0 : 1; }

L Hng V Th Hin - Nguyn nh Hin Phm o Minh V Trng Quang Bnh Long

Trang 32

ti: Mn Nguyn L Lp Trnh 1

Bin dch v thc hin chng trnh. Chng trnh c thc hin v bo rng mi chuyn din bin tt p v khng c test no c thc thi ht.

3. Thit lp ch kim tra (test) t ng ngay sau khi bin dch chng trnh
Kim tra t ng ngay sau khi bin dch chng trnh l g? iu ny c ngha l c mi ln bn bin dch chng trnh, nhng bi test s c thc thi mt cch t ng ngay sau khi chng trnh va c bin dch xong. iu ny rt hu ch i vi mt chng trnh ln v tng i phc tp v ngay lc chng ta bit c rng chng trnh va c bin dch xong chy ng hoc c vn mt s im no . s dng chc nng ny trong d n ca mnh, chng ta thc hin cc bc sau: - S dng lnh Project Settings v chn bng Post-build step. - Chn gi tr All Configurations combo box Settings For. - in vo gi tr Unit testing... textbox Post-build description. - khung lit k Post-build command(s), thm vo mt mc mi vi gi tr l $(TargetPath) (khng c u nhy kp). Macro $(TargetPath) s cha gi tr l tn y (bao gm lun ng dn) ca d n va to. Nhng thit lp trn ngm ng vi VC++ rng hy thc thi chng trnh ngay saukhi bin dch xong. Ch rng dng lnh cui cng trong hm main() ca d n tr v cc m li khc nhau ph thuc vo vic kim tra chng trnh c thnh cng hay khng. Nu m li khc 0, iu c ngha l qu trnh bin dch chng trnh c vn . Bin dch li chng trnh v chng ta s thy l ngay sau khi chng trnh c bin dch xong th n c thc thi t ng v m li tr v ngay bn trong ca s Build ca VC++. Thm vo d n mt TestFixture Trong phn ny hiu r hn v th vin CppUnit, chng ta thc hin vit mt lp n gin tn l Money. By gi chng ta bt u bng vic to mt ni c t cc bi kim tra (test) ca chng ta v thm vo mt bi kim tra vo phng thc khi to ca lp Money.
MoneyTest.h: #ifndef MONEYTEST_H #define MONEYTEST_H #include <cppunit/extensions/HelperMacros.h> class MoneyTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE( MoneyTest ); CPPUNIT_TEST( testConstructor );

L Hng V Th Hin - Nguyn nh Hin Phm o Minh V Trng Quang Bnh Long

Trang 33

ti: Mn Nguyn L Lp Trnh 1


CPPUNIT_TEST_SUITE_END(); public: void setUp(); void tearDown(); void testConstructor(); }; #endif // MONEYTEST_H

Macro CPPUNIT_TEST_SUITE dng khai bo ni t cc bi kim tra. Macro CPPUNIT_TEST dng thm mt bi kim tra vo h thng. Trong v d trn bi kim tra c thc thi thng qua hm c tn l testConstructor(). Cc hm setUp() v tearDown() c dng thit lp hoc g b ni t cc bi kim tra (fixture).

MoneyTest.cpp #include "stdafx.h" #include "MoneyTest.h" // Registers the fixture into the 'registry' CPPUNIT_TEST_SUITE_REGISTRATION( MoneyTest ); void MoneyTest::setUp() { } void MoneyTest::tearDown() { } void MoneyTest::testConstructor() { CPPUNIT_FAIL( "not implemented" ); }

Tin hnh bin dch li chng trnh v trong khung ca s Build, VC+ + bo l c mt bi kim tra khng c thc thi thnh cng. Nhn phm F4, VC++ s nhy ngay n ch gy ra nguyn nhn bi kim tra b tht bi.
Compiling... MoneyTest.cpp Linking... Unit testing... .F F:\ TestCppUnit\MoneyTest.cpp(24):Assertion Test name: MoneyTest::testConstructor

L Hng V Th Hin - Nguyn nh Hin Phm o Minh V Trng Quang Bnh Long

Trang 34

ti: Mn Nguyn L Lp Trnh 1


forced failure - not implemented Failures !!! Run: 1 Failure total: 1 Failures: 1 Errors: 0 Error executing d:\winnt\system32\cmd.exe. TestCppUnit.exe - 1 error(s), 0 warning(s)

n giai on ny mi vic c thit lp mt cch ng n. Bc tip theo chng ta s to ra mt s bi kim tra thc s. Bi kim tra u tin By gi chng ta s bt tay vo vit mt bi kim tra thc s. Mt bi kim tra thng thng bao gm 3 phn: - Thit lp d liu dng cho cc bi kim tra. - Thc hin mt s thao tc da trnnhng d liu . - Kim tra kt qu ca cc thao tc trn.
void MoneyTest::testConstructor() { // Set up const std::string currencyFF( "FF" ); const double longNumber = 12345678.90123; // Process Money money( longNumber, currencyFF ); // Check CPPUNIT_ASSERT_EQUAL( longNumber, money.getAmount() ); CPPUNIT_ASSERT_EQUAL( currencyFF, money.getCurrency() ); }

By gi l thi im thch hp ci t lp Money.


Money.h #ifndef MONEY_H #define MONEY_H #include <string> class Money { public: Money( double amount, std::string currency ) : m_amount( amount ) , m_currency( m_currency ) { } double getAmount() const {

L Hng V Th Hin - Nguyn nh Hin Phm o Minh V Trng Quang Bnh Long

Trang 35

ti: Mn Nguyn L Lp Trnh 1


return m_amount; } std::string getCurrency() const { return m_currency; } private: double m_amount; std::string m_currency; }; #endif

tp tin MoneyTest.cpp, thc hin vic lin kt n vi lp Money va to thng qua lnh: #include Money.h v tin hnh bin dch li chng trnh. Ngay sau khi bin dch chng trnh xong, VC++ bo mt li assertion. Nhn phm F4 chng ta s nhy n ni kim tra loi tin t ca i tng Money va to. Li ny c ngha l chui k th khng phi l mt gi tr c mong i. iu ny ch xy ra do hai nguyn do: bin thnh vin khng c khi to mt cch ng n hoc hm tr v mt gi tr sai. Sau khi kim tra li chng ta pht hin iu ny xy ra do bin khng c khi to ng. on chng trnh c sa li nh sau:
Money.h Money( double amount, std::string currency ) : m_amount( amount ) , m_currency( currency ) { }

Tin hnh bin dch li chng trnh v khng c li no xy ra na. To thm cc bi kim tra khc

1. Kim tra bng


Mt vn t ra l kim tra xem 2 i tng Money c bng nhau hay khng. Chng ta hy bt u bng vic thm vo 1 bi kim tra mi vo d n hin ti v sau thm vo cc phng thc ca ring chng ta.
MoneyTest.h CPPUNIT_TEST_SUITE( MoneyTest ); CPPUNIT_TEST( testConstructor ); CPPUNIT_TEST( testEqual );

L Hng V Th Hin - Nguyn nh Hin Phm o Minh V Trng Quang Bnh Long

Trang 36

ti: Mn Nguyn L Lp Trnh 1


CPPUNIT_TEST_SUITE_END(); public: ... void testEqual(); MoneyTest.cpp void MoneyTest::testEqual() { // Set up const Money money123FF( 123, "FF" ); const Money money123USD( 123, "USD" ); const Money money12FF( 12, "FF" ); const Money money12USD( 12, "USD" ); // Process & Check CPPUNIT_ASSERT( money123FF == money123FF ); // == CPPUNIT_ASSERT( money12FF != money123FF ); // != amount CPPUNIT_ASSERT( money123USD != money123FF ); // != currency CPPUNIT_ASSERT( money12USD != money123FF ); // != currency and != amount }

Tip theo chng ta thc hin vit chng trnh cho ton t == v ton t != ca lp Money.
Money.h class Money { public: ... bool operator ==( const Money &other ) const { return m_amount == other.m_amount && m_currency == other.m_currency; } bool operator !=( const Money &other ) const { return (*this == other); } };

Thc hin vic bin dch chng trnh v chng ta pht hin mt li. Nhn phm F4 xem chng trnh b li g v chng ta pht hin rng ton t != c vn . on chng trnh sau s gii quyt vn ny.
bool operator !=( const Money &other ) const { return !(*this == other); }

L Hng V Th Hin - Nguyn nh Hin Phm o Minh V Trng Quang Bnh Long

Trang 37

ti: Mn Nguyn L Lp Trnh 1 Bin dch li chng trnh v khng c li no c pht hin na.

2. Cng tin t
Thm mt phng thc testAdd vo lp MoneyTest tin hnh kim tra thao tc cng 2 tin t.
MoneyTest.cpp void MoneyTest::testAdd() { // Set up const Money money12FF( 12, "FF" ); const Money expectedMoney( 135, "FF" ); // Process Money money( 123, "FF" ); money += money12FF; // Check CPPUNIT_ASSERT_EQUAL( expectedMoney.getAmount, money.getAmount() ); // += works CPPUNIT_ASSERT( &money == &(money += money12FF) ); // += returns ref. on 'this'. }

Trong khi vit chng trnh, chng ta t hi l vic cng 2 loi tin t khc nhau s dn n kt qu g? D thy rng iu s gy ra mt li v li ny phi c bo cho ngi s dng bit, c th l qung ra mt exception l IncompatibleMoneyError, khi cng 2 loi tin khc nhau. Chng ta s vit mt bi test khc cho vn ny. By gi chng ta hy thm mt s lnh phng thc testAdd hot ng.
Money.h class Money { public: ... Money &operator +=( const Money &other ) { m_amount += other.m_amount; return *this; } };

Bin dch chng trnh, mi chuyn din ra tt p. By gi kim tra li rng cc bi kim tra ca chng ta hot ng ng, on chng trnh trn, i m_amount += thnh -=. Tin hnh bin dch li chng trnh v kim tra rng c mt li xy ra. Thay i li -= thnh += mi bi kim tra u c vt qua.
L Hng V Th Hin - Nguyn nh Hin Phm o Minh V Trng Quang Bnh Long

Trang 38

ti: Mn Nguyn L Lp Trnh 1 By gi chng ta tin hnh vit chng trnh kim tra 2 loi tin t c ging nhau hay khng trc khi tin hnh vic cng chng. Bi kim tra ny s qung ra mt bit l (exception) IncompatibleMoneyError. Thu vin CppUnit c th gip chng ta thc hin vic ny.
MoneyTest.h class MoneyTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE( MoneyTest ); CPPUNIT_TEST( testConstructor ); CPPUNIT_TEST( testEqual ); CPPUNIT_TEST( testAdd ); CPPUNIT_TEST_EXCEPTION( testAddThrow, IncompatibleMoneyError ); CPPUNIT_TEST_SUITE_END(); public: ... void testAddThrow(); };

Vi cch quy c mc nhin, nhng bi kim tra no tn cng bng Throw, s ngm nh rng bi kim tra s qung ra mt bit l (exception).
MoneyTest.cpp void MoneyTest::testAddThrow() { // Set up const Money money123FF( 123, "FF" ); // Process Money money( 123, "USD" ); money += money123FF; // should throw an exception } Money.h #include <string> #include <stdexcept> class IncompatibleMoneyError : public std::runtime_error { public: IncompatibleMoneyError() : runtime_error( "Incompatible moneys" ) { } };

Tin hnh bin dch li chng trnh v nh mong i, hm testAddThrow() b mt li exception. Li ny c sa li nh sau:
L Hng V Th Hin - Nguyn nh Hin Phm o Minh V Trng Quang Bnh Long

Trang 39

ti: Mn Nguyn L Lp Trnh 1


Money.h Money &operator +=( const Money &other ) { if ( m_currency != other.m_currency ) throw IncompatibleMoneyError(); m_amount += other.m_amount; return *this; }

Bin dch li chng trnh v mi chuyn din ra tt p.

-----------Ht ------------

L Hng V Th Hin - Nguyn nh Hin Phm o Minh V Trng Quang Bnh Long

Trang 40

You might also like