Je zou simpelweg de ingebouwde assert functie in Python kunnen gebruiken om testen te schrijven zoals hieronder is weergegeven. Je kan de testfile dan runnen met python3 calculator_test.py en wanneer een assert niet klopt zal je een AssertionError krijgen.
Dit geeft echter niet zo een mooie output zoals we in Java met Junit hebben gezien en Python komt standaard met een testmodule genaamd unittest. We kunnen onze testfile dan uitvoeren met python3 -m unittest calculator_test.py. Unittest beschouwd onze functie echter nog niet als een test, hiervoor moeten we een aantal dingen wijzigen aan onze testfile:
Een testklasse aanmaken genaamd die erft van de klasse unittest.TestCase: TestCalculator(unittest.TestCase)
De testen als klasse methodes definiƫren
De methoden moeten beginnen met test_
Je moet asserten met self.assert... (self verwijst hierbij naar de klasse zelf)
De main methode van unittest oproepen: unittest.main()
importunittestfromcalculatorimportdivideclassTestCalculator(unittest.TestCase):deftest_gegevenTeller2Noemer1_wanneerDivide_danResult2(self):result=divide(2,1)self.assertEqual(result,1)# Let op: 2/1 = 2, dus deze test zal falen!if__name__=="__main__":unittest.main()
Nu krijgen we bij het runnen van deze testfile een mooiere output:
arne@LT3210121:~/ses/tddpythondemo/src$ python3 -m unittest calculator_test.py
.
----------------------------------------------------------------------
Ran 1test in 0.000s
OK
We kunnen onze testfile nu uitbreiden net zoals we dat in Java gedaan hebben:
Er bestaan ook nog andere modules om testen uit te voeren in Python. Een zeer populaire module is Pytest. Deze module biedt onder andere een iets mooiere output met groene en rode highlights voor respectievelijk geslaagde en gefaalde testen.
Setting up VSCode for Python testing
Je kan de built-in VSCode tool gebruiken voor debugging (gecombineerd met de juiste extensies) om een mooie Gui interface te hebben voor de testen. Hiervoor klik je op onderstaande view panel en configureer je het juiste Testing framework, de plaats waar VSCode moet zoeken naar de test files en hoe de test files noemen.
Test suite for VSCode
Nadat je alles correct geconfigureerd hebt zouden je testen er als volgt moeten uitzien:
Voorbeeld testoutput Python
Integration tests
Net zoals in Java kunnen we Mocks hiervoor gebruiken om Test Doubles aan te maken. Gelukkig is ‘mocken’ een functionaliteit die rechtstreeks in unittest is ingebouwd. De doubler.py-file en doubler_test.py-file analoog aan het voorbeeld in integration testen in Java:
doubler.py: We geven nu een referentie naar de functie mee als parameter om te voldoen aan het principe van Dependency Injection.
importunittestfromunittest.mockimportpatchfromdoublerimportdouble_calculatorclassTestCalculator(unittest.TestCase):@patch("doubler.divide")# Mock de geĆÆmporteerde `divide` functie in `doubler.py`deftest_gegevenOperationDivideX2Y1_wanneerDoubleCalculator_danResultIs4(self,mock_divide):# Arrange# De mock werd meegegeven als parameter en je stelt nu de return value inmock_divide.return_value=2.0# Actresult=double_calculator(mock_divide,2,1)# Assertself.assertEqual(result,4.0)# Verifieer dat `divide` werd aangeroepen met (2, 1)mock_divide.assert_called_once_with(2,1)if__name__=="__main__":unittest.main()
Onderstaande Python file bevat een aantal functies die getest worden met een testfile. Er zijn echter een heel deel testen die nog falen. Verbeter nu de python functies zodat alle testen slagen: