• 2016/04/20
  • ALbert Mietus
  • EHV
  • Nederlands
  • Narrative Pathways
  • Pathways

Pathways: “Automatic product validation during lean & agile development

../_images/pathways_logo.png

Een poos geleden werd ik door een collega uitgedaagd: “Jij, als Pythondocent, kan toch wel je Automatisch TestScript concept uitwerken tot een algemeen beschikbaar voorbeeld?”. Ze had natuurlijk een goed argument. Want al is mijn idee voor testautomatisering in agile projecten al een paar keer gerealiseerd, die waren allemaal klantspecifiek en (dus) niet beschikbaar voor een volgend team. Een algemeen beschikbaar voorbeeld zou dat veel makkelijker maken. “Nu kost het telkens veel moeite om die mensen te laten ervaren hoe goed het werkt”, zei ze nog.

Dit heeft geleid tot Pathways: een referentie implementatie, als voorbeeld, om met behulp van automatische testscripts (ATSen) het ontwikkelen van softwaresystemen goedkoper te maken. Of beter, daar ben ik mee bezig. Gelukkig hebben een paar beschikbare collega’s al een paar keer geholpen. Door mijn knutsels te proberen (natuurlijk werkte het niet bij hun …), te brainstormen over hoe het eenvoudiger kan en door een soort van pilot workshop te volgen. Want ook dat is een doel: er moet een hiervoor een training komen.
Die hulp heeft, zoals verwacht, tot de nodige verbeteringen geleid. Maar ook tot meer werk, want het kan altijd beter en mooier. Ik kan dus nog steeds hulp gebruiken. Gelukkig vindt iedereen die geholpen heeft het Pathways-concept goed; dat geeft energie om door te gaan met het onderzoek.

Eén van de belangrijkste uitgangspunten voor Pathways is dat het eenvoudig en goedkoop moet zijn om testen te ontwerpen. Elke tester moet die mini python-scripts kunnen lezen, begrijpen en schrijven. Een triviale test (toevoegen) mag immers maar een paar minuten duren; de noodzaak om eindeloze documenten te schrijven moet (dus) voorkomen worden. Neem een rekenmachine als voorbeeld: hoe moeilijk is het om het optellen van twee getallen te testen? In het voorbeeld hieronder kan het in 5 regels, plus een handvol testvectoren. Zelfs zonder uitleg zal vrijwel iedereen het begrijpen. Het toevoegen van een extra test(case) is triviaal: gewoon één regel toevoegen aan een csv-file.
En de meeste testcollega’s konden met onderstaande voorbeeld direct aan de slag om ook testen voor aftellen, delen en vermenigvuldigen te programmeren.

Feed

Expect

a

b

a+b

1

2

3

3

4

7

-12

42

30

def ATS_add(rekenapp, tstvectors):
    "A basic test to add 2 numbers and verify the result"
    for feed, expect in tstvectors:
        actual = rekenapp.add(feed[0], feed[1])
        assert actual == expect[0], \
          "adding %s => got %s, expected: %s" % (feed, actual, expect)

Natuurlijk is er soms meer werk nodig. Zonder in details te treden: rekenapp en tstvectors in dit voorbeeld zijn fixtures. Ook dat is telkens een handvol regels code, die zorgen voor de (herbruikbare) setup- en teardown van de test. Daarnaast gebruikt elke ATS één of meerdere test-bricks; die vaak geschreven worden met hulp van de programmeurs in het team. In dit voorbeeld vertalen die het (logische) add-commando naar (fysieke) gebruikershandelingen: bijvoorbeeld muiskliks op de toetsen van de webrekenmachine. Maar ook het teruglezen van het resultaat op het display.

Ook zijn bricks herbruikbaar. Het is zelfs mogelijk om complete testen te hergebruiken! In mijn voorbeelden kan ik ook een xmlrpc-rekenserver testen, gewoon door een andere set ‘bricks’ te gebruiken. Als het goed is geeft die hetzelfde resultaat; alleen de aansturing is anders.
Als iemand een robotje voor mij kan bouwen om de toetsen van een echt rekenmachientje te bedienen, kunnen we ook die testen opnemen als standaard voorbeeld. Wie helpt?

Ook als je wilt helpen als tester, programmeurs, elektronica-specialist, documentatie-schrijver of gewoon als hobbyist, neem gerust contact op! Ik heb nog ideeën zat! Ook zal ik proberen regelmatig een update te geven in deze nieuwsbrief.

— ALbert

Disqus

Aardige feedback is altijd welkom, evenals alternative meningen; zolang ze relevant zijn voor alle lezers. Hiervoor gebruik ik momenteel ‘Disqus’.

comments powered by Disqus