Unittest

unittest unterstützt euch bei der Testautomatisierung mit gemeinsam genutztem Setup- und TearDown-Code sowie der Aggregation und Unabhängigkeit von Tests.

Hierfür liefert es die folgenden Testkonzepte:

Test Case (Testfall)

testet eine einzelnes Szenario.

Test Fixture (Prüfvorrichtung)

ist eine konsistente Testumgebung.

Test Suite

ist eine Sammlung mehrerer Test Cases.

Test Runner

durchläuft eine Test Suite und stellt die Ergebnisse dar.

Beispiel

Angenommen, ihr habt im Modul test_arithmetic.py die folgende Methode zum Hinzufügen implementiert:

1def add(x, y):
2    """
3    >>> add(7, 6)
4    13
5    """
6    return x + y

… dann könnt ihr diese Methode mit einem Unittest testen.

  1. Dazu müsst ihr zunächst euer Modul und das Unittest-Modul importieren:

    1import unittest
    2class TestArithmetic(unittest.TestCase):
    
  2. Anschließend könnt ihr eine Testmethode schreiben, die eure Additionsmethode veranschaulicht:

    6class TestArithmetic(unittest.TestCase):
    7    def test_addition(self):
    8        self.assertEqual(arithmetic.add(7, 6), 13)
    9
    
  3. Damit die Unittests auch in andere Module importiert werden können, solltet ihr die folgenden Zeilen hinzufügen:

    23if __name__ == "__main__":
    24    unittest.main()
    
  4. Schließlich können alle Tests in test_arithmetic.py ausgeführt werden:

    $ python test_arithmetic.py
    ....
    ----------------------------------------------------------------------
    Ran 4 tests in 0.000s
    
    OK
    
    C:> python test_arithmetic.py
    ....
    ----------------------------------------------------------------------
    Ran 4 tests in 0.000s
    
    OK
    

    … oder etwas ausführlicher:

    $ python test_arithmetic.py -v
    test_addition (__main__.TestArithmetic) ... ok
    test_division (__main__.TestArithmetic) ... ok
    test_multiplication (__main__.TestArithmetic) ... ok
    test_subtraction (__main__.TestArithmetic) ... ok
    
    ----------------------------------------------------------------------
    Ran 4 tests in 0.000s
    
    OK
    
    C:> python test_arithmetic.py -v
    test_addition (__main__.TestArithmetic) ... ok
    test_division (__main__.TestArithmetic) ... ok
    test_multiplication (__main__.TestArithmetic) ... ok
    test_subtraction (__main__.TestArithmetic) ... ok
    
    ----------------------------------------------------------------------
    Ran 4 tests in 0.000s
    
    OK
    

Beispiel: SQLite-Datenbank testen

  1. Zum Testen, ob die Datenbank library.db mit create_db.py angelegt wurde, importieren wir neben sqlite3 und unittest auch noch create_db.py und os:

    1import os
    2import sqlite3
    3import unittest
    4
    5import create_db
    
  2. Anschließend definieren wir zunächst eine Testklasse TestCreateDB:

    8class TestCreateDB(unittest.TestCase):
    
  3. In ihr definieren wir dann die Testmethode test_db_exists, in der wir mit assert die Annahme treffen, dass die Datei in os.path existiert:

     9    def test_db_exists(self):
    10        assert os.path.exists("library.db")
    
  4. Nun überprüfen wir auch noch, ob die Tabelle books angelegt wurde. Hierfür versuchen wir, die Tabelle erneut anzulegen und erwarten mit assertRaises, dass sqlite mit einem OperationalError beendet wird:

    12    def test_table_exists(self):
    13        with self.assertRaises(sqlite3.OperationalError):
    14            create_db.cursor.execute("CREATE TABLE books(title text)")
    
  5. Weitere Tests wollen wir nicht an einer Datenbank im Dateisystem durchführen sondern in einer SQLite-Datenbank im Arbeitsspeicher:

    17class TestCommands(unittest.TestCase):
    18    def setUp(self):
    19        self.conn = sqlite3.connect(":memory:")
    20        self.cursor = self.conn.cursor()
    

Siehe auch

Weitere Beispiele zum Testen eurer SQLite-Datenbankfunktionen findet ihr in der SQLite Testsuite test_sqlite3.