Testing
Testen in Python
Durch Tests stellen wir sicher, dass unser Code wie erwartet funktioniert, und helfen dabei, Fehler frühzeitig zu erkennen.
Testdatei wird verwendet, bevor die Hauptdatei für die Welt freigegeben wird
Code-Qualitätstools
- pylint → prüft Code auf Fehler und setzt Codierungsstandards durch.
- pyflakes → erkennt Fehler, ohne den Stil zu erzwingen.
- autopep8 → formatiert Code automatisch gemäß den PEP8-Richtlinien.
Unit-Test mit „unittest“.
Python verfügt über ein integriertes Modul namens „unittest“ zum Schreiben und Ausführen von Tests.
Grundeinrichtung
import unittest
class TestExercise(unittest.TestCase):
def test_input(self):
pass
if __name__ == '__main__':
unittest.main()
Testen einer Funktion
Beispiel: Testen einer Schätzfunktion
Hauptdatei
import random
print('GUESS A NUMBER')
def run_guess(guess, answer):
if 0 < guess < 11:
if guess is answer:
print('You are a genius')
return True
else:
print('try again')
return False
if __name__ == '__main__':
answer = random.randint(1, 10)
print(answer)
while True:
try:
guess = int(input('guess a numbers 1-10: '))
if run_guess(guess, answer):
break
except ValueError:
print('you did something wrong')
continue
```**Testdatei**```python
import unittest
import Exercise
class TestExercise(unittest.TestCase):
def test_input(self):
result = Exercise.run_guess(5, 5)
self.assertTrue(result)
# this test case when the guess is correct, which is 5, and the expected result is True
def test_input2(self):
result = Exercise.run_guess(0, 5)
self.assertFalse(result)
# this test case is testing the case when the guess is 0, which is not a valid guess, and the expected result is False
def test_input3(self):
result = Exercise.run_guess(11, 5)
self.assertFalse(result)
def test_input4(self):
result = Exercise.run_guess(5, '5')
self.assertFalse(result)
if __name__ == '__main__':
unittest.main(verbosity=2)
Beispiel: Testen einer Funktion
Hauptdatei
def do_stuff(num=0):
try:
if num:
return int(num) + 5
else:
raise ValueError("No parameter provided")
except ValueError as err:
return err
Testdatei
import unittest
import main
class TestMain(unittest.TestCase):
def setUp(self):
print('About to run a function')
def test_do_stuff(self):
'''Hiii'''
test_parameter = 1
result = main.do_stuff(test_parameter)
self.assertEqual(result, 6)
def test_do_stuff2(self):
test_parameter = 'woahh'
result = main.do_stuff(test_parameter)
self.assertIsInstance(result, ValueError)
def test_do_stuff3(self):
test_parameter = None
result = main.do_stuff(test_parameter)
self.assertEqual(str(result), 'No parameter provided')
def tearDown(self):
print('Cleaning up...') #setup and teardown are used to run code before and after each test case.
if __name__ == '__main__':
unittest.main(verbosity=2)
-
setUp() → wird vor jedem Testfall ausgeführt.
-
tearDown() → wird nach jedem Testfall ausgeführt.
-
verbosity=2 → zeigt detaillierte Testergebnisse.
Führen Sie Tests durch mit:
python -m unittest test_main.py
Unit-Test-Details verstehen
- Das Argument „verbosity=2“ in „unittest.main()“ wird verwendet, um den Namen jedes Tests und sein Ergebnis („ok“ oder „fail“) anzuzeigen.
- Testfälle werden innerhalb der Klasse „TestMain“ definiert und jeder Testfall muss als Methode geschrieben werden, die mit dem Wort „Test“ beginnt.
- Sie können Kommentare oder Dokumentzeichenfolgen zu Testmethoden hinzufügen, um Folgendes zu erklären:
- Was der Testfall prüft.
- Wie das erwartete Ergebnis aussehen sollte.
Warum Tests wichtig sind
- Tests dienen dazu, unseren Code möglichst gründlich zu überprüfen.
– Selbst bei einer einfachen Funktion hilft das Schreiben mehrerer Testfälle dabei, kleine Probleme aufzudecken, die andernfalls möglicherweise unbemerkt bleiben würden. - Tests erkennen kleine Probleme frühzeitig und verbessern die Codezuverlässigkeit und Qualität unseres Codes.