bddmoi

download bddmoi

of 10

Transcript of bddmoi

Pht trin hnh vi iu khin (BDD) l mt phn mm k thut pht trin nhanh, khuyn khch s hp tc gia cc nh pht trin, bo m cht lng v phi k thut tham gia kinh doanh trong mt d n phn mm. Ban u n c t tn vo nm 2003 bi Dan North nh l mt phn ng th nghim Pht trin trin Driven, bao gm c kim tra chp nhn hoc thc hnh th nghim pht trin khch hng nh hng nh c tm thy trong Extreme Programming. N pht trin trong nhng nm gn y . Trn "Thng s k thut Agile, BDD v Testing eXchange " vo thng Mi nm 2009 ti London, Dan North a ra nh ngha sau y ca BDD BDD l mt th h th hai, bn ngoi trong, ko, nhiu bn lin quan, nhiu quy m, t ng ha cao, phng php nhanh nhn. N m t mt chu k ca s tng tc vi kt qu u ra c xc nh, kt qu trong vic cung cp lm vic, th nghim phn mm c vn . BDD tp trung vo c mt s hiu bit r rng v hnh vi ca phn mm mong mun thng qua tho lun vi cc bn lin quan. N m rng TDD bng cch vit cc trng hp th nghim trong mt ngn ng t nhin m khng phi lp trnh c th c. Pht trin theo nh hng hnh vi s dng ngn ng m ca h kt hp vi ngn ng ph bin ca thit k min hng m t mc ch v li ch ca m ca h. iu ny cho php cc nh pht trin tp trung vo l do ti sao m c to ra, ch khng phi l cc chi tit k thut, v gim thiu dch gia cc ngn ng k thut, trong m l bng vn bn v ngn ng min ni bi cc doanh nghip, ngi s dng, cc bn lin quan, qun l d n, vv . Dan North to ra khun kh BDD u tin, JBehave , theo sau l mt khun kh cu chuyn BDD cp cho Ruby c gi l RBehave m sau ny c tch hp vo cc d n RSpec. ng cng lm vic vi David Chelimsky, Aslak Hellesy v nhng ngi khc pht trin RSpec v cng c th vit "Sch RSpec: Hnh vi pht trin Driven vi RSpec, da chut, v bn b". Cu chuyn u tin da trn khun kh trong RSpec sau c thay th bng da chut ch yu c pht trin bi Aslak Hellesy. Trong nm 2008, Chris Matts, ngi tham gia vo cc cuc tho lun u tin xung quanh BDD, a ra vi tng ca tim tnh nng, cho php BDD trang tri cc khng gian phn tch v cung cp mt phng php iu tr y ca vng i phn mm t tm nhn thng qua m v pht hnh. Ni dung 1 BDD thc hnh 2 Ngoi 3 ng dng v d trong ngn ng Gherkin o 3,1 Kch bn 1: mc Hon c tr li cho chng khon o 3,2 Kch bn 2: thay th phi c tr li cho chng khon 4 Lp trnh min v d v hnh vi 5 S dng mocks 6 Ti liu tham kho 7 Lin kt ngoi BDD thc hnh

Cc tp qun ca BDD bao gm: Xy dng cc mc tiu ca cc bn lin quan khc nhau cn thit cho mt tm nhn c thc hin V ra cc tnh nng m s t c nhng mc tiu bng cch s dng tnh nng tim Lin quan n cc bn lin quan trong qu trnh thc hin thng qua pht trin phn mm bn ngoi S dng v d m t hnh vi ca ng dng, hoc ca cc n v m T ng ho nhng v d cung cp thng tin phn hi nhanh chng v th nghim hi quy S dng 'nn' khi m t hnh vi ca phn mm gip lm r trch nhim v cho php chc nng ca phn mm b thm vn S dng "m bo" khi m t trch nhim ca phn mm phn bit cc kt qu trong phm vi ca cc m trong cu hi t cc tc dng ph ca cc yu t khc ca m. S dng ch nho ng, phi hp m-un m cha c vit [Sa] Bn ngoi BDD c iu khin bi gi tr kinh doanh [6], c ngha l, li ch cho cc doanh nghip m tch ly mt khi ng dng c trong sn xut. Cch duy nht m trong li ch ny c th c thc hin thng qua giao din ngi dng (s) ng dng, thng (nhng khng phi lun lun) mt giao din ha. Trong cng mt cch, mi on m, bt u vi giao din ngi dng, c th c coi l cc bn lin quan ca cc module khc ca m m n s dng. Mi phn t ca m cung cp mt s kha cnh ca hnh vi, phi hp vi cc yu t khc, cung cp cc hnh vi ng dng. Phn u tin ca m sn xut m cc nh pht trin BDD thc hin l giao din ngi dng. Pht trin sau c th c hng li t thng tin phn hi nhanh chng cho d giao din ngi dng v c x mt cch thch hp. Thng qua m, v s dng cc nguyn tc ca thit k tt v cu trc li, cc nh pht trin khm ph cc cng tc vin ca giao din ngi dng, v ca tt c cc n v ca cc m sau . iu ny gip h tun th cc nguyn tc YAGNI, v mi phn ca m sn xut l yu cu ca doanh nghip, hoc mt on m c vit. [Sa] v d ng dng trong ngn ng Gherkin Cc yu cu ca mt ng dng bn l c th c, "mc Hon, trao i nn c tr li cho c phiu." Trong BDD, mt nh pht trin hoc k s bo m cht lng c th lm r cc yu cu bng cch ph v ny thnh v d c th, v d nh Lu : Ngn ng ca cc v d di y c gi l Gherkin v c s dng trong da leo cho ruby [7], "rau dip cho python" [8], specflow cho DotNet [9] v behat cho php [10] [Sa] Kch bn 1: mc Hon c tr li cho chng khon Cho mt khch hng trc y mua mt chic o len mu en ca ti Ti hin ang c ba o len mu en cn li trong kho khi ng tr li chic o len hon sau ti c bn o len mu en trong kho

