test first!
TRANSCRIPT
![Page 1: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/1.jpg)
![Page 2: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/2.jpg)
![Page 3: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/3.jpg)
![Page 4: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/4.jpg)
TestDrivenDevelopment
![Page 5: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/5.jpg)
WhatisTDD• It'sadevelopmenttechniquebasedonashortdevelopment
process• It'sawaytodeeplyanalyzetheexpectedbehaviorofasoftware• It'sameantoimprovethequalityofthesourcecode• It'sapracticetoenhancethedocumentationofasoftware• It'sawaytoensureasaferwaytomodifythesoftwarebehavior
![Page 6: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/6.jpg)
TDDandUnitTests
Unittestscanbewrittenbeforewritingthecode,afterthecodehasbeenwrittenorduringthedevelopment
• UnitTestingreferstowhatyouaretesting,TDDtowhenyouaretesting
• UnitTestingmeans,well,testingindividualunitsofbehavior
![Page 7: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/7.jpg)
TheDintheMiddle• Youlettheteststodriveyou• Theteststellyouwhattodo,whattodonext,what'sdone• ThetestsaretheskeletonoftheAPIdesign
TDDWorkflow
![Page 8: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/8.jpg)
TDDWorkflowTDDiswritingatestwhichwillfail,thenwritingtheminimum
amountofcoderequiredtomakeitrun,thenrefactoringthecodetomakeitclean
![Page 9: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/9.jpg)
TheDattheEnd• It'ssupposedtomeandevelopmentbutoriginallywassupposed
tomeandesign• TestDrivenDesignisthedisciplineofusingUnitTesting(or
othertests)todesignthesoftware• Workingonabetterdesignit'spossibletoimprovethequalityof
thesoftware
![Page 10: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/10.jpg)
SmallandTestable• Methodsandfunctionsshouldbesimpleinordertobetestable• Generallyspeaking,thecodeneededtosatisfyatestisusuallyaverysmallchunkofcode• AsaresultthepublicAPIaresimpleandeasytomaintain
![Page 11: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/11.jpg)
TestDoubleThegeneralnameforobjectsusedtoreplacerealcomponentservers
fortestingpurposes
• Dummy,anobjectwithoutanyspecificimplementation• Stub,anobjectwithinterfaceorminimalimplementation
• Spy,astepupfromstubbecauseitrecordswhichobjectuseditself
• Fake,anobjectwithamorecompleximplementation• Mock,anobjectdynamicallycreatedbyalibrary(e.g.
http://sinonjs.org)
![Page 12: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/12.jpg)
CommonSentences• “Itcoststoomuchtime,we’dbetterfixthesebugsfirst”
• “Oursystemistoobigforunittests”• “Wejustoughttobemorecarefulnottointroducebugs,that
willhelpusalot”• “Oursystemisnotsuitedforunittests”
• “WehaveaQA-teamthatwilldetecterrors”
![Page 13: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/13.jpg)
TDDandQA• Testdrivendevelopmentisnotaqualityassurancemethod• Mostpeopleassociate"testing"with"qualityassurance"
• WithTDDyouwritecodeusingtestsasatool,theQAteamsearchesbugsusingthesametestsasatool
![Page 14: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/14.jpg)
BestPractices
![Page 15: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/15.jpg)
Assertions• Assertionsarestatementsthatperformanactualcheckonthesoftware’soutput• Asinglefunctioncalledassertisenoughtoexpressanycheck• TDDlibrarieshavemanyassertfunctionsforspecificneeds(assertFalse,assertEqual,s,etc.)• Asingleassertshouldbeusedineachtest• Anassertfailureshouldaddaclearmessagetothetestlogs
![Page 16: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/16.jpg)
IntegrationTesting• Amid-leveltestingactivitythatverifiesacertainsetofmodulesworkcorrectlytogether• Integrationtestsarelikeunittestswithoutusingtestdoublesforsomedependencies
![Page 17: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/17.jpg)
Source&TestsSeparation
![Page 18: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/18.jpg)
PicktheFirstTest• Carefullyreadtherequirementsandeventuallysplitthemifneeded• Choosearequirementandwritealistoftestsforthisrequirement• Selectatestthatisatomicandwellisolated• Trytoprioritizethem(e.g.testfirstusercreationthanlogin!)
![Page 19: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/19.jpg)
WritetheAssertionFirst
Determinehowthespecification(i.e.thetest)isgoingtobevalidated
![Page 20: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/20.jpg)
FirstTimeFailure• Howtotestsomethingthatdoesn'texist?• Byaddingmethodsorfunctionstotestdevelopersstarttodesignfirstthecode
![Page 21: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/21.jpg)
UnitTesting(UnitTestingreferstowhatyouaretesting,TDDtowhenyouare
testing)
Glossary
![Page 22: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/22.jpg)
Glossary• Unit,thesmallestpieceofcodesoftwarethatcanbetestedin
isolation• Assertion,it'sapredicatethatstatestheprogrammer’s
intendedstateofasystem• Integrationtest,atestthatgooutsidethecurrentprocess
interactingwithsomethingelse• Interactiontest,atestonthewaythatobjectsworktogether• Fake,anystand-inobjectthat'susedinsteadoftherealthing• Stub,astand-inobjectthatprovidesadependencyrequiredby
thecodeundertest• Mock,asimulatedobjectthatmimicsaspecificbehavior
![Page 23: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/23.jpg)
IndividualUnits• Sourcecodeistestedtounderstandifitcanbeusedbyother
partofthesoftware• Testcasesareseparatedandindependentbyeachother
• Methodstubs,mockobjectsandfakesdatacanbeusedtorunthetestsinisolation
![Page 24: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/24.jpg)
Benefits• Helpsfindingproblemsearly
• Facilitateschanges(i.e.regressionstesting)• Simplifiesintegration
• Improvesthedocumentation
![Page 25: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/25.jpg)
Limitations• Unittestingwillnotcatcheveryerrorintheprogram
• Integrationerrorswillbenotcatchbecausethetestitselfbydefinitiontestonlytheunit
• Codecoveragedoesn'tprovethesoftwareisworking• It'stimeconsuming
![Page 26: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/26.jpg)
CommonChallenges• Settinguprealisticandusefultests
• Testingasynchronouscode• Testingprivatemethods• Writingflexibletests
• Effectivenames
![Page 27: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/27.jpg)
Usefulness• Definerelevantinitialconditions
• Testshavetoexercisingthecodeinarealisticcontext• Avoidunnecessarypreconditions
• Don’tunit-testconfigurationsettings
![Page 28: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/28.jpg)
Flexibility• Testsshouldneveroverspecifythebehaviorofthetargetcode• Testsshouldnevertestmorethanoncethesamecode(i.e.
don'trepeatyourself!)• Alwaysuseonlydatarelevanttoaparticulartestinthetest• Consideralwayshowtopassinputdata(e.g.Builderpattern)
![Page 29: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/29.jpg)
AsyncCode• Themainissueistokeepthetestblockeduntiltheasynccode
hasbeenexecuted• Youcanrepeatedlypollingthetargetsystemforastatechange
(i.e.Sampling)• Youcanuseanevent-basedassertionthatwaitsforaneventby
blockingonamonitoruntilitgetsnotifiedortimesout(i.e.Listening)
![Page 30: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/30.jpg)
PrivateMethods
Eventshandler,alsoifprivate,areyourpublicAPI
• Putthetestsintheclassyouwanttotest• Putthetestsinanotherclass/sourcefile&exposetheprivate
methodsyouwanttotestaspublicmethods
![Page 31: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/31.jpg)
Naming• Thenameshouldclearlyindicatethetestedfeature
• Thetestnameshouldindicateswhattheunitdoesnotwhattheunitis
• Thetestnameshouldsaysomethingaboutthemotivationforthescenario
• UsetheTestDoxconventionwhereeachtestnamereadslikeasentence
![Page 32: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/32.jpg)
AcceptanceTestDriven
Development
![Page 33: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/33.jpg)
KeyFeatures• ATDDisapracticeinwhichthewholeteamcollaboratively
discussesrequirementsacceptability• ATDD,likeTDD,involvescreatingtestsbeforecode
• Theacceptanceteststhenbecomelikeexecutablerequirements
![Page 34: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/34.jpg)
ExpectedBenefits• ATDDresultsinapplicationsdesignedtobeeasiertotest
• ATDDfavorsthecreationofinterfacesspecifictofunctionaltesting
• ATDDclarifytoalltheteammemberswhicharethecustomerexpectations
![Page 35: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/35.jpg)
ATDDandUnitTesting
• ATDDdoesn'timplytoremoveunittestingfromthedevelopmentcycle
• ATDDimpliestheusageoftoolstoautomatethefunctionaltestingexecution(e.g.FitNess,Cucumber,Rspec)
![Page 36: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/36.jpg)
TestingPyramid
Software
![Page 37: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/37.jpg)
SoftwareRequirements
Asa<role>Iwantto<goal>sothat<motivation>
• Userstoriesarethecentralaxisaroundwhichasoftwareprojectrotates
• UserstoriesexpressrequirementsintermsofTheRole,TheGoal,andTheMotivation
• Userstoriesaren’texhaustiverequirementsspecifications
![Page 38: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/38.jpg)
AcceptanceCriteria• Asetofconditionstherequirementmustfitintobeconsidered
done• It'stheresultofaconversationwiththecustomer(orproduct
owner)• It'sawaytodescribethetestsarequirementshouldpass
![Page 39: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/39.jpg)
WritingAcceptanceCriteria
• AnacceptancecriteriashouldcontainanActor,aVerbandanObservableResult
• Anacceptancecriteriadescribeapre-condtionwhenanactorshouldperformanactionandobtaintheexpectedresult(e.g.
mandatoryfields)• Anacceptancecriteriashouldbealsoidentifyperformances
expectations
![Page 40: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/40.jpg)
AcceptanceTests
Concreteexamples,concretebehavior,noambiguity
• Aformaldescriptionofthebehaviorofasoftwareproductexpressedasanexample
• Arethecombinationofacceptancecriteriaandrealexamples(i.e.dataandscenarios)
ATDDCycle
![Page 41: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/41.jpg)
ATDDCycle
![Page 42: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/42.jpg)
BehaviorDrivenDevelopment
![Page 43: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/43.jpg)
KeyFeatures• Helptowriteteststhatreflectthebehaviordesiredbythe
stakeholders• UsesaUbiquitousLanguagethatcanbeunderstoodbyboththe
developerandthecustomer
![Page 44: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/44.jpg)
TestDifferent• Unittestingforcedeveloperstothinkintermsoftestsandassertionswhilebehaviordrivendevelopmentbringthemto
considertestsaspartofspecification• Whenyourealizethatit'sallaboutspecifyingbehaviorandnot
writingtests,yourpointofviewshifts
![Page 45: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/45.jpg)
It’sStillTDD?NothinginBehavior-DrivenDevelopmentchangesTestDriven
Development’smechanics(i.e.writethetest->passit->refactor)
![Page 46: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/46.jpg)
BDDandCodeDesign
• Unittestingisoftenspecificallyaboutthedesignofcodeunitsandmodulessuchasclasses
• BDDisalsoconcernedwithunitdesign,butaddressesabroaderrangeofdesignconcerns
![Page 47: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/47.jpg)
BDDandAcceptanceCriteria
• Acceptancecriteriaaretransformedintolower-levelspecificationswrittenincode,andexecutedusingatestingor
specificationframework
![Page 48: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/48.jpg)
SignofUse• Significantportionof"functionaldocumentation"isintheformofUserStoriesaugmentedwithexecutablescenariosorexamples• Insteadofreferringto"tests",teammemberswillpreferthe
terms"scenario"and"specification"• Testsareameantodefinethespecificationsofthebehaviorof
aModule
![Page 49: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/49.jpg)
CommonIssues• BDDrequiresfamiliaritywithagreaterrangeofconceptsthan
UnitTestingdoes• BDDdon'trequiresatthebeginningparticulartoolsor
programminglanguages,andisprimarilyaconceptualapproach• BDDrequiresadifferentdevelopmentcycle
![Page 50: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/50.jpg)
BDDCycle
![Page 51: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/51.jpg)
ContextandSpecifications
• Setsofrelatedobservations(tests)willbegatheredintocontexts
• Contextsaren’tsimplyarbitrarygroupings,theyrepresentcohesiveandconsistentcircumstancesthatsoftwaremodulescan
befoundin• SpecificationsarethetestswrittenusingaBDDtesting
framework
![Page 52: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/52.jpg)
EffectiveScenarios• Captureasummaryscenario• Identifyactorsandtheirgoals
• Sentencesshouldbeinsequentialorder• Eachsentenceshouldhaveanactorperforminganaction
![Page 53: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/53.jpg)
UnitTesting,ATDDandBDD
BDDisanevolutionoftest-drivendevelopmentthatenhanceandenforcethepracticesderivingfromunittestingandacceptance
testing
TDD===BDD
![Page 54: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/54.jpg)
TestsAnatomy
![Page 55: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/55.jpg)
UnitTeststest("prettydatebasics",function(){varnow="2008/01/2822:25:00";equal(prettyDate(now,"2008/01/2822:24:30"),"justnow");equal(prettyDate(now,"2008/01/2822:23:30"),"1minuteago");equal(prettyDate(now,"2008/01/2821:23:30"),"1hourago");equal(prettyDate(now,"2008/01/2722:23:30"),"Yesterday");equal(prettyDate(now,"2008/01/2622:23:30"),"2daysago");equal(prettyDate(now,"2007/01/2622:23:30"),undefined);});
![Page 56: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/56.jpg)
ATDDTests
![Page 57: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/57.jpg)
BDDTestsfunctionaddValues(a,b){returna+b;}
describe("addValues(a,b)function",function(){it("shouldequal3",function(){expect(addValues(1,2)).toBe(3);});it("shouldequal3.75",function(){expect(addValues(1.75,2)).toBe(3.75);});it("shouldNOTequal'3'asaString",function(){
![Page 58: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/58.jpg)
Jasmine(JavaScripttestingsuite)
![Page 59: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/59.jpg)
JasmineProvides• AnaturalBDDsyntaxfororganizingthetestlogic
• Asynchronoustestingsupport• Mocksobject
• Spies• Custommatchers
![Page 60: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/60.jpg)
SampleTestdescribe("Helloworld",function(){it("sayshello",function(){expect(helloWorld()).toEqual("Helloworld!");});});
![Page 61: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/61.jpg)
Suite• describe("Helloworld"...)iswhatiscalledasuite• Thenameofthesuite(“Helloworld”inthiscase)definesacomponentofyourapplication
![Page 62: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/62.jpg)
Spec• Insideofthatsuite(technically,insideofananonymous
function),istheit()block• Thisiscalledaspecification,oraspecforshort
![Page 63: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/63.jpg)
Matcher• Inthiscase,you’retestingifhelloWorld()doesindeedreturn
"Helloworld!"• Thischeckiscalledamatcher...Jasminesupportsseveralmatchers!
![Page 64: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/64.jpg)
Specs.htmlItcontainsfourscripttags:
• ThefirstsectionincludestheJasminetestrunnerfiles• Inthenexttwosections,youreferenceyourJavaScriptcodeto
betestedaswellasthetests• Thefourthrunsthetests
![Page 65: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/65.jpg)
AsyncCallsit("doesanasynchronouscall",function(){
exampleAsyncCall(function(response){expect(response).toContain("somethingexpected");done();});
});RunningTestswith
![Page 66: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/66.jpg)
RunningTestswithGrunt
• AJavaScripttaskrunner• Aprojectscaffoldingtool• Useittoautomatecommontaskexecutionexecution• Configurablepluginssuchasrequire.js,handlebar,jasmine,etc.
![Page 67: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/67.jpg)
• Configurablepluginssuchasrequire.js,handlebar,jasmine,etc.
UsingGrunt• Firstofallinstallgruntcommandlinetoolnpminstall-ggrunt-cli
• Mostgrunt-inittemplateswillautomaticallycreateapackage.jsonfile
• Installgruntanthepluginsnpminstallgrunt--save-dev• Installthejasminepluginnpminstallgrunt-contrib-jasmine--save-dev
![Page 68: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/68.jpg)
TheGrunt.jsFilemodule.exports=function(grunt){'usestrict';grunt.initConfig({jasmine:{src:'src/**/*.js',options:{specs:'spec/**/*.js',template:require('grunt-template-jasmine-istanbul'),templateOptions:{coverage:'reports/coverage.json',report:'reports/coverage'}
![Page 69: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/69.jpg)
Questions&Answers
Links
![Page 70: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/70.jpg)
Links• http://msdn.microsoft.com/en-us/magazine/cc163358.aspx
• http://guide.agilealliance.org/guide/atdd.html• http://guide.agilealliance.org/guide/acceptance.html
• http://www.codemag.com/article/0805061• http://www.slideshare.net/nashjain/acceptance-test-driven-
development-350264• http://testobsessed.com/wp-
content/uploads/2011/04/atddexample.pdf• http://programmers.stackexchange.com/questions/135218/what-
is-the-difference-between-bdd-and-tdd• http://www.slideshare.net/emwendelin/test-your-javascriptMyLatestBook
![Page 71: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/71.jpg)
• http://www.slideshare.net/emwendelin/test-your-javascriptMyLatestBook
![Page 72: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/72.jpg)
What'sNext
![Page 73: Test first!](https://reader034.vdocuments.site/reader034/viewer/2022042518/55cc4fcbbb61eb3a638b4575/html5/thumbnails/73.jpg)