Zum Inhalt

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.