Acceptanstestdriven utveckling med DSL
- tis 23 sep, 2008 kl 12:48
- 4 kommentarer
- Agile, Arbetssätt, DSL
De senaste åren har jag gått igenom en ”mognadsprocess” när det gäller min inställning till acceptanstester. Tidigare tyckte jag nog bara att detta var något nödvändigt ont som man gjorde för att man måste, men numera har jag insett att bra acceptanstester kan göra underverk för vilket projekt som helst. Jag pratar naturligtvis om automatiserade acceptanstester för att åstadkomma Acceptanstestdriven Utveckling (ATDD).
Särskilt upphetsad är jag över utvecklingen mot acceptanstester som definieras med domänspecifika testspecifikations-språk, DSLs for acceptance testing. Att en icke programmeringskunnig beställare närsomhelst kan titta i och förstå en ständigt körbar specifikation – skriven i termer av den egna verksamheten – tror jag ger honom/henne en enorm känsla av kontroll över systemets alla krav och önskemål. Och antalet missförstånd mellan beställare och utförare kan minska dramatiskt!
Den som har skrivit mest och bäst om domänspecifika språk är nog Martin Fowler. Han har publicerat några artiklar och han håller på att skriva en bok i ämnet. Enligt Fowler är det att lägga ribban för högt om man försöker skapa en DSL som beställaren kan skriva helt på egen hand. Oftast räcker det med att han/hon skapar testerna tillsammans med en utvecklare, bara testerna lätt kan förstås i efterhand, utan en utvecklares hjälp.
Att kunden är ansvarig för att definiera körbara acceptanstester är ju inget nytt i sig. Jag tänker främst på verktyg som Fit och FitNesse, som lämpar sig väldigt bra för kundskrivna acceptanstester när indata och förväntat utdata kan specas i tabell- eller matrisform. Utvecklarna får då hjälpa till med att skriva små ”bryggor” mellan tabellerna och den testade koden. I de triviala fallen är detta en bra lösning, men ofta blir ju användingsfallen svårare än så. Tabellerna kan bli kryptiska för kunden och det kan bli besvärligt för utvecklaren att utveckla bryggorna.
En strategi för att skapa ett DSL för acceptanstestning är att först låta kunden formulera några krav i hans/hennes egen terminologi på ren engelska, och därefter göra så lite modifikationer som möjligt till den syntaxen. Kund och utvecklare tillsammans ändrar endast de språkkonstruktioner som kan göra det svårt för en dator att tolka texten. Man kanske kan behålla 90% av den exakta (engelska) ordalydelsen.
Detta är bara ett exempel på tillvägagångssätt, och resultatet behöver inte vara särsklit likt engelska heller.
Var på skalan mellan kryptiskt datorspråk och vältalig engelska man hamnar beror på hur man prioriterar mellan flera olika faktorer. Till exempel:
*Hur kraftfull behöver DSL:en vara?
*Hur stor del av verksamheten/logiken behöver DSL:en hantera? (Mindre delar –> enklare, men fler DSLer)
*Vilken programmeringskunskap finns hos kunden/domänexperten? Något specifkt språk?
*Hur mycket tid/pengar kan man lägga på arbetet med att skapa DSL:en?
Den viktigaste faktorn för framgång är nog ändå att kunden måste vara förberedd på att vara kontinuerligt delaktig i DSL:ens utveckling och inte bara i själva specandet. En ytterligare förutsättning är att testerna och koden som testas lever i symbios och influeras starkt av varandra. Att försöka skriva ett DSL i efterhand för ett existerande system (utan att ändra det) tror jag skulle vara mycket problematiskt för att inte säga omöjligt.
Jag har tidigare bloggat om ett av mina favoritcitat (japp, Fowler är skyldig till detta också!):
Any fool can write code that a computer can understand
Good programmers write code that humans can understand
Nu skulle jag villja göra ett litet tillägg:
Excellent programmers write tests that customers can understand!
:-)
Här kommer lite rekommenderad läsning om man tycker att det låter intressant med DSL-acceptanstestning:
http://martinfowler.com/bliki/DslQandA.html
http://studios.thoughtworks.com/download_files/DSLs_for_Functional_Testing_ThoughtWorks_Feb08.pdf
http://www.martinfowler.com/bliki/DomainSpecificLanguage.html
http://www.testingreflections.com/node/view/6704
Intressant inlägg Martin
Det man kan fundera över är ju om acceptans tester skall göras på lägre nivå än UI nivån. Ett acceptans test kör man ju för att testa om implementationen är helt klar och kan accepteras. Denna acceptans bore vara blackbox tester och om det finns det gui så borde det vara där man gör acceptans testerna.
Sen tror jag att det ligger något i ditt tillägg Martin:
- Excellent programmers write tests that customers can understand!
Jag tror dock att man som en ”teknisk” person, ofta glömmer av det här med de mjukare faktorerna som är rätt svåra att påverka. Visst låter det bra om det finns en programmer som vill skriva tester som kunden kan förstå. Dock tror jag att det är desto svårare att få kunden att ens vilja ta en titt på den typen av ”verksamhet”.
”Jag betalar stora pengar för detta. Ni är ju programmerare. Varför ska jag läsa detta, det är ju ert jobb att syssla med sånt där.”, tror jag inte är omöjligt att man hör.
Detta gäller även dsl:er och verktyg som är till för att vara lättlästa. I framtiden kanske kunden inser att den borde vara mer involverad i hela processen. Men idag har många svårt ens att få prata med kunden på ett sätt där alla har samsyn över situationen.
Lyckas man dock stöta på en drömkund är det guldkorn.
Per,
Tack för kommentar. Jag håller helt med dig!
Inspelade GUI-tester tror jag väldigt lite på. Kostar mer än de smakar! Bättre isåfall att tänka API. Man utvecklar ett API för två klienter: Ett tunt GUI och en svit av acceptanstester. Guitesterna får man sköta manuellt…
Man skulle nog tjäna mycket på att involvera kunden på lägre nivåer, om man bara vet var man skall dra gränsen. Blir det för låg nivå blir det nog bara förvirrat. Men om man t.ex. kan få kunden att acceptanstesta isolerade moduler av systemet kan det bli riktigt intressant!!
Ferid,
Tack för kommentar. Jag förstår dina farhågor, men det är just ’samsynen’ som jag tror att acceptanstest-dsl:er kan hjälpa till att förbättra! Men, det kan nog vara så att det är en rätt så stor tröskel för att komma dit!