Test-driven development1 (TDD) is een techniek die gebruikt wordt door software-ontwikkelaars. De techniek bestaat erin om eerst enkele voorbeelden neer te schrijven die aangeven hoe de programmacode moeten werken, vooraleer de eigenlijke programmacode geschreven wordt waarmee het probleem in kwestie kan opgelost worden. Kent Beck die de techniek in 2003 heeft ontwikkeld, zegt er zelf het volgende over: "TDD encourages simple designs and inspires confidence".
De Python Standard Library bevat een module doctest2 waarmee het TDD-principe makkelijk kan toegepast worden bij het schrijven van Python programmacode. Deze module bevat immers een functie testmod die op zoek gaat naar stukken tekst in de docstrings van de programmacode die eruit zien als interactieve Python sessies. Deze tekstfragmenten worden daarna ook daadwerkelijk uitgevoerd, om na te gaan of ze wel degelijk werken zoals wordt aangegeven. Om je programmacode aan een doctest te onderwerpen, volstaat het dus om representatieve voorbeelden op te nemen in de docstrings van je functies en achteraan je Python modules het volgende fragment toe te voegen:
if __name__ == '__main__':
import doctest
doctest.testmod()
We willen een Python module schrijven waarin we een aantal functies bijeenbrengen die kunnen gebruikt worden om woorden en zinnen te analyseren. Onderstaand codefragment bevat reeds de eerste aanzet hiertoe. We hebben reeds de hoofding van de functies uitgewerkt, die de naam en de parameters vastlegt. Hierbij moet voor de parameter s steeds een string doorgegeven worden, en moet voor de parameter l steeds een lijst van strings doorgegeven worden. Via enkele representatieve voorbeelden onder de vorm van interactieve Python sessies hebben we in de docstring van de functies ook reeds aangegeven hoe de functies moeten werken.
Het is jouw taak om op basis van de voorbeelden af te leiden welk resultaat de functie moet teruggeven voor willekeurige waarden van het juiste gegevenstype die als argument aan de functie doorgegeven worden. Het is de bedoeling dat de functie niet enkel correct werkt voor de opgegeven voorbeelden, maar ook voor andere waarden van de argumenten. Implementeer hiervoor de nodige Python instructies in de body van elk van de functies, zodat de functies de doctest doorstaan. Voeg ook een beknopte omschrijving van de werking toe aan de docstring van elke functie.
def enkelletters(s):
"""
>>> enkelletters('wat?')
'wat'
>>> enkelletters('"nu!"')
'nu'
>>> enkelletters('?+="woord!,@$()"')
'woord'
"""
def dubbelkoppel(s):
"""
>>> dubbelkoppel('gala--avond')
True
>>> dubbelkoppel('meerdere')
False
>>> dubbelkoppel('schepsel')
False
>>> dubbelkoppel('doe-het--zelver')
True
>>> dubbelkoppel('yo---yo')
False
"""
def woordenlijst(s):
"""
>>> woordenlijst('Wat was was, eer was was was?')
['wat', 'was', 'was', 'eer', 'was', 'was', 'was']
>>> woordenlijst('Als apen apen na-apen, apen apen apen na.')
['als', 'apen', 'apen', 'naapen', 'apen', 'apen', 'apen', 'na']
>>> woordenlijst('Een niet--machine niet, maar een naai-machine niet.')
['een', 'niet', 'machine', 'niet', 'maar', 'een', 'naaimachine', 'niet']
"""
def aantalwoorden(s, l):
"""
>>> aantalwoorden('wat', ['wat', 'was', 'was', 'eer', 'was', 'was', 'was'])
['wat', 1]
>>> aantalwoorden('was', ['wat', 'was', 'was', 'eer', 'was', 'was', 'was'])
['was', 5]
>>> aantalwoorden('eer', ['wat', 'was', 'was', 'eer', 'was', 'was', 'was'])
['eer', 1]
>>> aantalwoorden('is', ['wat', 'was', 'was', 'eer', 'was', 'was', 'was'])
['is', 0]
"""
def uniekewoorden(l):
"""
>>> uniekewoorden(['Wat', 'was', 'was', 'eer', 'was', 'was', 'was'])
['eer', 'was', 'wat']
>>> uniekewoorden(['Als', 'apen', 'naapen', 'apen', 'apen', 'apen', 'na'])
['als', 'apen', 'na', 'naapen']
"""
def langstewoord(l):
"""
>>> langstewoord(['appel', 'peer', 'mango'])
5
>>> langstewoord(['ik', 'ben', 'de', 'peulschil'])
9
>>> langstewoord(['foo', 'supercalifragilisticexpialidocious', 'bar'])
34
"""
if __name__ == '__main__':
import doctest
doctest.testmod()