[Sa] Kch bn 2: mt hng thay th phi c tr li cho chng khon Vi mt khch hng mua mt b qun o mu xanh v ti c hai hng may mc mu xanh trong kho v c ba mu en hng may mc trong kho. Khi ng tr v may mc cho mt s thay th trong mu en, Sau , ti c ba sn phm may mc mu xanh trong kho v hai mu en hng may mc chng khon Mi kch bn l mt mu mc, c thit k minh ha mt kha cnh c th ca hnh vi ca ng dng. Khi tho lun v cc kch bn, cc i biu t cu hi liu cc kt qu m t lun lun l kt qu ca nhng s kin xy ra trong bi cnh nht nh. iu ny c th gip pht hin ra kch bn tip tc lm r cc yu cu [11]. V d, mt chuyn gia v min nhn thy rng cc mt hng hon tr khng phi lc no cng quay tr li chng khon c th reword cc yu cu "cc mt hng Hon hoc thay th phi c tr li cho c phiu tr khi b li." iu ny s gip ngi tham gia xc nh phm vi cc yu cu, dn n c tnh tt hn bao lu nhng yu cu ny s thc hin thc hin. Nhng li Given, khi no v Sau , thng c s dng gip cc kch bn, nhng khng bt buc. Nhng kch bn ny cng c th c t ng, nu mt cng c thch hp tn ti cho php t ng ha cp giao din ngi dng. Nu khng c cng c nh vy tn ti sau n c th c th t ng ha cp tip theo, tc l: nu mt m hnh MVC thit k c s dng, mc iu khin. [Sa] Lp trnh vin min v d v hnh vi Cc nguyn tc cng mt v d, s dng bi cnh, s kin v kt qu c s dng a pht trin mc tru tng ca cc lp trnh vin, nh tri ngc vi mc kinh doanh. V d, cc v d sau y m t mt kha cnh ca hnh vi ca mt danh sch: V d 1: danh sch mi c sn phm no Vi mt danh sch mi Sau , danh sch c sn phm no. V d 2: Danh mc vi nhng th trong khng c sn phm no. Vi mt danh sch mi Khi chng ta thm mt i tng Sau , danh sch khng nn trng. C hai v d l cn thit m t hnh vi ca cc list.isEmpty () phng php, v ly c cc li ch ca phng php ny. Nhng v d ny thng c t ng s dng cc khun kh TDD. BDD nhng v d ny thng c gi gn trong mt phng php duy nht, vi tn ca phng php c m t y ca hnh vi. C hai v d l cn thit cho cc m c gi tr, v ng gi theo cch ny lm cho n d dng cho cu hi, loi b hoc thay i hnh vi. V d, bng cch s dng Java v JUnit 4, cc v d trn c th tr thnh: 1. public class ListTest {

Test public void shouldKnowWhetherItIsEmpty() { List list1 = new List(); assertTrue(list1.isEmpty()); List list2 = new List(); list2.add(new Object()); assertFalse(list2.isEmpty()); } } Cc hc vin khc, c bit l trong cng ng Ruby, thch phn chia cc thnh hai v d ring bit, da trn bi cnh ring bit khi danh sch c sn phm no hoc c mc. K thut ny c da trn thc hnh Dave Astels, khng nh "mi th nghim [12 ] ". i khi s khc bit gia bi cnh, s kin v kt qu c thc hin r rng hn. V d:

