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.
Dazu müsst ihr zunächst euer Modul und das Unittest-Modul importieren:
1import unittest 2class TestArithmetic(unittest.TestCase):
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
Damit die Unittests auch in andere Module importiert werden können, solltet ihr die folgenden Zeilen hinzufügen:
23if __name__ == "__main__": 24 unittest.main()
Schließlich können alle Tests in
test_arithmetic.pyausgefü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
Siehe auch
Beispiel: SQLite-Datenbank testen¶
Zum Testen, ob die Datenbank
library.dbmitcreate_db.pyangelegt wurde, importieren wir neben sqlite3 und unittest auch nochcreate_db.pyund os:1import os 2import sqlite3 3import unittest 4 5import create_db
Anschließend definieren wir zunächst eine Testklasse
TestCreateDB:8class TestCreateDB(unittest.TestCase):
In ihr definieren wir dann die Testmethode
test_db_exists, in der wir mitassertdie Annahme treffen, dass die Datei in os.path existiert:9 def test_db_exists(self): 10 assert os.path.exists("library.db")
Nun überprüfen wir auch noch, ob die Tabelle
booksangelegt wurde. Hierfür versuchen wir, die Tabelle erneut anzulegen und erwarten mitassertRaises, dasssqlitemit einemOperationalErrorbeendet wird:12 def test_table_exists(self): 13 with self.assertRaises(sqlite3.OperationalError): 14 create_db.cursor.execute("CREATE TABLE books(title text)")
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.