Hvad er testdrevet udvikling (TDD)? Eksempel
โก Smart opsummering
Testdrevet udvikling (TDD) er en softwareudviklingsmetode, hvor testcases skrives fรธr koden, hvilket guider udviklere til kun at skrive nok kode til at bestรฅ hver fejlende test, hvilket producerer enklere, fejlfri, fuldt dรฆkket og vedligeholdelsesvenlig software.

Hvad er testdrevet udvikling (TDD)?
Testdrevet udvikling (TDD) er softwareudviklingstilgang, hvor testcases udvikles for at specificere og validere, hvad koden vil gรธre. Enkelt sagt, testcases for hver funktionalitet oprettes og testes fรธrst, og hvis testen mislykkes, skrives den nye kode for at bestรฅ testen og gรธre koden enkel og fejlfri.
Testdrevet udvikling starter med design og udviklingping test for hver eneste lille funktionalitet i en applikation. TDD-frameworket instruerer udviklere i kun at skrive ny kode, hvis en automatiseret test er mislykket. Dette undgรฅr dobbeltarbejde. Den fulde form af TDD er testdrevet udvikling.
Det simple koncept med TDD er at skrive og rette de mislykkede tests, fรธr du skriver ny kode (fรธr udvikling). Dette hjรฆlper med at undgรฅ duplikering af kode, da vi skriver en lille mรฆngde kode ad gangen for at bestรฅ tests. (Tester er intet andet end kravbetingelser, som vi skal teste for at opfylde dem).
Testdrevet udvikling er en udviklingsprocesping og kรธrer automatiseret test fรธr den faktiske udvikling af applikationen. Derfor kaldes TDD undertiden ogsรฅ for Test fรธrste udvikling.
Sรฅdan udfรธres TDD-testen
Fรธlgende trin definerer, hvordan man udfรธrer TDD-test,
- Tilfรธj en test.
- Kรธr alle test og se, om en ny test mislykkes.
- Skriv noget kode.
- Kรธr test og Refactor-kode.
- Gentage.