public class WindowControlBehavior { Test public void shouldCloseWindows() { // Given WindowControl control = new WindowControl("My AFrame"); AFrame frame = new AFrame(); // When control.closeWindow(); // Then ensureThat(!frame.isShowing());

} }

Tuy nhin, v d l cu ni, hiu ng m t hnh vi ca cc m trong cu hi. V d, t cc v d trn mt c th ly c: Danh sch nn bit khi no n l trng rng WindowControl nn ng ca s M t l nhm mc ch c ch nu th nghim tht bi, v cung cp ti liu hng dn hnh vi ca m. Mt khi cc v d c vit sau chy v m thc hin lm cho h lm vic trong cng mt cch nh TDD. Cc v d sau tr thnh mt phn ca b ng dng cc bi kim tra hi quy. [Sa] mocks S dng BDD nhng ngi ng h cho rng vic s dng "nn" ensureThat "v trong cc v d BDD khuyn khch cc nh pht trin t cu hi liu cc trch nhim ca

h ang giao n cc lp hc ca h l thch hp, hoc liu h c th c y quyn hoc chuyn n lp khc hon ton. Cc hc vin s dng mt i tng n gin hn so vi m hp tc, v cung cp giao din tng t, nhng hnh vi d on nhiu hn. iu ny c tim vo cc m m cn n, v v d ca hnh vi l m c vit bng cch s dng i tng ny thay v phin bn sn xut. Nhng i tng ny c th c to ra bng tay, hoc to ra bng cch s dng mt khun kh mocking nh Mockito, Moq, NMock, Rhino Mocks, JMock hoc EasyMock. t cu hi trch nhim theo cch ny, v s dng mocks thc hin vai tr cn thit ca cc lp hc cng tc, khuyn khch vic s dng giao din da trn vai tr. N cng gip gi cho cc lp hc nh v lng lo.

on 1: public class StackBehavior { public void shouldThrowExceptionUponNullPush() throws Exception{} public void shouldThrowExceptionUponPopWithoutPush() throws Exception{} public void shouldPopPushedValue() throws Exception{} public void shouldPopSecondPushedValueFirst() throws Exception{} public void shouldLeaveValueOnStackAfterPeep() throws Exception{} }Cc phng php xc nh trong stack 1 tt c bt u vi Should v tt c u to ra mt cu m con ngi c th c c. kt qu lp StackBehavior m t nhiu cc tnh nng ca Stack trong cc cuc tr chuyn gia A v B V d, A ni rng mt Stack nn nm ra mt ngoi l nu ngi dng c gng y 1 gi tr null vo n. Kim tra cc phng php hnh vi u tin trong lp StackBehavior: N c gi l

shouldThrowExceptionUponNullPush (). Cc phng php khc theo cng mt khun mu. M hnh ny t tn m t lm cho n c th pht biu mt hnh vi khng trong mt cch thc m con ngi c th c c , nh bn s thy ngay. Pht biu ca shouldThrowExceptionUponNullPush (), lm th no bn s xc minh hnh vi ny? Dng nh vi ti rng trc tin bn s cn mt push () phng php trn mt lp Stack, l d dng xc nh.

public class Stack { public void push(E value) {} }Nh bn c th thy, ti c m ha s lng thiu ca stack ti c th bt u b sung cc hnh vi cn thit u tin. Nh A ni, hnh vi ny l n gin: Nu mt ngi no gi push() vi mt gi tr null, ngn xp nn nm ra mt ngoi l. By gi xem xt lm th no ti xc nh hnh vi ny trong on 3 Code3:

public void shouldThrowExceptionUponNullPush() throws Exception{ final Stack stStack = new Stack(); Ensure.throwsException(RuntimeException.class, new Block(){ public void run() throws Exception { stStack.push(null); } } ); }Mt vi iu ang xy ra trong V d 3 l duy nht JBehave, v vy hy ti gii thch. Trc tin, ti to ra mt th hin ca Stackclass v gii hn l loi String .Tip theo, ti s dng JBehave's

