2008-10-24

OOPSLA, dag 5

Fit, Framework for Integrated Test, är ett acceptanstestramverk som jag länge velat använda i mitt arbete. Ramverket är skapat av ingen mindre än XP- och OO-gurun Ward Cunningham och sedan vidareutvecklat, i form av FitNesse, av Robert C. Martin ("Uncle Bob"). Så även om Linda Risings "Project Retrospectives" lockade var det inget svårt val att som sista tutorial på OOPSLA välja "Accept Automated Acceptance Testing - Using FitNesse in the Real World" med Jens Coldewey.

Med Fit kan domänexperter själv mata in tester, eller i alla fall testvärden, i ett Excel-dokument som sedan exekverar och testar produktionskoden med hjälp av "fixtures" som utvecklaren kodar för att koppla ihop tester och produktionskoden. FitNesse använder sig av Fit men tillhandahåller en Wiki för att skriva testerna i tabellform. Något förenklat kan man säga att man uttrycker testerna i form av tabellrader där varannan kolumn är en beskrivande text och varannan en parameter till ett test. Ett exempel:

| check | Client | John Doe | deposits | 50.00 | and the new balance is | 50.00 |
| check | Client | John Doe | withdraws | 30.00 | and the new balance is | 20.00 |

Det första ordet "check" har en särskilt innebörd i Fit, men efter det gäller varannan text, varannan parameter, så att t.ex. "Client" och "deposits" är texter medan "John Doe" och 50.00 är parametrar. I wikisidan anger man också vilken klass testerna ska bindas mot. Klassen måste implementera någon av Fits olika fixture-basklasser. Så som testet är skrivet ovan kommer FitNesse att förvänta sig att klassen har två metoder:

public double ClientDepositsAndTheNewBalanceIs(string clientName, double amount)
public double ClientWithdrawsAndTheNewBalanceIs(string clientName, double amount)

Egentligen är det bara metodnamnen den förväntar sig ska se ut exakt som ovan eftersom de byggs ihop med hjälp av texten i testerna. Vad parametrarna heter är ointressant, det är bara ordningen på dem som är viktig. När testet nu exekveras kommer sista kolumnen i raden att antingen färgas grön om det lyckas eller röd om det misslyckas. I det senare fallet kommer det också att visas vad det faktiska värdet som returnerades är. Implementationen av testmetoderna kanske ser ut ungefär så här:

Account account = new Account(clientName);
account.Deposit(amount);
return account.Balance;

För att testerna ska fungera ihop måste förstås account vara en instansvariabel, annars kommer man att göra en "withdraw" på ett annat objekt. Men svårare än så här är det egentligen inte. Sedan finns det förstås ett antal nyckelord och olika sorters tabeller och fixtures man kan använda; det är exempelvis inte alla tester som låter sig uttryckas enligt mönstret ovan.

Det som lockar mig med FitNesse är att det faktiskt är ett verktyg där domänexperterna själva kan läsa och många gånger även ändra i testerna och lägga till nya rader. Med viss övning är det till och med möjligt för dem att skriva egna tester som utvecklaren sedan ser till att få gröna genom att implementera dels fixtures, dels produktionskod. När man inleder en sprint/iteration eller börjar på en ny story kan utvecklare, testare och domänexpert sätta sig tillsammans och börja skapa testerna i FitNesse, något som är ett utmärkt tillfälle för att utveckla den gemensamma modellen och förfina det gemensamma domänspråket.

Sist ut av keynote-talarna var Mark Jason Dominus, bl.a. känd som Perl-expert, som talade om "Atypical Types" och vad vi kan lära oss från framför allt Haskells typsystem. Dominus lär tydligen normalt vara en mycket underhållande och uppskattad talare - och visst fanns det humoristiska guldkorn här också - men innehållsmässigt var hans föredrag en salig blandning mellan mycket grundläggande och tämligen komplicerat. Den största delen var en sorts argumentation för varför starka typer är bra i ett språk, så om man först trodde han skämtade när han inledde med att säga att detta var ett gammalt föredrag för Perl-utvecklare från 1999, började man nu förstå att det faktiskt var sant. Starka typer var kanske kontroversiellt för Perl-utvecklare på den tiden, men knappast på OOPSLA 2008.

1 kommentar(er):

Henrik Engström sa...

Låter som att du är lite besviken på OOPSLA. Stämmer det? Infirade det inte dina förväntningar? Vad tyckte du var mest intressant?
Hoppas det blir bra på PDCn :-)