TDD cyklus definerer
- Skriv en test
- Fรฅ det til at kรธre.
- Skift koden for at gรธre den rigtig, dvs. Refactor.
- Gentag processen.
Nogle prรฆciseringer om TDD:
- TDD-tilgangen handler hverken om "Test" eller om "Design".
- TDD betyder ikke "skriv nogle af testene, og byg derefter et system, der bestรฅr testene.
- TDD betyder ikke "udfรธr en masse test."
TDD vs. Traditionel test
Nedenfor er hovedforskellen mellem testdrevet udvikling og traditionel test:
TDD tilgang er primรฆrt en specifikationsteknik. Det sikrer, at din kildekode er grundigt testet pรฅ bekrรฆftende niveau.
- Med traditionel test finder en vellykket test en eller flere defekter. Det er det samme som TDD. Nรฅr en test mislykkes, har du gjort fremskridt, fordi du ved, at du skal lรธse problemet.
- TDD sikrer, at dit system rent faktisk opfylder de krav, der er defineret for det. Det hjรฆlper med at opbygge din tillid til dit system.
- I TDD er der mere fokus pรฅ produktionskode, der verificerer, om test vil fungere korrekt. I traditionel test er der mere fokus pรฅ design af testcase. Om testen vil vise den korrekte/ukorrekte udfรธrelse af applikationen for at opfylde kravene.
- I TDD opnรฅr du 100% dรฆkningstest. Hver enkelt kodelinje testes i modsรฆtning til traditionel test.
- Kombinationen af โโbรฅde traditionel test og TDD fรธrer til vigtigheden af โโat teste systemet frem for perfektion af systemet.
- In Agile modellering (AM), bรธr du "teste med et formรฅl". Du bรธr vide, hvorfor du tester noget, og hvilket niveau det skal testes.
Hvad er accept TDD og udvikler TDD
Der er to niveauer af TDD
- Accept TDD (ATDD): Med ATDD skriver du en enkelt accepttest. Denne test opfylder kravene i specifikationen eller tilfredsstiller systemets opfรธrsel. Skriv derefter lige nok produktions-/funktionalitetskode til at opfylde denne accepttest. Accepttest fokuserer pรฅ systemets overordnede adfรฆrd. ATDD var ogsรฅ kendt som Behavioural Driven Development (BDD).
- Udvikler TDD: Med Developer TDD skriver du en enkelt udviklertest, dvs. enhedstest og derefter lige nok produktionskode til at opfylde denne test. Enhedstesten fokuserer pรฅ hver eneste lille funktionalitet i systemet. Udvikler TDD kaldes simpelthen som TDD.Hovedmรฅlet med ATDD og TDD er at specificere detaljerede, eksekverbare krav til din lรธsning pรฅ et just in time (JIT) grundlag. JIT betyder kun at tage de krav i betragtning, som er nรธdvendige i systemet. Sรฅ รธge effektiviteten.
Skalering af TDD via Agile Model Driven Development (AMDD)
TDD er meget god til detaljerede specifikationer og validering. Den formรฅr ikke at gennemtรฆnke stรธrre problemer sรฅsom overordnet design, brug af systemet eller brugergrรฆnseflade. AMDD lรธser problemer med Agile skalering, som TDD ikke gรธr.
Sรฅledes AMDD brugt til stรธrre problemer.
AMDDs livscyklus
I Model-driven Development (MDD) oprettes omfattende modeller fรธr kildekoden skrives. Som igen har en agil tilgang?
I ovenstรฅende figur reprรฆsenterer hver boks en udviklingsaktivitet.
Envisioning er en af โโTDD-processerne med forudsigelse/forestillingstest, som vil blive udfรธrt i lรธbet af den fรธrste uge af projektet. Hovedmรฅlet med envisioning er at identificere omfanget af systemet og systemets arkitektur. Krav og arkitekturmodellering pรฅ hรธjt niveau udfรธres for vellykket forestilling.
Det er processen, hvor der ikke udfรธres en detaljeret specifikation af software/system, men udforskning af kravene til software/system, der definerer projektets overordnede strategi.
Iteration 0: Envisioning
Der er to primรฆre underaktiveringer.
- Indledende krav forestillende.Det kan tage flere dage at identificere hรธje krav og omfang af systemet. Hovedfokus er at udforske brugsmodel, indledende domรฆnemodel og brugergrรฆnseflademodel (UI).
- Initial Architeknisk forestilling. Det tager ogsรฅ flere dage at identificere systemets arkitektur. Det giver mulighed for at sรฆtte tekniske retningslinjer for projektet. Hovedfokus er at udforske teknologidiagrammer, User Interface (UI) flow, domรฆnemodeller og Change cases.
Iterationsmodellering
Her skal teamet planlรฆgge det arbejde, der skal udfรธres for hver iteration.
- Agile proces bruges til hver iteration, dvs. under hver iteration vil nyt arbejdsemne blive tilfรธjet med prioritet.
- Det fรธrste hรธjere prioriterede arbejde vil blive taget i betragtning. Arbejdselementer, der tilfรธjes, kan til enhver tid omprioriteres eller fjernes fra stablen af โโelementer.
- Teamet diskuterer, hvordan de vil implementere hvert enkelt krav. Modellering bruges til dette formรฅl.
- Modelleringsanalyse og design udfรธres for hvert krav, som skal implementeres for den iteration.
Model stormende
Dette er ogsรฅ kendt som Just in time Modeling.
- Her involverer modelleringssession et team pรฅ 2/3 medlemmer, som diskuterer spรธrgsmรฅl pรฅ papir eller tavle.
- Et teammedlem vil bede et andet om at modellere med dem. Denne modelleringssession vil tage cirka 5 til 10 minutter. Hvor teammedlemmer samles for at dele whiteboard/papir.
- De udforsker problemer, indtil de ikke finder hovedรฅrsagen til problemet. Lige i tide, hvis et teammedlem identificerer det problem, han/hun รธnsker at lรธse, vil han/hun tage hurtig hjรฆlp fra andre teammedlemmer.
- Andre gruppemedlemmer udforsker derefter problemet, og sรฅ fortsรฆtter alle som fรธr. Det kaldes ogsรฅ som stand-up modellering eller kunde QA sessioner.
Testdrevet udvikling (TDD)
- Det fremmer bekrรฆftende test af din ansรธgningskode og detaljerede specifikationer.
- Bรฅde accepttest (detaljerede krav) og udviklertest (enhedstest) er input til TDD.
- TDD gรธr koden enklere og overskuelig. Det giver udvikleren mulighed for at vedligeholde mindre dokumentation.
Reviews
- Dette er valgfrit. Det inkluderer kodeinspektioner og modelgennemgange.
- Dette kan gรธres for hver iteration eller for hele projektet.
- Dette er en god mulighed for at give feedback til projektet.
Testdrevet udvikling (TDD) vs. Agile modeldrevet udvikling (AMDD)
| TDD | AMDD |
|---|---|
| TDD forkorter programmeringsfeedbackslรธjfen | AMDD forkorter modellering feedback loop. |
| TDD er detaljeret specifikation | AMDD arbejder for stรธrre problemer |
| TDD fremmer udviklingen af โโkode af hรธj kvalitet | AMDD fremmer kommunikation af hรธj kvalitet med interessenter og udviklere. |
| TDD taler til programmรธrer | AMDD taler med Business Analyst, interessenter og dataprofessionelle. |
| TDD ikke-visuelt orienteret | AMDD visuelt orienteret |
| TDD har begrรฆnset omfang til softwarearbejde | AMDD har et bredt anvendelsesomrรฅde, herunder interessenter. Det handler om at arbejde hen imod en fรฆlles forstรฅelse |
| Begge understรธtter evolutionรฆr udvikling | --------------- |
TDD Frameworks
Her er listen over de bedste testdrevne udviklingsrammer (TDD).
Lad os nu lรฆre Testdrevet udvikling ved eksempel.
Eksempel pรฅ TDD
Her i dette testdrevne udviklingseksempel vil vi definere en klasseadgangskode. For denne klasse vil vi forsรธge at opfylde fรธlgende betingelser.
En betingelse for accept af adgangskode:
- Adgangskoden skal vรฆre mellem 5 og 10 tegn.
Fรธrst i dette TDD-eksempel skriver vi koden, der opfylder alle ovenstรฅende krav.
Scenario 1: For at kรธre testen opretter vi klassen PasswordValidator ();
Vi kรธrer over klassen TestPassword ();
Outputtet er bestรฅet som vist nedenfor;
Produktion:
Scenario 2: Her kan vi se i metoden TestPasswordLength () at der ikke er behov for at oprette en forekomst af klassen PasswordValidator. Forekomst betyder at oprette en objekt klasse for at henvise medlemmerne (variabler/metoder) af den pรฅgรฆldende klasse.
Vi fjerner klassen PasswordValidator pv = new PasswordValidator () fra koden. Vi kan ringe til er gyldig () metode direkte ved Password Validator. IsValid ("Abc123"). (Se billedet nedenfor)
Sรฅ vi Refactor (รฆndre kode) som nedenfor:
Scenario 3: Efter refactoring viser outputtet mislykket status (se billedet nedenfor), det skyldes, at vi har fjernet instansen. Sรฅ der er ingen reference til ikke-statisk metode er gyldig ().
Sรฅ vi er nรธdt til at รฆndre denne metode ved at tilfรธje "statisk" ord fรธr Boolean som offentlig statisk boolean isValid (strengadgangskode). Refactoring Class PasswordValidator () for at fjerne ovenstรฅende fejl for at bestรฅ testen.
Output:
Efter at have foretaget รฆndringer i klassen PassValidator (), hvis vi kรธrer testen, vil outputtet blive bestรฅet som vist nedenfor.
Fordele ved TDD
Fรธlgende er de vigtigste fordele ved Test Driven Development in Software Engineering:
Tidlig fejlmeddelelse.
- Udviklere tester deres kode, men i databaseverdenen bestรฅr dette ofte af manuelle tests eller enkeltstรฅende scripts. Ved at bruge TDD opbygger du over tid en rรฆkke automatiserede tests, som du og enhver anden udvikler kan kรธre igen efter eget รธnske.
Bedre designet, renere og mere udvidelsesbar kode.
- Det hjรฆlper med at forstรฅ, hvordan koden vil blive brugt, og hvordan den interagerer med andre moduler.
- Det resulterer i bedre designbeslutninger og mere vedligeholdelsesvenlig kode.
- TDD gรธr det muligt at skrive mindre kode med enkelt ansvar i stedet for monolitiske procedurer med flere ansvarsomrรฅder. Dette gรธr koden lettere at forstรฅ.
- TDD tvinger ogsรฅ til kun at skrive produktionskode for at bestรฅ test baseret pรฅ brugerkrav.
Tillid til Refactor
- Hvis du refactorer koder, kan der vรฆre muligheder for brud i koden. Sรฅ med et sรฆt automatiserede tests kan du rette disse pauser fรธr frigivelse. Korrekt advarsel vil blive givet, hvis der konstateres pauser, nรฅr der anvendes automatiserede tests.
- Brug af TDD bรธr resultere i hurtigere, mere udvidelsesbar kode med fรฆrre fejl, der kan opdateres med minimale risici.
God til teamwork
- I mangel af et teammedlem kan andre teammedlemmer nemt samle op og arbejde pรฅ koden. Det hjรฆlper ogsรฅ med at dele viden, og derved gรธre teamet mere effektivt generelt.
Godt for udviklere
- Selvom udviklere skal bruge mere tid pรฅ at skrive TDD-testcases, tager det meget mindre tid til fejlfinding og udvikling.ping nye funktioner. Du vil skrive renere og mindre kompliceret kode.