expectation framework v c bn m hnh hnh vi ca ti mong mun.m bo lp l tng t nh loi Khng nh JUnit hoc th nghim, tuy nhin, n b sung thm mt lot cc phng php to iu kin thun li cho mt API d c hn (iu ny thng c gi l bit ch lp trnh).Trong V d 3, ti m bo rng mt RuntimeException s c nm ra nu gi puss() vi 1 gia tr null. JBehave cng gii thiu mt loi Block, c thc hin bngcch trng phng thc run () vi hnh vi mong mun ca bn.Ni b, JBehave m bo rng loi ngoi l mong mun ca bnkhng phi l nm (v, do , b bt), mt pht biu khng c to ra. Bn c th nh li mt m hnh tng t trng mt lp hc thun tin trong bi vit trc y ca ti v n v kim nghim Ajax vi Google Web Toolkit, trong trng hp , ghi ln c thc hin vi lp Timer ca GWT. Nu ti chy cc hnh vi t Lit k 3 gi, ti s thy mt tht bi.Nh m ho, phng thc push () khng lm bt c iu g, v th khng c cch no mt ngoi l s c to ra, bn c th thy t u ra trong on 4. Code 4:

StackBehavior should throw exception upon null push: VerificationException: Expected: object not null but got: null:Cu trong Lit k 4 ", StackBehavior should throw exception upon null push,", bt chc tn ca hnh vi(shouldThrowExceptionUponNullPush ()) cng vi tn ca lp. V c bn, JBehave bo co rng n khng nhn c bt c iu g khi n chy cc hnh vi mong mun. Tt

nhin, bc tiptheo ca ti l lm cho rng thng qua hnh vi, m ti thc hin bng cch kim tra cho null trong Lit k 5. code 5: public void push(E value) { if(value == null){ throw new RuntimeException("Can't push null"); } } Khng u ra trong V d 6 ci nhn tng t nh sn lngJUnit? iu c l khng phi l mt s trng hp ngu nhin, l n? Nh cp, JBehave c m hnh ha sau khi m hnh xUnit v thm ch cn h tr c thng qua setUp () vteardown (). Cho rng ti c th s c s dng mt v d Stacktrong sut lp hc hnh vi ca ti, ti cng c th y (khng c nh chi ch) logic vo mt vt c nh, nh ti lm trongLit k 7. Lu rng JBehave s thc hin theo cc hp ng c nh tng t nh JUnit sau - l, n s chy mt andtearDownsetUp () () cho tt c cc phng php hnh vi. code 7: public class StackBehavior { private Stack stStack;

public void setUp() { this.stStack = new Stack(); } //... } Chuyn sang phng php hnh vi tip theo,shouldThrowExceptionUponPopWithoutPush () cho bit ti s phi m bo hnh vi tng t nh cashouldThrowExceptionUponNullPush () V d 3. Nh bn c thnhn thy trong V d 8, c khng phi l bt k php thut no cbit xy ra - hoc l c? Code 8: public void shouldThrowExceptionUponPopWithoutPush() throws Exception{ Ensure.throwsException(RuntimeException.class, new Block() { public void run() throws Exception {

stStack.pop(); } }); }Nh cc bn c th tm ra, V d 8 s khng thc s bin dchvo thi im ny bi v pop () khng c vit. Nhng trc khi ti bt u lm iu (vit pop ()), chng ta hy ngh qua mt vi iu Bo m hnh vi V mt k thut, ti ch c th thc hin pop () ch nm ra mt ngoi l ti thi im ny, bt k th t gi. Nhng i xung tuyn ng ny hnh vi khuyn khch ti phi suy ngh v thc hin h tr cc c im k thut ca ti mong mun. Trong trng hp ny, m bo rng ca s pop () nm mt ngoi l nu push () khng c gi l (hoc mt cch hp l, nu Stack c sn phm no) c ngha l stack c mt pht biu.V nh Linda suy ngh trc , mt Staack thng c mt"container ni b" m thc s nm gi cc mt hng. Theo , tic th to ra an ArrayList cho lp Stack cha gi tr c truynvo phng thc push (), nh trong Lit k 9. Code 9:

public class Stack { private ArrayList list; public Stack() { this.list = new ArrayList(); } //... }By gi ti c th m ha hnh vi i vi phng thc pop (), m bo rng nu ngn xp l hp l trng rng, mt ngoi l s c nm ra.

public E pop() {

if(this.list.size() > 0){ return null; }else{ throw new RuntimeException("nothing to pop"); } }Khi ti chy cc hnh vi trong Lit k 8, mi th lm vic nhmong i: V Stack khng nm gi bt k gi tr (v th, kch thc ca n khng ln hn khng), mt ngoi l c nm ra. Phng php hnh vi tip theo c gi lshouldPopPushedValue (), m ha ra li d dng xc nh. Ti ch n gin l push () mt gi tr ("test") v m bo rng khi tigi pop (), m cng mt gi tr c tr v.