Testondersteuningin frameworksvoorwebapplicaties MirkovanEde(9902236) NijmeegsInstituutvoorInformaticaenInformatiekunde RadboudUniversiteitNijmegen Versie:1.1,11februari2009 Omvang:3ects
Samenvatting Frameworkszijneenveelgebruiktebasisvoorhetbouwenvaneenwebapplicatie. Omdatdezeapplicatiesooksteedsbedrijfskritischerworden,ishetvanbelangdat zijgoedgetestkunnenworden.daaromisdematewaarineenframeworkdaar ondersteuningvoorbiedteenbelangrijkgegeven. Omdaterzoveelwebframeworkszijn,isinditonderzoekgekekennaarslechtsdrie, populaire,frameworks:cakephp,djangoenrubyonrails.dezedrieraamwerken zijngeanalyseerdopdematevanondersteuningdiezijbiedenophetgebiedvan testen.desoortentestsdieindezeanalysezijnonderzochtzijneenverzameling vandemeestessentiëlesoortenblack ofgrayboxtestsdieuitgevoerdkunnen worden. Alleframeworksbiedeninruimemateondersteuningvoordezelfdesoortentests. Zowelmodel basedtestingalscapture and playbacktestswordendoorgeenenkel frameworkondersteunt.degrootsteverschillentredenopbijdemogelijkhedentot analyserenvandeoutputdienaardebrowsergaat.daarbijhebbencakephpen RubyonRailseenvoorsprongopDjango. 2
Inhoudsopgave Testondersteuninginframeworksvoorwebapplicaties... 1 Samenvatting... 2 Inhoudsopgave... 3 H1.Inleiding... 4 Inleiding...4 Documentstructuur...4 H2.Probleemstellingenrelevantie... 5 Kwaliteitvansoftware...5 Manierenvantesten...5 Frameworksvoorwebapplicaties...6 Onderzoeksvraagendeelvragen...7 H3.Typesoftwaretests... 8 Inleiding...8 Inventarisatie...8 Conclusie...10 H4.Frameworksvoorwebapplicaties...11 Inleiding...11 CakePHP...11 RubyonRails...13 Django...15 Features...16 Conclusie...17 H5.Vergelijkingoptestondersteuningvandeframeworks...18 Inleiding...18 Testondersteuning...18 Toelichtingopderesultaattabel...19 Conclusie...24 H6.Conclusie...26 Conclusie...26 Reflectieenaanbevelingen...26 H7.Bibliografie...27 3
H1. Inleiding Inleiding Ominzichttegevenwaaromditonderzoekwordtuitgevoerdenwathetbelang ervanis,beschrijftdithoofdstukhetprojectkadervandezebachelorthesis. Testeniseenbelangrijkonderdeelvanallemodernesoftware ontwikkelingsmethodesenhetbelangervanwordtdooriedereenwordt onderschreven,hoewelhetechterookeenonderdeelisdatervaak,vanwegetijd ofgeldgebrekalseerstebijinschiet. Eenanderbekendfenomeenisdatwebapplicaties,applicatiesdieviahetinternet gebruiktworden,steedsgroter,complexerenookbedrijfskritischerworden.dat betekentdusdathetvansteedsgroterbelangwordtomdezeapplicatiesop grondigeengestructureerdewijzetetesten. Omdatbijhetbouwenvandezewebapplicaties,zekerwanneerhetgroteen complexeapplicatiesbetreft,bijnaaltijdframeworkswordeningezet,ishetdusvan belangdatdezeframeworksondersteuningbiedenvoorhettestenvandecodeen programmatuurdiehieringemaaktworden. Ditonderzoekzaldaaromkijkennaardetestondersteuningdiedergelijke frameworksvoorwebapplicatiesbieden. Documentstructuur Inheteerstehoofdstukvandezescriptiezalhetprobleemuitdedoekenworden gedaanenaangegevenwordenwatderelevantievanhetprobleemis.daaruitzal deonderzoeksvraagvolgenendedeelvragendienodigzijnomdeze onderzoeksvraagtebeantwoorden. Dehoofdstukken3,4en5zullenvervolgensderesultatentonendieresulterenuit hetonderzoeknaardedrieopgesteldedeelvragen.daarnaastzalperhoofdstuk eenkleineconclusieoverdedeelvraagwordengetrokken,alsmedeeenstukje reflectieopderesultaten. Hetlaatstehoofdstukbevatvervolgensdeconclusievanditonderzoek,waarmee deonderzoeksvraagbeantwoordis.ookzalindithoofdstukkortworden aangegevenofenwelkvervolgonderzoekereventueelgedaankanworden. 4
H2. Probleemstellingenrelevantie Kwaliteitvansoftware Nietalleenistesteneenonderdeelvanallerecentesoftewareontwikkelingsmethodes,inspeciaalvoorsoftwareopgesteldekwaliteitsmodellen neemtheteenbelangrijkeplaatsin.demodellenvanmccall(cavano & McCall, 1978),origineelopgesteldvoordeUSAirforceenbedoeldomtebemiddelentussen ontwikkelaarsengebruikers,enboehm(boehm, Brown, & Kaspar, 1978)zijn algemeengeaccepteerdenzienrespectievelijkeralsvolgtuit (Woolderink, 2007): Afbeelding1:KwaliteitsmodelvanMcCall(links)enBoehm Zoalstezien,ruimenbeidemodelleneenaparteplekinvoordetestabilityvande softwareenonderkendendaarmee,allanggeleden,hetbelangvantestenvoorde kwaliteitvansoftware.ookhet modernere,deeersteversiestamtuit1991,de meestrecenteuit2001,standaardkwaliteitsmodelvoorsoftware,iso9126(iso, 2001),datisgebaseerdopdemodellenvanMcCallenBoehmenaangepastaande behoeftesenervaringenmetdiemodellen,laatziendathettestenvansoftware eenbelangrijkeplaatsinneemtomtekomentoteenkwaliteitsproduct. Manierenvantesten Erzijnveelaspectenwaaropsoftwaregetestkanworden:hoesnelishetsysteem (performance),hoeintensiefkanhetgebruiktworden(stress),hoegaathet systeemommetonverwachtgedragzoalsverkeerdeinputvangebruikers (robustness),hoeveiligishetsysteem(security),etcetera.waarweindezescriptie naarzullenkijken,ishetfunctioneeltesten,waarbijergetestwordtofhet programmavoldoetaandefunctioneleeisendieerzijnopgesteld,ookwel conformancetestinggenoemd. 5
Jekuntonderscheidmakentussenverschillendemanierenvantesten.Allereerstis erhetverschiltussenstatischendynamischtesten.statischtestenwordtgedaan zonderdecodedaadwerkelijkuittevoeren,zoalsbijvoorbeeldeencompilerdoet. Bijdynamischetestenwordtdeprogrammacodeweluitgevoerd.Tijdensdeze scriptiezullenwealleenkijkennaardeondersteuningvoordynamischtesten. Eenanderveelgemaaktonderscheidishetverschiltussenwhiteboxenblackbox testen.bijblackboxtestenwordthettetestenobjectgezienalseenzwartedoos, waarietsingaatenweeruitkomt.bijwhiteboxtestenheeftmendebeschikking overdeprogrammacodeengebruiktmendieomtetesten.erzijnnatuurlijkvele combinatiesmogelijk,greyboxtestengenoemd,bijvoorbeeldwanneermenweet uitwelkemoduleseensysteemisopgebouwd,maardemodulesweleenblackbox zijn. Samenvattendzullenwehetindezescriptiealleenhebbenoverdynamischblack engreyboxtesten. Frameworksvoorwebapplicaties Eenanderbekendfenomeenisdatertegenwoordigmeerenmeer,vaak bedrijfskritische,applicatieswordenontwikkelddievolledigwebbasedzijn. PopulairetalenvoorditsoortapplicatieszijnonderandereJava,Microsoft s.net talen,python,rubyenphp. Vanwegedegroteverscheidenheidaantalenbeschikbaarzijnvoorwebapplicaties, zullenwedescopebeperkentotdeopensourcetalenphp,ruby,eneventueel PythonenJava. Vooraldezetalenzijnbestaanframeworks,diehetdeontwikkelaarmakkelijker maken,zorgenvoorgestructureerde,gelaagdecodeendaaromveelgebruikt wordenbijhetontwikkelenvanwebapplicaties.bekendeframeworkszijn bijvoorbeeldrubyonrailsvoorruby,djangovoorpython,strutsenspringvoor JavaenSymphony,,hetZendframeworkenCakePHPvoorPHP. Vanwegedebeperkteomvangvanditonderzoekenhetgroteaantalframeworks datervoorsommigetalenbeschikbaaris,zullenwetweeraamwerkenbekijken. AllereerstisdatCakePHP,zoalsdenaamaldoetvermoedenisditeenPHP frameworkenwekiezendezeomdatphpeenzeerpopulairetaalisvoor webapplicatiesencakephpdaarbinnenéénvandegrotereframeworksis.het tweedeframeworkdatwezullenbekijkenisrubyonrails,voorde programmeertaalrubyentevensergpopulair. Omdatwebapplicatiesgroter,bedrijfkritischencomplexerworden,ishetvan grootbelangdatdezecodevanhogekwaliteitenduseengoedtestbaaris.veelvan dezeframeworkshebbeninmeerofminderemateondersteuningingebouwdvoor hetontwerpenenuitvoerenvantests.devraagisofdezespecifieke testondersteuningzorgtvoorgoedetestsvansoftwarediegeschrevenisindeze frameworks.deconcretevraagstellingdiewekunnenformulerenis: 6
Welkeondersteuningvoortestenbiedendeveelgebruikteframeworksvoor webapplicaties? Onderzoeksvraagendeelvragen Omdeonderzoeksvraagtekunnenbeantwoorden,isdevolgendekennisnodig: A. Watvoortypetestskunnenweonderscheidenbinnendeaangegeven criteria? B. Hoezijndegeselecteerdeframeworksopgebouwd? C. Welkevandesoortentestswordendoordegeselecteerdeframeworks ondersteund? OnderzoeknaarhetantwoordopdeelvraagAzalgedaanwordendoormiddelvan literatuuronderzoek. HetantwoordopdeelvraagBzalgeschiedendoormiddelvanliteratuuronderzoek. HetantwoordopdeelvraagCzalwordendeelsgezochtmoetenwordenin documentatieendeelsdoorhetmakenvanvoorbeeldendielatenzienhoedeeisen enrandvoorwaarden,zoalsgevondenbijdeelvraaga,geïmplementeerdkunnen worden. Hetcombinerenvandeantwoordenopdedeelvragenverschaftonsvervolgens eeninzichtindematevantestondersteuningvandezeframeworks. 7
H3. Typesoftwaretests Inleiding Dithoofdstukbeschrijfteeninventarisatievanmogelijkesoortentestsdiede frameworkszoudenkunnenondersteunen,binnendekadersdiegesteldzijnin hoofdstuk2.vanelketypetestzaleenkorteomschrijvingwordengegeven. Dezeinventarisatieistotstandgekomendoormiddelvaneenliteratuuronderzoek enhetnagaanvanbestpracticesophetgebiedvansoftwareontwikkelingmet behulpvanwebframeworks.delijstmetsoortentestsdiedithoofdstukoplevert, zalwordengebruiktvoorhetvergelijkenvandetestondersteuningvande geselecteerdeframeworks. Inventarisatie Handmatigtesten Hetsysteemondersteunthethandmatiguitvoerenvantests,bijvoorbeeldviade commandline. Captureandplayback Hettestsysteemonthouddehandmatiguitgevoerdetestsenkandieopeenlater herhalen. Codecoverageanalyse Alhoewelditgeenblackboxtestis,isdecodecoverageanalyseeenveelgebruikte testentevenseenindicatieofdeopgesteldetestsuitedecodedekt. Doctests Testcasesdieindedocumentatiewordengeschrevenvaneenmethodeoffunctie. Dezekunnendangeautomatiseerdallemaaluitgevoerdworden.Hiermeekandus uitsluitenddewerkingvandefunctieopzichwordengetest,nietdeinteractiemet anderemethodesbinnendeunit. Geautomatiseerdeunittests Unittestswordengebaseerdopvantevorenvastgesteldeinput,eventueel ondersteuntdoorzogenaamdefixtures.daarnakunnenzegeautomatiseerd, uitgevoerdworden.unittestswordenuitgevoerdophetniveauvanhetmodel. Verderishetinteressantwelkeoptiesergebodenwordenomdezeunittestsinte richten: Fixtures;herbruikaredefinitiesvandetestdata,waardoordezedoor meerderetestgebruiktkanworden. Mockobjects;hetsimulerenvanobjectenwaarhettetestenobjectvan afhankelijkis. 8
Geautomatiseerdefunctioneletests Ookfunctioneletestsmakenmeestalgebruikvanfixtures.Integenstellingtotde unittest,wordthierechternietslechtséénmodelgetest,maareencompleet requestuitgevoerdomtezienofdathetverwachteresultaatoplevert. Binnendefunctioneletests,zullenwekijkennaardevolgendeopties: Databasewijzigingen;ishetmogelijkomnahetuitvoerenvaneen functioneletestteanalyserenoferwijzigingenindedatabasezijn aangebracht? HTTPHeaders;ishetmogelijkdeHTPPheadersteanalyseren? Viewvariabelen/objecten;omdatwehethierhebbenovertestsop controller niveau,ishetmogelijkomtezienwelkedataeraandeview doorgegevenwordt? Authenticatie;kandetestzichauthenticerenalseenbepaaldegebruiker tijdenshetuitvoerenvandetest? Webtests Omdatweinditonderzoekspecifiekkijkennaarframeworksvoorwebapplicaties, ishetookinteressantomtezienoferspecifiekeondersteuningwordtgeboden voorditplatform.wezullendevolgendeoptiesonderscheiden: GETrequests;hetsimulerenvanHTTPGETrequests. POSTrequests;hetsimulerenvanHTTPPOSTrequests,onderandere bruikbaarvoorhettestenvanformulieren. Bestandsuploads:simulerenvanbestandsuploads. HTTPHeaders;ishetmogelijkdeHTPPheadersteanalyseren? HTTPredirects:kunnenHTTP redirectsgevolgdworden? Viewvariabelen/objecten;ishetmogelijkomtezienwelkedataervande controlleraandeviewisdoorgegeven? Outputtest:controlerenofdeHTMLoutputis,zoalsverwachtwerd, eventueelgecombineerdmeteenparseromtezienofdeoutputgeldige (X)HTMLoplevert. Cookieondersteuning:hetcorrectafhandelenvandecookieszoalsdiedoor deapplicatiegebruiktworden. Interface/inbrowsertests Geautomatiseerdtestenvandeinterfacemiddelsdebrowser,volgenshetcapture andplaybackprincipe,zodatdetestsherhaaldkunnenworden.daarbijkunnenwe kijkenofdezetestsbrowseronafhankelijkzijn,ietswatmetnamebijdeinterface vaneenwebapplicatienogaleenstruikelpuntkanzijn. Model basedtesting Hetvolledigkunnenspecificerenvanhetgedragvandewebapplicatie,zodathet testsysteemautomatischzijneigentestcaseskanafleidenomdeapplicatievolledig tetesten. 9
Conclusie Dithoofdstukheefteenlijstopgeleverdmetbasisoptiesdieeenframeworkkan ondersteunenophetgebiedvanhettestenvandecodeenbeantwoorddaarmee deelvraaga: Watvoortypetestskunnenweonderscheidenbinnendeaangegeven criteria? Dezeoptiesvoldoenallemaalaandeeisenzoalswedieeraangesteldhebbenin hoofdstuk2,namelijkdathetdynamisch,grey enblackboxtestenzijn.erzijnnog welmeeroptiestebedenkendieeenframeworkookkanondersteunenenhetis eensubjectiefoordeelofeenbepaaldeoptieeenstandaardoptiebehoorttezijn.ik denkechterdatdezelijstvrijcompleetis,enhetontbrekenvanbepaaldeoptiesin dezelijstzalookgeenfundamenteelverschilmakenvoorhetvervolgvanhet onderzoek.eventueelvervolgonderzoekkanmeeroptiesmeenemeninhet eindoordeel. 10
H4. Frameworksvoorwebapplicaties Inleiding Dithoofdstukbeschrijftdeselectievanframeworksdiewezullengebruikeninde restvanditonderzoek.vandegeselecteerderaamwerkenzaleenkorte beschrijvingwordengegeven,waarbijergekekenwordtnaardealgemene werkingvanhetframeworkaangevuldmeteenkortoverzichtvandefeaturesdie hetframeworkbiedt.hiermeewordtzaldeelvraagbbeantwoordworden: Hoezijndegeselecteerdeframeworksopgebouwd? CakePHP CakePHPiseenobject georiënteerd,opensourcerapid developmentframework(cake, 2001)geschreveninenvoor degeïnterpreteerde,imperatieveprogrammeertaalphp (PHPGroup).CakePHPisgestoeldophetdesignpattern Model View Controller(kortwegMVC,datgeïntroduceerd werddoorsmalltalk)endwingtdeontwikkelaarsomhun applicatieoptedelenindriedelen.dezedriedelenhebben elkhuneigenverantwoordelijkheden: Hetmodel;representeertdedatawaaropdeapplicatiewerkt.Tussendemodels kunnenverschillendetyperelatiesbestaan.typischwordtdezedatauiteindelijk opgeslagenineendatabase.hetmodelbevatdebusinesslogicavandeapplicatieen opslagenbewerkenvandedataverlooptviademodels. Deview;verzorgtdepresentatievandedata.Voorwebapplicatieszijndatmeestal webpagina s,maaraanandererepresentaties,zoalsxmlofeenpdf document, valtooktedenken.deviewdoetgeenbewerkingenopdedata. Decontroller,verwerktdebinnenkomendeverzoeken(events).Dezezijnmeestal afkomstigvanhandelingenvandegebruikers,maarzoudenevenzogoedop anderemanieren(bijvoorbeeldviaeensoapinterface)binnenkunnenkomen.de controllervoertookapplicatie logicauit,zoalsbijvoorbeelddeautorisatie.een typischmvc requestzieteralsvolguit(cake, 2001): 11
Afbeelding2:MVCrequest 1. Vanafdeclientkomtereenverzoek 2. DeCakePHPdispatcherbekijkthetverzoekenstuurthetdoornaarde correctecontroller. 3. Decontrollervoertzijntakenuit,bijvoorbeeldauthentificatieenautorisatie vandegebruikerdiehetverzoekdoet.daarnastuurthijopdrachten (bijvoorbeeldverwijderenofaanpassendata)ofverzoekennaarde benodigdemodels. 4. Hetmodelgeeftdataterug 5. Decontrollerstuurtalledatanaardeview 6. Deviewgebruiktdezedataomdeoutputoptebouwenenstuurtdeinhoud terugnaardeclient. Features HieronderstaateenlijstmetfeaturesdiehetCakePHPframeworkbiedt,zoals beschrevenstaatopdewebsitevanhetproject(cake, 2001): 1. CompatibelmetPHP4enPHP5 2. GeïntegreerdeCRUD(create,read,updateendelete)voordatabase interactie 3. Applicatiescaffolding,hetautomatischverwerkenvanstandaardverzoeken, opbasisvandegedefinieerdedatabasetabellen.bedoeltalstijdelijke,snelle start. 4. Codegenereren,hetautomatischgenererenvandebasisvandeapplicatie, opbasisvandegedefinieerdedatabasetabellen. 5. Vriendelijke(mensenzoekmachine)URL'senaangepasteroutes 6. Ingebouwdevalidatie,validatievaningevoerdegegevens,opbasisvanhet model. 7. ViewHelpersvoorAJAX,JavaScript,HTML formulieren,zorgtervoordat nietallehtmlcodehandmatiguitgewerkthoeftteworden. 8. Componenten,gedeeldeuitbreidingenopdecontrollers,Standaard componentenalsemail,cookie,security,session,enrequest. 12
9. Behaviors,gedeeldeuitbreidingenopdemodels. 10. Flexibeltoegangsbeheer(ACL,accesscontrollists) 11. FlexibeleCaching,opniveauvanmodelsenviews. 12. Localisatie,hetframeworkbiedtondersteuningvoormultilingual applicaties. EenstandaardCakePHP requestisdoordemogelijkheidvanrouting(punt5), behaviors,componentenendemogelijkheidomanderedatabronnendanslechts dedatabasetegebruiken,ietsuitgebreiderdanhethierbovenbeschreven standaardmvc request.(cake, 2001) Afbeelding3TypischCakePHPrequestafhandeling RubyonRails RubyonRailsiseenMVCframework,geschreveninenvoorde programmeertaalruby.detaalrubyiseengeïnterpreteerde,puur object georiënteerdetaaldie,aldusdekenners,erglijktop Smalltalk.DetaalRubystamtuit1995(Matsumoto, 1995)enis, zoalsgezegdpuurobject georiënteerd. 5.times { print "We *love* Ruby -- it's outrageous!" } Codevoorbeeld:AllesiseenobjectinRuby,zelfsprimitievetypen 13
HetframeworkRubyonRails(RoR)stamtuit2003(RoR, 2003)engebruiktevenals CakePHPhetModel View Controllerpatroon.Descheidingindriedelenwerkt identiekalshierbovenbeschrevenbijcakephp.rorkomt,integenstellingtot CakePHP,meteeneigenwebserver,Webrick,maarkanookgebruiktwordenmet anderewebserversalsapache. EentypischRoRrequestzieteralsvolgtuit(RoR, 2003): Afbeelding4.RubyonRailsarchitectuur QuaarchitectuurlijktRoRdusergveelopCakePHPenhethandeltopvrijwel dezelfdemanierverzoekenaf. Features OokquafeatureslijkenRoRenCakePHPergopelkaar.Opzichisdatookniet verwonderlijk,alsjebedenktdatcakephpineersteinstantienaarvoorbeeldvan RoRisgebouwd.DevolgendestandaardfeaturesmakendeeluitvanRoR 1. Eigenwebserver,Webrick 2. GeïntegreerdeCRUD(create,read,updateendelete)voordatabase interactie 3. Applicatiescaffolding,hetautomatischverwerkenvanstandaardverzoeken, opbasisvandegedefinieerdedatabasetabellen.bedoeltalstijdelijke,snelle start. 14
4. Codegenereren,hetautomatischgenererenvandebasisvandeapplicatie, opbasisvandegedefinieerdedatabasetabellen. 5. Vriendelijke(mensenzoekmachine)URL'senaangepasteroutes 6. Ingebouwdevalidatie,validatievaningevoerdegegevens,opbasisvanhet model. 7. ViewHelpersvoorAJAX,JavaScript,HTML formulieren,zorgtervoordat nietallehtmlcodehandmatiguitgewerkthoeftteworden. 8. Partials;hergebruikvandelenvanandereviews 9. Standaardondersteuningvooremail,cookies,authorisatie 10. Flexibeltoegangsbeheer(ACL,accesscontrollists) 11. FlexibeleCaching,opniveauvanmodelsenviews. 12. Localisatie,hetframeworkbiedtondersteuningvoormultilingual applicaties. 13. Requestprofiler;nagaanwaarinhetafwerkenvaneenrequestdoorhet frameworkdebottleneckzit. Django Djangoiseenwebframeworkgeschrevenvooreninde programmeertaalpython(python, 1991).DetaalPython stamtuithetbeginvandejarennegentigenis ontworpendoordenederlanderguidevanrossum. HetprojectDjangoisontstaanin2005enisgebaseerd ophetmvcdesignpatternwathierbovenreedsis uitgelegd.daarbijhanteertdjangoweleenanderebenaming:watinmvcde controllerheet,heetindjangodeviewenwatinmvcdeviewisgenoemd,noemt Djangodetemplate.Hetideehierachteris,isdatdeviewdedatabeschijftdie getoondwordtaandegebruiker,maarniethoediedataerdanuitziet.detemplate bepaaltdanhoededataeruiteindelijkuitkomttezien.jezouhetframeworkdan alseenmtvframeworkaankunnenduiden. DemanierwaaropDjangoeenrequestverwerkt,zieterschematischalsvolgtuit: (Holovaty & Kaplan-Moss, 2007) 15
Afbeelding5RequestverwerkingvanDjango DitzieterietsandersuitdehetschemavanCakePHPenRoRenbehoeftwatuitleg. WaneerereenHTTP requestbinnenkomt,wordtditdoorhetframework verwerkttoteenhttprequestobject.viadeurlconfwordthiernadejuisteview aangesproken,dieditverzoekverderafdienttehandelen.wanneerereenfout optreedt,wordtditdoordeexceptionhandleropgepakt,enuiteindelijkgaatalles viaeentemplatelangsderedsponsemiddlewareterugnaardeclient. InfeitelijktditdusergophetMVCpatroonvandeanderetweeframeworks,maar iseenenanderwatandersbenoemd. Features HieronderstaateenlijstvandemeestopvallendefeaturesdieDjangobiedt: Uitgebreideondersteuningvoorformulierverwerkingenvalidatie Standaardbeheer interface,dieautomatischbeschikbaariszondercode daarvoortehoevenmaken Standaardauthenticatiesysteem Eigentemplatesysteem,gebaseerdopovererving 16
Templatesyssteenisvoorzienvantagsenfiltersomeenvoudighetuiterlijk vandeoutputtebepalen. Ondersteuningvoorcookies StandaardCRUDondersteuning Vriendelijke(mensenzoekmachine)URL'senaangepasteroutes Caching Ondersteuningvoormeertaligeapplicaties Securityondersteuning Conclusie Dithoofdstukbiedteenbeschrijvingvanalleframeworksdievergelekenzullen wordeninhetvervolgvanditonderzoek.daarbijzijnuiteraardnietalledetails besproken,datisnatuurlijknietmogelijk,maareriseengoedbeeldontstaanover hoedezeframeworksinelkaarsteken.daarmeeisdetweededeelvraag beantwoord. 17
H5. Vergelijkingoptestondersteuningvandeframeworks Inleiding Dithoofdstukbeschouwtdeondersteuningdiedeframeworks,zoalswedie geïntroduceerdhebbeninhoofdstuk4,biedenaandeverschillendesoortentests dieinhoofdstuk3staanbeschrevenenbeantwoordhiermeedederdedeelvraag zoalsdieisopgesteldinheteerstehoofdstuk.deresultatenzullenallereerstin tabelvormgepresenteerdworden,waarnadeopvallendeverschillen,of onderdelendiedatbehoeven,toegelichtzullenworden. Testondersteuning Onderstaandetabelgeefteenoverzichtvanwelkesoortentestsondersteunt wordenperframework.hierbijisinitieelalleengekekennaardeondersteuning diedeframeworks out of the box bieden,maarvanwegedemodulaireopzetvan sommigeframeworksiservoorgekozenomtevermeldenwanneereenbepaalde featuremiddelseenenkelepluginondersteuntwordt. Typetest CakePHP Django RubyonRails Handmatigtesten Captureandplayback Codecoverageanalyse ++ * * Doctests ++ * Unittests ++ ++ ++ Fixtures ++ ++ ++ Objectmocking ++ * ++ Functioneletests ++ ++ Databasewijzigingen ++ ++ HTTPredirects + ++ Viewvariabelen/objecten ++ ++ Authenticatie Webtests GETrequests ++ ++ ++ POSTrequests ++ ++ ++ Fileuploads ++ ++ HTTPHeaders ++ ++ ++ HTTPredirects + ++ Viewvariabelen/objecten ++ ++ 18
Cookies ++ ++ Outputtests ++ + ++ Interface/inbrowsertests ** * * Model basedtesting +:biedtenigeondersteuning,++:biedtruimeondersteuning,*:biedtondersteuningmiddelsplugin Toelichtingopderesultaattabel Dezeparagraafbespreektdeopvallendeverschillenenonderdelendietoelichting behoevenuitderesultaattabeldiehierbovenbeschrevenstaat.daarbijdient allereerstopgemerkttewordendatdemaniervantestenvancakephpenrubyon Railsgoedmetelkaarvergelijkbaarzijn,omdatzedezelfdeindelingentypetests kennen,watookteverklarenisaangeziendeopbouwvandebeideframeworks sterkegelijkenisvertoond.djangoechterkenttweesoortentests:standaard unittests,dieeigenlijkdirectuitpythonkomen,entestsdiegebruikmakenvan Django sclientklasse.dielaatstebevatinfeitedemogelijkhedendiebijcakephp enrorverdeeldzijnoverdefunctioneletestsendewebtests. Handmatigtestenencaptureandplaybacktest Geenvanalleframeworksbiedtondersteuningvanhethandmatig,bijvoorbeeldvia decommandlineinterface,uitvoerenvanbepaaldetests.daarmeeisde ondersteuningvancaptureandplaybackvandezetestsnatuurlijkookonmogelijk. Alleframeworksgaanuitvanhetuitvoerenvantestsineenscript. Doctests AlleenDjangobiedtstandaardondersteuningvoordezogenaamdedoctests.RoR kanwelwordenuitgerustwordenomditteondersteunen,doorhetgebruikenvan eenplugin.omeenbeeldtevormen,eendoctestindjangozieteralsvolgtuit: def get_elem(a_list, index): """ >>> a = ['John', 'Sjaak', 'Piet'] >>> my_func(a, 0) 'John' >>> my_func(a, 1) 'Sjaak' """ return a_list[index] Codevoorbeeld1:doctestinDjango Unittests Alleonderzochteframeworksbiedeneenruimeondersteuningvoorhetuitvoeren vanunittests.daarbijbiedenookalledriedeframeworksdemogelijkheidtothet gebruikvanfixtures,ietswatbijzonderhandig,bijnanoodzakelijk,isvoorhet efficiëntopstellenvandetests.hetisdaarbijwelinteressantomvoorelk 19
frameworkeensimpeleunittesttelatenzien,zodatdeverschillenen overeenkomstenzichtbaarworden.wegaandaarbijuitvaneensimpelmodel genaamdcar,waarbijeenautoeenbepaaldekleurkanheeft. class CarTest extends Car { var $name = 'CarTest'; var $usedbconfig = 'test_suite'; } class CarTestCase extends CakeTestCase { var $fixtures = array( 'car_test' ); function testcolor() { $this->cartest =& new CarTest(); } } $result = $this->cartest->color("ferrari"); $this->assertequal($result, 'red'); Codevoorbeeld2:unittestinCakePHP import unittest from myapp.models import Car class CarTestCase(unittest.TestCase): def setup(self): self.ferrari = Car.objects.create(name="Ferrari", color="red") def testcolor(self): self.assertequals(self.ferrari.color(), 'red') require 'test_helper' Codevoorbeeld3:unittestinDjango class CarTest < ActiveSupport::TestCase fixtures :cars def test_color color = Car.color('Ferrari') assert_equal color, 'red' end end Codevoorbeeld4:unittestinRubyonRails 20
Zoalstezienis,losvandeverschillendetaalconstructies,zijnditsoortsimpele testsinalleframeworksopvergelijkbaremanieroptezetten.detestvandjango gebruikt,terdemonstratie,geenfixtureszoalsdeanderetweewel,maarheeftook diemogelijkheidendatgeldtandersomook. Objectmocking Eenanderopvallendpuntinonzevergelijkingisobjectmocking.Ditwordt gebruiktomafhankelijkhedenbijhettestentereducerenendaarvoorbieden zowelroralscakephpondersteuning.bijobjectmockingwordtereennieuwe klassegemaaktvaneenbepaaldereferentieklasse,waarbijallebestaande methodesnogbestaan,maardezezijnallemaalleeg.beideframeworkshebbenook nogeensdemogelijkheidtotzogenaamdpartialmocking,zodathetmogelijkisom sommigemethodeswelinoorspronkelijkestaattehouden.djangoondersteunt objectmockingnietstandaard,maarkanmiddelseenpluginhierweltoeuitgerust worden. Functioneletests Zoalsaleerderopgemerkt,scharenCakePHPenRoRhettestenvandecontrollers onderdefunctioneletests.detestdiedaarbijuitgevoerdwordt,betreftdusnieteen simulatievaneenhttprequest.djangokentdezemaniervantestenniet,views (watdecontrollerswordengenoemdindeanderetweeframeworks)entemplates wordengetestmiddelssimulatievanhttprequests. Fileuploads Eenbelangrijkonderdeelbijhettestenvanwebformulieren,ishetkunnentesten vanformulierenwaarbijhetuploadenvaneenbestandeneenrolspeelt.ditiseen situatiediebijwebapplicatiesnatuurlijknietongewoonisendaaromookgetest zoumoetenkunnenworden.cakephpbiedthieralsenigeframeworkgeen ondersteuningvoor,hoewelhetwelinderoadmapvoortoekomstigereleases staatopgenomen. HTTPRedirects EencontrollertestdiedetecteertwelkeHTTP headersdecontrollerterugstuurt,is inrubyonrailswelmogelijk,maarnietincakephp.wileendergelijketestgedaan wordenincakephp,danishetwelmogelijkomdaareenworkaroundvoorte maken.omdittedemonstrerenstaathierondereersteenvoorbeeldvaneen dergelijketestinrorenvervolgensincakephp. def test_should_create_post assert_difference('post.count') do post :create, :post => { :title => 'Hello', :body => 'This is my first post.'} end assert_redirected_to(:controller => "posts", :action => "index") assert_equal 'Post was successfully created.', 21
end flash[:notice] Codevoorbeeld5:FunctioneletestinRubyonRails class TestPostsController extends PostsController { var $name = 'Posts'; function redirect($url, $status = null, $exit = true) { $this->redirecturl = $url; } } function _stop($status = 0) { $this->stopped = $status; } class PostsControllerTestCase extends CakeTestCase { function construct() { $this->posts = new TestPostsController(); } function testcreate() { $beforecount = $this->posts->post->find('count'); $this->posts->data = array( 'Post' => array( 'title' => 'Hello', 'body' => 'This is a test post!', ) ); $this->posts->add(); $aftercount = $this->posts->post->find('count'); $this->assertequal($beforecount+1,$aftercount); $this->assertequal($this->posts->session-> read('message.flash.message'), 'Post was successfully created.'); } $this->assertequal($this->posts->redirecturl, array('action' => 'index')); } Codevoorbeeld6:FunctioneletestinCakePHP Zoalsuitditvoorbeeldblijkt,isdetestinRubyonRailseenstuksimpelerdandiein CakePHP.DitverschilkomtvoornamelijkomdatinCakePHPbepaaldemethodes vandecontrolleroverschrevenmoetenwordenomzegoedtekunnentesten.in 22
RoRisdatnietnodigenzitdieondersteuningzonderextramoeitedirect ingebakken. Djangobiedtookdergelijkeondersteuning.Zoalsalopgemerkt,zitdeze functionaliteitbijditframeworkopeenwatandereplaats,maartochiseen vergelijkbaretestmogelijk: from django.test import * import doctest class ViewTests(TestCase): def runtest(self): c = Client() response = c.post('/posts/add',{'title': 'Test title', 'message': 'This is the actual post'}) self.assertredirects(response, '/posts/') self.assertequal(self.response.context['flash'] ['message'], 'Post was successfully created.') Codevoorbeeld7:webtestinDjango Outputtests Totslotkijkenwenognaardeondersteuningdiedeframeworksbiedenophet gebiedvanoutput analyse,ietswatbijwebframeworkseenbelangrijkissueis. HierkunnenweconcluderendatCakePHPenRubyonRailshiereenuitgebreide ondersteuningvoorbeiden.omdeverschillenenovereenkomstente demonstrerenzettenwenogmaalseenvergelijkbaretestopvooralleframeworks. class mytestwebtestcase extends CakeWebTestCase { function testhomepage() { $result = $this->get('/pages/home'); $this->assertresponse(200); $this->asserttext('lorem ipsum dolor sit amet.'); $this->asserttitle('foobar :: Home'); }} $this->assertelementsbyselector( ul#navigation > li', array('menu item 1', Menu item 2 ) ); Codevoorbeeld8:outputtestinCakePHP def test_should_show_post get "/pages/home" assert_response :success 23
# Assert_select zeer krachtig assert_select 'title', 'Foobar :: Home' assert_select 'ul.navigation' do... end end Codevoorbeeld9:outputtestinRubyonRails def test_home(self): response = self.client.get('/pages/home') self.assertequal(response.status_code, 200) # Zijn er 5 newsitems aan de template gestuurd? self. assertequal(len(response.context['newsitems']), 5) self.assertequal(response.template[0].name, 'home.html') Codevoorbeeld10:outputtestinDjango Eenaantalverschillenisdemoeitewaardomeventebelichten.Zoalstezienvalt, biedenrorencakephpdemogelijkheidomdeoutput,watmeestalhtmlis, vergaandteanalyseren.djangokanwelzienoferbijvoorbeeldeenbepaaldestring indeoutputzit,maarkandehtml structuurnietanalyseren. Djangoheeftweldemogelijkheidomtezienwelkevariabelendeviewheeft doorgegevenaandetemplate.ookrubyonrailsheeftdieoptie,maarmetcakephp valtdatalleentetestenmeteenfunctioneletest. In browsertests Alleframeworkshebbeneensterretjebijin browsertests,omdatertoolszijndie ditonafhankelijkvanhetframeworkkunnedoen.eenvoorbeeldvaneen dergelijketoolisselenium(seleniumhq).helaasisdienietbrowseronafhankelijk, ietswatbijwebpagina sweleenbelangrijkpuntis.cakephpheefteeningebouwde koppelingvoorseleniumenisdaarmeeietsbeteruitgerustdandeanderetwee frameworks. Modelbasedtests Helaaszijnmodelbasedtestnogeenstukjetehooggegrepenvooralleframeworks. Zoverikdatmetzekerheidkanzeggeniserooknoggeenenkelwebframeworkdie datsoortondersteuningwelbiedt. Conclusie Hetislastigomtoteengoedevergelijkingtekomentussendeframeworks.Dit wordtteneerstebemoeilijktdoordezeerverschillendewijzewaaropde frameworkshuntestshebbeningedeeld.kunjesomseenbepaaldetestniet linksomrealiseren,dankanhetvaakwelrechtsom. 24