====== Unit Tests ======
Python bietet mit seinem Standard-Modul [[https://docs.python.org/3/library/unittest.html|unittest]] einen standardisierten UnitTest-Framework an. Dabei werden die Testmethoden der Klasse [[https://docs.python.org/3/library/unittest.html#unittest.TestCase|unittest.TestCase]] hinzugefügt und können darüber hinaus einer [[https://docs.python.org/3/library/unittest.html#unittest.TestSuite|unittest.TestSuite]] zugeordnet werden.
Mit weiteren Tools wie [[https://nose.readthedocs.io/en/latest/man.html|nosetest]], [[https://docs.nose2.io/en/latest/|nose2]] und [[https://docs.pytest.org/en/stable/|pytest]] können die Standard UnitTests ausgeführt werden und bieten -- je nach Framework -- zusätzliche Möglichkeiten an. So bieten nosetest und nose2 die Möglichkeit dem Test Attribute zuzuweisen, die später bei der Ausführung zum Filtern von relevanten UnitTests Verwendung findet. Die Stärke von pytest besteht zum einen darin, nicht auf die implementierten ''self.assert*''-Funktionen des Standard-Frameworks angewiesen zu sein. Auch die Handhabung von [[#Fixtures]] ist in pytest anders geregelt. Zum anderen bietet pytest eine reichhaltige Infrastruktur an Plugins die vieles unterstützen.
Allen weiteren Frameworks gemeinsam ist, sind Test erst mal mit den spezifischen Eigenheiten erweitert, lassen sie sich nur schwer auf einen Standard-UnitTest oder in das Format eines der anderen Frameworks umstellen.
^ ^ unittest.TestCase ^^ nosetest ^^ nose2 ^^ py.test ^^
| Framework unterstützt von | spyder, VS Code || || spyder || spyder, VS Code ||
| [[#Einzelne Testfunktionen|Testfunktionen]]\\ (Einzelne Funktionen) | --- | --- | @with_setup() | @with_setup() | @with_setup() | @with_teardown() | :?: | :?: |
| [[#Ebene der Testmethode|Testmethode]]\\ (Methode der Klasse) | **setUp()** | **tearDown()** | **setUp()** | **tearDown()** | **setUp()** | **tearDown()** | * | * |
| [[#Ebene der Testklasse|Testklasse]]\\ (Klassenmethode der Klasse) | **setUpClass()** | **tearDownClass()** | **setUpClass()** | **tearDownClass()** | **setUpClass()** | **tearDownClass()** | * | * |
| ::: | ::: | ::: | setupClass() | teardownClass() | ::: | ::: | ::: | ::: |
| ::: | ::: | ::: | setup_class() | teardown_class() | ::: | ::: | setup_class() | teardown_class() |
| ::: | ::: | ::: | setupAll() | teardownAll() | ::: | ::: | ::: | ::: |
| ::: | ::: | ::: | setUpAll() | tearDownAll() | ::: | ::: | ::: | ::: |
| [[#Ebene der Testmodule|Modul]] (Datei)\\ (Funktion) | **setUpModule()** | **tearDownModule()** | **setUpModule()** | **tearDownModule()** | **setUpModule()** | **tearDownModule()** | * | * |
| ::: | ::: | ::: | setup_module() | teardown_module() | ::: | ::: | setup_module() | teardown_module() |
| ::: | ::: | ::: | setUp() | tearDown() | ::: | ::: | ::: | ::: |
| ::: | ::: | ::: | setup() | teardown() | ::: | ::: | ::: | ::: |
| Package (Verzeichnis)\\ (Funktion in %%__init__.py%%) | --- | --- | setUpPackage() | tearDownPackage() | --- | --- | * | * |
| ::: | ::: | ::: | setup_package() | teardown_package() | ::: | ::: | ::: | ::: |
| ::: | ::: | ::: | setUp() | tearDown() | ::: | ::: | ::: | ::: |
| ::: | ::: | ::: | setup() | teardown() | ::: | ::: | ::: | ::: |
| [[#nose2 Layer-System|Layer-System]]\\ (separate Klasse) | --- | --- | --- | --- | **setUp()** | **tearDown()** | --- | --- |
===== Fixtures =====
* **Statische Analyse** mit ''pylint''. * **Dynamisch Analyse** mit ''unittest''.\\ Ziel beim testen: * Prüfen auf Annahme ist ''True''. * **Test Checkliste:**\\ Auf was sollen ''Unit Tests'' ausgelegt sein. * **Existence** * Classes * Methods * functions * UI elements * assets * **Content** * data types * input values * ideal * accidental * boundaries * mathematically wrong * malicious Mariya Sha, [[https://www.youtube.com/watch?v=EqJWhlC1H6k&t=14s|Testing GUI Apps - What to test? How to test it? Mini Coding Course for Beginners]]