Er du ny til Rails? Ny til koding? Nysgjerrig på RSpec og hvordan kan du begynne å teste? I så fall bør denne artikkelen være et godt utgangspunkt for deg å komme inn i testdrevet utvikling. Det vil forklare deg hvorfor og hvordan, og det vil gi deg et overlevelseskit for å gå på din første testingstamme.
Hva er RSpec bra for? RSpec er veldig nyttig på enhetstestnivået, og tester de finere detaljene og forretningslogikken til appen din. Det betyr å teste internals som modeller og kontrollører av appen din. Tester som dekker dine visninger eller funksjonstester som simulerer mer komplette brukerstrømmer, som å kjøpe et element, vil ikke være det fokuset som RSpec er laget for. RSpec benytter seg ikke av en nettdriver - som Capybara gjør, for eksempel - som simulerer en brukers interaksjoner med et faktisk nettsted eller en representasjon av det.
Testdrevet utvikling (TDD), hva er poenget? Vel, det er ikke så lett å svare uten å gi deg noen klichéer. Jeg håper dette ikke høres unnvikende. Jeg kunne gi et raskt svar, men jeg vil unngå å sende deg hjem sulten etter å ha bare en liten matbit. Resultatet av denne lille serien om RSpec og testing bør ikke bare gi deg all info for å svare på dette spørsmålet ditt selv, men gir deg også midler og forståelse for å komme i gang med testing mens du føler deg litt trygg allerede om testingen.
Nybegynnere synes å ha en vanskeligere tid å komme inn i RSpec og TDD-arbeidsflyten enn å begynne å bli farlig med Ruby eller Rails. Hvorfor det? Jeg kan bare gjette på dette punktet, men på den ene siden virker litteraturen mest fokusert på folk som allerede har noen programmeringsevner under beltet deres, og på den annen side er det å lære alt det som er involvert for å få en klar forståelse, å litt skremmende. Læringskurven kan være ganske bratt, antar jeg. For effektiv testing er det mange bevegelige deler involvert. Det er mye å be om nybegynnere som nettopp har begynt å forstå et rammeverk som Rails for å se på prosessen med å bygge en app fra motsatt perspektiv og lære en helt ny API for å skrive kode for koden din.
Jeg tenkte på hvordan jeg kunne nærme seg dette "dilemmaet" for neste generasjon kodere som bare leter etter en jevnere start i hele greia. Dette er hva jeg kom opp med. Jeg vil bryte den mest essensielle syntaksen for deg uten å anta mye mer enn grunnleggende kunnskap om Ruby og en liten bit av Rails. I stedet for å dekke alle mulige vinkler og forvirre deg til døden, vil vi gå over ditt grunnleggende overlevelsessett og prøve å male det større bildet. Vi vil diskutere "How?" Ganske verbosely for ikke å miste nye kodere underveis. Den andre delen av ligningen vil forklare "hvorfor?"
Hvis jeg er heldig, vil du komme unna med et godt grunnlag for mer avanserte bøker mens du føler deg trygg på det større bildet. Ok nå, la oss gå på turen!
La oss komme tilbake til formålet med testing. Er testing nyttig for å skrive bedre kvalitet apps? Vel, dette kan bli diskutert, men for øyeblikket vil jeg svare på dette spørsmålet med et ja-jeg er i hipster TDD-leiren, antar jeg. La oss se hvorfor tester gir appene dine et par fordeler som er vanskelig å ignorere:
De kontrollerer om arbeidet ditt fungerer som beregnet. Konstant validering av at du skriver kode som virker, er viktig for helsen din søknad og lagets sunnhet.
De tester ting du ikke vil teste for hånd, kjedelige sjekker som du kan gjøre for hånd - spesielt når du må sjekke dette hele tiden. Du vil være så sikker som mulig at din nye funksjon eller din nye klasse eller hva som helst ikke forårsaker bivirkninger i kanskje helt uforutsette områder av appen din. Automatisere den typen ting sparer ikke bare en tonn av tid, men vil også gjøre testscenarier konsistente og reproduserbare. Det alene gjør dem mye mer pålitelige enn feilproblemer med hånden.
Vi vil sørge for at appen oppfører seg på en bestemt måte, på en forventet måte. Testene kan i en ganske høy grad sikre at måten brukerne kommuniserer med appen din, fungerer og unngå bugscenarier som du var i stand til å forutse. Testene kontrollerer at søknaden din fungerer slik du har utformet den - og at den fortsetter å fungere etter at du har innført modifikasjoner. Dette er spesielt viktig når testpakken din informerer deg om sviktende scenarier om implementeringer av appen din som kan være gamle og derfor ikke akkurat bak i hjernen din lenger og ikke vurdert når du introduserte noen ny funksjonalitet. Kort sagt, det bidrar til å holde appen frisk og unngår å introdusere tonnevis av feil.
Automatiseringsprøver gjør at du faktisk tester oftere. Tenk deg om du må teste noe for den 40. gangen av en eller annen grunn. Hvis det bare er litt tidkrevende, hvor lett vil det være å kjede seg og hoppe over prosessen helt? Disse tingene er det første skrittet på en glidende skråning der du kan kysse en anstendig prosentdel av kodeverdien farvel.
Tester fungerer som dokumentasjon. Hu h? Spesifikasjonene du skriver gir andre personer på lagene ditt et raskt inngangspunkt for å lære en ny kodebase og forstå hva den skal gjøre. Å skrive kode i RSpec, for eksempel, er veldig uttrykksfulle og danner svært lesbare kodeblokker som forteller en historie om det er gjort riktig. Fordi det kan skrives veldig beskrivende, samtidig som det er et veldig kortfattet Domenespesifikt Domenet (DSL), treffer RSpec to fugler med en stein: Ikke å være verbose i API-en, og gir deg alle muligheter til å skrive svært forståelige testscenarier. Det var det jeg alltid likte om det, og hvorfor jeg aldri ble veldig varm med agurk, som var å løse det samme problemet på en altfor klientvennlig måte, tror jeg.
De kan minimere mengden kode du skriver. I stedet for å spike rundt som gal, prøve ut ting mer freestyle, gjør øvelsen med å prøvekjøring koden din kun å skrive koden som er nødvendig for å bestå testene dine. Ingen overskuddskode. En ting du ofte vil høre i din fremtidige karriere er at den beste koden er kode du ikke trenger å skrive eller noe. Hvorfor? Vel, oftest, mer elegante løsninger innebærer mindre mengder kode og også kode som du ikke skriver - noe som kan være unødvendig - vil ikke forårsake noen fremtidige feil og behøver ikke opprettholdes. Så skriver du tester først, før du skriver implementeringen, gir deg et klart fokus på hvilket problem du trenger for å løse neste. Å skrive bare kode som er nødvendig, og ikke ved et uhell mer, er kanskje en undervurdert bivirkning som TDD kan gi deg.
De har en positiv effekt på designen din. For meg forstod denne delen en lyspære og fikk meg til å sette pris på hele testingen. Når du skriver implementeringene dine rundt svært fokuserte testscenarier, vil koden din sannsynligvis vise seg å være mye mer compartmentalized og modulær. Siden vi er alle venner av DRY- "Gjenta ikke!" - og så lite kobling mellom komponenter i appen din som mulig, er dette en enkel, men effektiv disiplin for å oppnå systemer som er utformet godt fra grunnen. Dette aspektet er den viktigste fordelen, tror jeg. Ja, de andre er ganske kjempebra, men når tester også resulterer i apps som har bedre kvalitet på grunn av en raffinert design, sier jeg Jackpot!
Det koker ned til penger også. Når du har en stabil app som er lett å vedlikeholde og lett å endre, vil du spare litt penger i det lange løp. Unødvendig kompleksitet kan enkelt hjemsøke prosjekter, og motivasjonen vil ikke være helt høy når teamet ditt må bekjempe koden din fordi den er sprø og dårlig utformet. God applikasjonsdesign kan absolutt støtte dine forretningsmål - og omvendt. Ønsker du å introdusere noen nye funksjoner som er avgjørende for virksomheten din, men støter du stadig på arkitekturen fordi den ble bygget på sand? Selvfølgelig ikke, og vi har alle sett mange eksempler på bedrifter som raskt forsvant for den nøyaktige grunnen. Gode testvaner kan være en effektiv forsvarslinje for slike situasjoner.
Et annet mål som er viktig er med hensyn til kvaliteten på koden din selv. Programvaren du skriver, bør være lett å forstå for andre utviklere - minst mulig. Dine tester kan virkelig bidra til å formidle funksjonaliteten og hensikten med søknaden din - og ikke bare til andre medlemmer på et lag, men også i ditt fremtidige selv. Hvis du ikke berører en bestemt del av koden for en stund, vil det være nyttig å oppdatere minnet om hvordan og hvorfor du skrev et program med dokumentasjonen som et verktøy som RSpec gir, og RSpec gjør det dette virkelig bra, eksepsjonelt faktisk.
Siden koden din alltid vil endre, vil refactoring koden din og alltid være en del av utviklingen av programvaren din. Og siden endringen er så bakt inn i denne prosessen, må du sørge for at disse endringene ikke genererer uventede bivirkninger på overraskende steder. Testpakken gir deg et ganske stramt sikkerhetsnett for å føle deg mer komfortabel og fri til å refactor med gusto. Dette aspektet, ved siden av designfordelene TDD kan gi deg, er min favoritt fordel en testpakke kan hjelpe deg med. Å endre og utvide koden er en så viktig del av innovasjonen på det allerede utgitte "produktet" at du trenger et verktøy som gir deg så mye frihet som mulig med den prosessen. Jeg er ikke sikker på om folk som er kritiske for å skrive en omfattende testpakke, er svært opptatt av dette aspektet.
Du får en god sjanse til å bygge nye ting raskere i senere stadier fordi tilbakemeldingen fra testpakken gir deg tilbakemelding om feilene dine, feilene og begrensningene - mye raskere enn en person kan teste selvfølgelig. I tillegg vil det gi deg tilliten til å jobbe med et sikkerhetsnett som blir enda mer verdifullt, jo lenger du går.
I appene dine, spesielt hvis de har vokst betydelig, vil du være i stand til å stole på programvaren din. 100% kodedekning lyder mye søtere når du har et nettsted som er et par år gammelt og berørt av hundrevis av utviklere. Å være i stand til å stole på den nye koden du introduserer og bygger på, er en av lykkene til programvareutvikling som penger ikke kan kjøpe senere.
skinner nytt your_app -T
-T
lar deg hoppe over Test Unit, testrammen som følger med Rails.
gruppe: utvikling,: test gjør gem 'rspec-skinner' ende
bunt
Etter det må vi kjøre en generator som følger med RSpec:
skinner generere rspec: installere
lage .rspec lage spesifikke lage spec / spec_helper.rb lage spec / rails_helper.rb
Dette gjør det grunnleggende for RSpec-testene i Rails. Som du kan se fra utgangen ovenfor, initierte denne generatoren a spec
katalog med noen få filer du trenger senere. De .rspec
filen er en konfigurasjonsfil som vi ikke trenger å manipulere for nå. Jeg ville bare fortelle deg hva du har foran deg. De andre filene er selvforklarende, men jeg ville nevne forskjellene deres.
spec_helper.rb
er for spesifikasjoner som ikke er avhengige av Rails.rails_helper.rb
, På den annen side er det for spesifikasjoner som avhenger av det.Det som ikke er åpenbart er at en av disse filene må være påkrevd på toppen av dine spesifikke filer (testfiler) for å kunne kjøre testene dine. La oss få en rask titt! Når du genererer en modell via:
skinner generere modell dummy_model navn: streng
påkall active_record opprett db / migrere / 20160521004127_create_dummy_models.rb lag app / modeller / dummy_model.rb påkalle rspec lage spec / models / dummy_model_spec.rb
Ikke bare vil Rails ha skapt den tilknyttede _spec.rb
filer for deg, dine spesifikasjoner vil også automatisk ha krever 'rails_helper'
som standard på toppen av dine spesifikke filer. Det betyr at du er klar til å gå, med en gang.
krever "rails_helper" ...
Så med dette oppsettet kan du teste Rails app, modellene dine for eksempel, og RSpec vil ikke bli forvirret om modellklasser som brukes i Rails. Dette er nødvendig for å kreve når du trenger ting som Active
, ApplicationController
og så videre. Så dette er ditt normale scenario og derfor bør være ditt første logiske valg som nybegynner.
kreve spec_helper.rb
, På den annen side vil det kaste en feil hvis du skriver tester som inkluderer forretningslogikk fra Rails app. I det scenario vil RSpec ikke vite hva du snakker om når du vil teste noen Rails-modell, for eksempel.
Så lang historie super kort, spec_helper
laster ikke Rails-det er det! Selvfølgelig kan du gå vill med konfigurasjoner, men dette er ingenting jeg vil at du skal være bekymret for akkurat nå. La oss fokusere på det grunnleggende, hvordan du kjører tester og syntaksen. Det burde være tilstrekkelig til forretter. La oss gå videre!
Du er klar til å kjøre testene dine. RSpec krever at testfilene dine har et bestemt suffiks som _spec
å forstå hvilke filer som skal kjøres. Hvis du bruker en generator, er dette ikke et problem, men hvis du vil skrive testfiler alene, så trenger du å avslutte. Så du må legge en fil som your_first_test_spec.rb
i din spec
katalog.
Bruke generatoren for å lage en dummy-modell ga oss allerede med spec / modeller / dummy_model_spec.rb
. Ikke verst! En ting igjen å gjøre før testene er klare:
rake db: migrere rake db: test: klargjøre
Disse kommandoene kjører flyttingen din for dummy-modellen vi genererte ovenfor, og sette opp testdatabasen med den modellen også. Nå kjører vi faktisk testen:
rake
De rake
kommandoen vil kjøre alle dine tester, den komplette testpakken. Vanligvis bør du bruke denne kommandoen når du er ferdig med en funksjon og ønsker å utøve hele testpakken.
* Venter: (Feil som er oppført her, forventes og påvirker ikke suitenes status) 1) DummyModel legg til noen eksempler på (eller slett) / Brukere / vis_kid / prosjekter / rspec-test-app / rspec-dummy / spec / models / dummy_model_spec .rb # Ikke implementert ennå. /spec/models/dummy_model_spec.rb:4 Ferdiggjort i 0,00083 sekunder (filer tok 1,94 sekunder å laste) 1 eksempel, 0 feil, 1 ventende
Gratulerer! Du har akkurat kjørt din første RSpec-test. Ikke så ille, var det? Selvfølgelig var dette en dummy test for nå - med dummy testkode generert av Rails. Den mer fokuserte versjonen av å kjøre testene dine - du har faktisk flere alternativer enn bare det - er å kjøre en enkelt fil, for eksempel. Som dette:
bunt exec rspec spec / models / dummy_model_spec.rb
Dette vil bare kjøre en enkelt testfil i stedet for hele testpakken. Med større applikasjoner som er avhengige av en stor mengde testfiler, blir dette en sanntidspakke. Men når det gjelder å spare tid og test-spesifisitet, er dette bare å skrape overflaten, for å være ærlig. Jeg tror vi vil dekke mer av hvordan å barbere av betydelig tid mens du tester i den tredje artikkelen i denne serien. La oss se hvor langt vi får!
Den andre måten å utøve hele testpakken på er å bare kjøre rspec
-med eller uten bundle exec,
avhengig av oppsettet ditt.
bunt exec rspec
En ting jeg må nevne før vi går videre, kan du også kjøre bare en bestemt delmengde av tester. Si at du bare vil kjøre alle tester for modellkoden din:
bunt exec rspec spec / modeller
Lett som det!
Jeg anbefaler at vi starter med det røde grunnleggende og ser på noen få alternativer som RSpec gir i de to neste artiklene. La oss ta en titt på grunnleggende strukturen i en test og dykke inn i mer avanserte farvann når vi har denne ut av veien.
beskrive
Dette blir ditt brød og smør fordi det organiserer dine spesifikasjoner. Du kan referere strenge eller klasser selv:
Beskriv Bruker gjør sluttbeskrivelsen 'Noen streng' slutter
beskrive
Deler er de grunnleggende byggesteinene for å organisere testene dine i logiske, sammenhengende grupper for å teste. I utgangspunktet et omfang for forskjellige deler av programmet du vil teste.
Beskriv Bruker gjør ... slutt beskrive Gjest gjør ... sluttbeskrivelse Angrep gjør ... slutt
Et godt tips er å stramme omfanget ditt enda mer. Siden noen klasser vil vokse ganske betydelig, er det ikke en god ide å ha alle metodene du vil teste for en klasse i en enkelt beskrive
blokkere. Du kan selvfølgelig opprette flere av disse blokkene, og fokusere dem i stedet for eksempel- eller klassemetoder. For å gjøre din hensikt klarere, er alt du trenger å gi klassenavnet en ekstra streng som refererer til metoden du vil teste.
Beskriv agent, "#favorite_gadget" gjør ... ende beskrive Agent, '#favorite_gun' gjør ... ende beskrive Agent, '.gambler' do ... end
På den måten får du det beste fra begge verdener. Du inkapsler relaterte tester i deres representative grupper, samtidig som tingene holdes fokusert og i en anstendig størrelse. For brukere som er veldig nye til Ruby land, bør jeg nevne det #
refererer bare til en forekomstmetode mens punktet .
er reservert for klassemetoder. Fordi de er innenfor strenger, har de ingen tekniske implikasjoner her, men de signaliserer din hensikt til andre utviklere og ditt fremtidige selv. Ikke glem kommaen etter klassenavnet - det vil ikke fungere uten det! Om et øyeblikk, når vi kommer til forvente
, Jeg skal vise deg hvorfor denne tilnærmingen er super praktisk.
den
Innenfor omfanget av beskrive
grupper, bruker vi et annet omfang av den
blokker. Disse er laget for de aktuelle eksemplene under testen. Hvis du vil teste forekomstmetoden #favorite_gadget
på Middel
klassen, ville det se slik ut:
beskriv agent, '#favorite_gadget' gjør det 'returnerer ett element, favoritt gadget av agenten' gjør ... slutten
Strengen du gir til den
blokkere fungerer som hoveddokumentasjon for testen din. Innenfor det angir du nøyaktig hvilken type oppførsel du vil eller forventer av den aktuelle metoden. Min anbefaling er ikke å gå overbord og være for øye på det, men samtidig ikke å være altfor kryptisk og forvirre andre med altfor smarte beskrivelser.
Tenk på hva den minste og enkleste gjennomføringen av denne delen av puslespillet kan og bør gjøre. Jo bedre du skriver denne delen, desto bedre blir den generelle dokumentasjonen for appen din. Ikke hør denne delen fordi det bare er en streng som ikke kan skade - i hvert fall ikke på overflaten.
forvente ()
Nå får vi mer til hjertet av tingene. Denne metoden lar deg verifisere eller forfalske delen av systemet du vil teste. La oss gå tilbake til vårt forrige eksempel og se det i (begrenset) handling:
beskriv agent, '#favorite_gadget' gjør det 'returnerer ett element, favoriseringsgruppen til agenten' forventer (agent.favorite_gadget). til eq 'Walther PPK' ende
forvente ()
er den "nye" påstandssyntaxen til RSpec. Tidligere brukte vi bør
i stedet. Ulike historie, men jeg ville nevne det i tilfelle du kommer inn i den. forvente ()
forventer at du gir den et objekt og utøver hvilken metode som er testet på den. Til slutt skriver du det påståtte resultatet på høyre side.
Du har muligheten til å gå med den positive eller negative ruten med .å eq
eller .ikke til ekv
for eksempel (ekv
være kort for like selvfølgelig). Du kan alltid slå logikken rundt - det som passer best til dine behov. La oss kjøre denne nonsensiske testen og fokusere på produksjonen som vi fikk som følge av testoppsettet vårt:
rspec spec / models / agent_spec.rb
Feil: 1) Agent # favorite_gadget returnerer ett element, favoritt gadget av agenten Feil / Feil: forvent (agent.favorite_gadget). Til eq 'Walther PPK'
Leser ganske bra, gjør det ikke? ** "Agent # favorite_gadget
returnerer ett element, og favorittgrensesnittet til middel"**
forteller alt du trenger å vite:
Hvis vi hadde slått av strengen som beskriver metoden i beskrive
blokkere, så ville produksjonen vært mye mindre klar og lesbar:
beskrive Agent gjør det 'returnerer ett element, favoriseringsgirget til agenten' forventer (agent.favorite_gadget) .til eq 'Walther PPK' ende
Feil: 1) Agent returnerer ett element, favorittgrensesnittet til agenten Feil / Feil: forvent (agent.favorite_gadget). Til eq 'Walther PPK'
Jo, det er andre måter å kringgå og håndtere denne passerer denne informasjonen via din den
blokkere, for eksempel-men den andre tilnærmingen er bare enkel og fungerer. Uansett hva som gjør blodstrømmen din selvfølgelig!
Best practices i testing anbefaler at vi komponerer våre tester i fire forskjellige faser:
Disse fire faser er for det meste for lesbarhet og for å gi testene en konvensjonell struktur. Det er et såkalt testmønster, i utgangspunktet en praksis som fellesskapet var enige om å være nyttig og anbefalt. Dette hele mønsteret temaet er et dypt kaninhull, så vet at jeg slipper ut en haug for ikke å forvirre nybegynnere blant dere til døden.
Under oppsettet forbereder du scenariet der testen skal løpe. I de fleste tilfeller vil dette inneholde data som trengs for å være klar for en slags trening. Litt tips: ikke overkompliser ting, og sett opp bare det minste beløpet som er nødvendig for å gjøre testarbeidet.
agent = Agent.create (navn: 'James Bond') oppdrag = Mission.create (navn: 'Moonraker', status: 'Briefed')
Denne delen driver faktisk den tingen du vil teste i denne spesifikasjonen. Kan være så enkelt som:
status = mission.agent_status
Nå bekrefter du om påstanden om testen blir oppfylt eller ikke. Så du tester systemet mot dine egne forventninger.
forvente (status) .not_to eq 'MIA')
Rammeverket tar seg av minne- og databaseproblemer - en tilbakestilling, i utgangspunktet. Det er ingenting for deg å håndtere på dette punktet. Målet er å få tilbake en uberørt tilstand for å kjøre nye tester uten noen overraskelser fra de som kjører. La oss se hva dette ville bety i et dummy eksempel:
Beskriv agent, '#favorite_gadget' gjør det 'returnerer ett element, favorittgjenkjenningen til agenten' gjør # Oppsettagent = Agent.create (navn: 'James Bond') q = Quartermaster.create (navn: 'Q') q .technical_briefing (agent) # Trening favorite_gadget = agent.favorite_gadget # Bekreft forventer (favoritt_gadget) .til eq 'Walther PPK' # Teardown er for tiden mest håndtert av RSpec selv ende ende
Som du kan se, i dette eksemplet adskilt vi øvelsen og verifiserer faser tydelig fra hverandre, mens i de andre eksemplene ovenfor, Forvent (agent.favorite_gadget). til eq 'Walther PKK
, Vi blandet begge faser sammen. Begge er gyldige scenarier og har deres plass. De nye linjene bidrar også til å visuelt skille hvordan testen er strukturert.
Nå kommer den harde delen, hva skal du teste og hvordan. Etter min mening er dette aspektet ved testing som er mest forvirrende for nykommere - og forståelig nok så! Du er ny på språket og rammen og vet ofte ikke engang hva du ikke vet. Hvordan skriver du tester for det? Veldig bra spørsmål.
Jeg vil være veldig ærlig, du er ikke mest sannsynlig, og du vil ikke ha det lenge. Å bli komfortabel med dette, tar en stund. Når du har en mentor eller delta i noen boot camp og slik, har du muligheten til å lære direkte fra erfarne mennesker. I så fall vil fremdriften din i denne avdelingen være forskjellig, selvfølgelig.
På den annen side, hvis-som så mange andre der ute-du lærer deg selv disse tingene, vil tålmodighet være nøkkelen. Å lese alle bøkene og artiklene får deg i riktig retning, men jeg tror at testingen trenger mange mer avanserte puslespill på plass for at du skal få full mening og kanskje enda viktigere før du føler deg komfortabel med det.
De "gode" nyhetene er at dette ikke er uvanlig, og vi har alle vært der. Utholdenhet er viktig. Du kan gjøre dette, det er ingen rakettvitenskap, men det vil ta litt tid før du kan skrive et program effektivt fra omvendt - fra testerens perspektiv mener jeg. For nå, fortsett å presse, ha det gøy, lage feil, skriv programmer, kopier opplæringsprogrammer og hva ikke, til lyspæren går av.
Når du skriver dine individuelle tester, vil du gjøre sine objekter, gjør det enkleste mulig å oppnå målene dine - høyt fokuserte tester er virkelig viktige. Du vil designe søknaden din via enkle trinn, og følg deretter de feilene testpakken din gir deg.
Bare implementer det som er nødvendig for å få appen grønn. Ikke mer, ikke mindre! Det er den "drevne" delen i testdrevet utvikling. Arbeidet ditt styres av testens behov.