unittest — Unit testing framework¶
Quellcode: Lib/unittest/__init__.py
(Wenn Sie mit den grundlegenden Konzepten des Testens bereits vertraut sind, möchten Sie vielleicht zu der Liste der Assertionsmethoden springen.)
Das unittest Unit-Testing-Framework wurde ursprünglich von JUnit inspiriert und hat einen ähnlichen Charakter wie die wichtigsten Unit-Testing-Frameworks in anderen Sprachen. Es unterstützt Testautomatisierung, das Teilen von Setup- und Shutdown-Code für Tests, die Aggregation von Tests in Sammlungen und die Unabhängigkeit der Tests vom Reporting-Framework.
Um dies zu erreichen, unterstützt unittest einige wichtige Konzepte auf objektorientierte Weise:
- Test-Fixture
Ein Test-Fixture repräsentiert die Vorbereitung, die für die Durchführung eines oder mehrerer Tests erforderlich ist, sowie alle damit verbundenen Aufräumarbeiten. Dies kann beispielsweise die Erstellung temporärer oder Proxy-Datenbanken, Verzeichnisse oder den Start eines Serverprozesses umfassen.
- Testfall
Ein Testfall ist die einzelne Einheit des Testens. Er prüft auf eine spezifische Antwort auf einen bestimmten Satz von Eingaben.
unitteststellt eine Basisklasse,TestCase, bereit, die zur Erstellung neuer Testfälle verwendet werden kann.- Test-Suite
Eine Test-Suite ist eine Sammlung von Testfällen, Test-Suiten oder beidem. Sie wird verwendet, um Tests zu aggregieren, die zusammen ausgeführt werden sollen.
- Test-Runner
Ein Test-Runner ist eine Komponente, die die Ausführung von Tests orchestriert und dem Benutzer das Ergebnis liefert. Der Runner kann eine grafische Oberfläche, eine textbasierte Oberfläche verwenden oder einen speziellen Wert zurückgeben, um die Ergebnisse der Testausführung anzuzeigen.
Siehe auch
- Modul
doctest Ein weiteres testunterstützendes Modul mit einem ganz anderen Charakter.
- Simple Smalltalk Testing: With Patterns
Kent Becks ursprünglicher Artikel über Test-Frameworks, der sich auf das Muster stützt, das von
unittestgeteilt wird.- pytest
Drittanbieter-Unittest-Framework mit einer leichteren Syntax für das Schreiben von Tests. Zum Beispiel:
assert func(10) == 42.- Die Python Testing Tools Taxonomy
Eine umfangreiche Liste von Python-Testwerkzeugen, einschließlich funktionaler Test-Frameworks und Mock-Objekt-Bibliotheken.
- Testing in Python Mailing List
Eine Interessengruppe für die Diskussion von Tests und Testwerkzeugen in Python.
Das Skript Tools/unittestgui/unittestgui.py in der Python-Quellcodeverteilung ist ein GUI-Tool für die Testfindung und -ausführung. Dies ist hauptsächlich für den einfachen Einstieg für Neulinge im Unit-Testing gedacht. Für Produktionsumgebungen wird empfohlen, Tests über ein Continuous-Integration-System wie Buildbot, Jenkins, GitHub Actions oder AppVeyor laufen zu lassen.
Einfaches Beispiel¶
Das Modul unittest bietet einen reichhaltigen Satz an Werkzeugen zum Erstellen und Ausführen von Tests. Dieser Abschnitt zeigt, dass eine kleine Teilmenge der Werkzeuge ausreicht, um die Bedürfnisse der meisten Benutzer zu erfüllen.
Hier ist ein kurzes Skript, um drei String-Methoden zu testen
import unittest
class TestStringMethods(unittest.TestCase):
def test_upper(self):
self.assertEqual('foo'.upper(), 'FOO')
def test_isupper(self):
self.assertTrue('FOO'.isupper())
self.assertFalse('Foo'.isupper())
def test_split(self):
s = 'hello world'
self.assertEqual(s.split(), ['hello', 'world'])
# check that s.split fails when the separator is not a string
with self.assertRaises(TypeError):
s.split(2)
if __name__ == '__main__':
unittest.main()
Ein Testfall wird durch Unterklasse von unittest.TestCase erstellt. Die drei einzelnen Tests werden mit Methoden definiert, deren Namen mit den Buchstaben test beginnen. Diese Namenskonvention informiert den Test-Runner darüber, welche Methoden Tests darstellen.
Der Kern jedes Tests ist ein Aufruf von assertEqual(), um ein erwartetes Ergebnis zu überprüfen; assertTrue() oder assertFalse(), um eine Bedingung zu überprüfen; oder assertRaises(), um zu überprüfen, ob eine bestimmte Ausnahme ausgelöst wird. Diese Methoden werden anstelle der assert-Anweisung verwendet, damit der Test-Runner alle Testergebnisse sammeln und einen Bericht erstellen kann.
Die Methoden setUp() und tearDown() ermöglichen es Ihnen, Anweisungen zu definieren, die vor und nach jeder Testmethode ausgeführt werden. Sie werden im Abschnitt Organisation des Testcodes detaillierter behandelt.
Der letzte Block zeigt eine einfache Möglichkeit, die Tests auszuführen. unittest.main() bietet eine Kommandozeilenschnittstelle zum Testskript. Wenn es von der Kommandozeile aus ausgeführt wird, erzeugt das obige Skript eine Ausgabe, die wie folgt aussieht:
...
----------------------------------------------------------------------
Ran 3 tests in 0.000s
OK
Wenn Sie die Option -v an Ihr Testskript übergeben, wird unittest.main() angewiesen, eine höhere Detailstufe zu aktivieren und die folgende Ausgabe zu erzeugen:
test_isupper (__main__.TestStringMethods.test_isupper) ... ok
test_split (__main__.TestStringMethods.test_split) ... ok
test_upper (__main__.TestStringMethods.test_upper) ... ok
----------------------------------------------------------------------
Ran 3 tests in 0.001s
OK
Die obigen Beispiele zeigen die am häufigsten verwendeten Funktionen von unittest, die für viele tägliche Testanforderungen ausreichen. Der Rest der Dokumentation untersucht den vollständigen Funktionsumfang von Grund auf.
Geändert in Version 3.11: Das Verhalten bei der Rückgabe eines Wertes aus einer Testmethode (außer dem Standardwert None) ist jetzt veraltet.
Befehlszeilenschnittstelle¶
Das `unittest`-Modul kann von der Kommandozeile aus verwendet werden, um Tests aus Modulen, Klassen oder sogar einzelnen Testmethoden auszuführen.
python -m unittest test_module1 test_module2
python -m unittest test_module.TestClass
python -m unittest test_module.TestClass.test_method
Sie können eine Liste mit beliebigen Kombinationen von Modulnamen sowie vollqualifizierten Klassen- oder Methodennamen übergeben.
Testmodule können auch nach Dateipfad angegeben werden.
python -m unittest tests/test_something.py
Dadurch können Sie die Shell-Dateinamenvervollständigung zur Angabe des Testmoduls verwenden. Die angegebene Datei muss immer noch als Modul importierbar sein. Der Pfad wird in einen Modulnamen umgewandelt, indem '.py' entfernt und Pfadtrennzeichen durch '.' ersetzt werden. Wenn Sie eine Testdatei ausführen möchten, die nicht als Modul importierbar ist, sollten Sie stattdessen die Datei direkt ausführen.
Sie können Tests mit mehr Details (höherer Detailgrad) ausführen, indem Sie das Flag -v übergeben.
python -m unittest -v test_module
Wenn Test Discovery ohne Argumente ausgeführt wird.
python -m unittest
Für eine Liste aller Kommandozeilenoptionen
python -m unittest -h
Geändert in Version 3.2: In früheren Versionen war es nur möglich, einzelne Testmethoden und keine Module oder Klassen auszuführen.
Hinzugefügt in Version 3.14: Die Ausgabe ist standardmäßig farbig und kann über Umgebungsvariablen gesteuert werden.
Kommandozeilenoptionen¶
unittest unterstützt diese Kommandozeilenoptionen
- -b, --buffer¶
Die Standardausgabe und der Standardfehlerausgabe werden während des Testlaufs gepuffert. Die Ausgabe während eines erfolgreichen Tests wird verworfen. Die Ausgabe wird bei fehlgeschlagenen oder fehlerhaften Tests normal ausgegeben und den Fehlermeldungen hinzugefügt.
- -c, --catch¶
Steuerung-C während des Testlaufs wartet, bis der aktuelle Test beendet ist, und meldet dann alle bisherigen Ergebnisse. Ein zweites Steuerung-C löst die normale
KeyboardInterrupt-Ausnahme aus.Siehe Signal Handling für die Funktionen, die diese Funktionalität bereitstellen.
- -f, --failfast¶
Beenden Sie den Testlauf beim ersten Fehler oder Fehlschlag.
- -k¶
Führen Sie nur Testmethoden und -klassen aus, die dem Muster oder Teilstring entsprechen. Diese Option kann mehrmals verwendet werden, in diesem Fall werden alle Testfälle einbezogen, die einem der angegebenen Muster entsprechen.
Muster, die ein Platzhaltersymbol (
*) enthalten, werden anhand des Testnamens mitfnmatch.fnmatchcase()verglichen; andernfalls wird ein einfacher exakter Teilstring-Vergleich verwendet.Muster werden mit dem vollqualifizierten Namen der Testmethode verglichen, wie er vom Testlader importiert wird.
Zum Beispiel passt
-k foozufoo_tests.SomeTest.test_something,bar_tests.SomeTest.test_foo, aber nicht zubar_tests.FooTest.test_something.
- --locals¶
Lokale Variablen in Tracebacks anzeigen.
- --durations N¶
Die N langsamsten Testfälle anzeigen (N=0 für alle).
Hinzugefügt in Version 3.2: Die Kommandozeilenoptionen -b, -c und -f wurden hinzugefügt.
Hinzugefügt in Version 3.5: Die Kommandozeilenoption --locals.
Hinzugefügt in Version 3.7: Die Kommandozeilenoption -k.
Hinzugefügt in Version 3.12: Die Kommandozeilenoption --durations.
Die Kommandozeile kann auch für die Testfindung verwendet werden, um alle Tests in einem Projekt oder nur eine Teilmenge auszuführen.
Test-Discovery¶
Hinzugefügt in Version 3.2.
Unittest unterstützt einfache Testfindung. Um mit der Testfindung kompatibel zu sein, müssen alle Testdateien Module oder Pakete sein, die vom Top-Level-Verzeichnis des Projekts importierbar sind (was bedeutet, dass ihre Dateinamen gültige Identifikatoren sein müssen).
Die Testfindung ist in TestLoader.discover() implementiert, kann aber auch von der Kommandozeile aus verwendet werden. Die grundlegende Verwendung über die Kommandozeile ist:
cd project_directory
python -m unittest discover
Hinweis
Als Abkürzung ist python -m unittest gleichbedeutend mit python -m unittest discover. Wenn Sie Argumente an die Testfindung übergeben möchten, muss der Unterbefehl discover explizit verwendet werden.
Der Unterbefehl discover hat die folgenden Optionen:
- -v, --verbose¶
Ausführliche Ausgabe
- -s, --start-directory directory¶
Verzeichnis, ab dem die Suche beginnen soll (
.ist Standard)
- -p, --pattern pattern¶
Muster, nach dem Testdateien gesucht werden sollen (
test*.pyist Standard)
- -t, --top-level-directory directory¶
Top-Level-Verzeichnis des Projekts (Standard ist das Startverzeichnis)
Die Optionen -s, -p und -t können in dieser Reihenfolge als Positionsargumente übergeben werden. Die folgenden beiden Kommandozeilenaufrufe sind äquivalent:
python -m unittest discover -s project_directory -p "*_test.py"
python -m unittest discover project_directory "*_test.py"
Neben einem Pfad ist es auch möglich, einen Paketnamen anzugeben, z. B. myproject.subpackage.test, als Startverzeichnis. Der von Ihnen angegebene Paketname wird dann importiert und sein Speicherort im Dateisystem wird als Startverzeichnis verwendet.
Vorsicht
Test-Discovery lädt Tests durch Importieren. Sobald Test-Discovery alle Testdateien aus dem von Ihnen angegebenen Startverzeichnis gefunden hat, wandelt es die Pfade in Paketnamen zum Importieren um. Zum Beispiel wird foo/bar/baz.py als foo.bar.baz importiert.
Wenn Sie ein Paket global installiert haben und versuchen, Test-Discovery für eine andere Kopie des Pakets durchzuführen, kann der Import *von der falschen Stelle* erfolgen. Wenn dies geschieht, wird Test-Discovery Sie warnen und beenden.
Wenn Sie das Startverzeichnis als Paketnamen anstelle eines Verzeichnispfads angeben, geht Discover davon aus, dass der Ort, von dem es importiert, der von Ihnen beabsichtigte Ort ist, sodass Sie keine Warnung erhalten.
Testmodule und -pakete können das Laden und die Entdeckung von Tests über das load_tests-Protokoll anpassen.
Geändert in Version 3.4: Test-Discovery unterstützt Namensraum-Pakete.
Geändert in Version 3.11: Test-Discovery hat die Unterstützung für Namensraum-Pakete eingestellt. Sie war seit Python 3.7 fehlerhaft. Das Startverzeichnis und seine Unterverzeichnisse, die Tests enthalten, müssen reguläre Pakete sein, die eine Datei __init__.py enthalten.
Wenn das Startverzeichnis der Punkt-Notation des Pakets entspricht, können die übergeordneten Pakete Namensraum-Pakete sein.
Geändert in Version 3.14: Test-Discovery unterstützt wieder Namensraum-Pakete als Startverzeichnis. Um Verzeichnisse zu vermeiden, die nichts mit Python zu tun haben, werden Tests nicht in Unterverzeichnissen gesucht, die keine __init__.py-Datei enthalten.
Organisation des Testcodes¶
Die grundlegenden Bausteine des Unit-Testings sind Testfälle – einzelne Szenarien, die vorbereitet und auf Korrektheit geprüft werden müssen. In unittest werden Testfälle durch unittest.TestCase-Instanzen repräsentiert. Um Ihre eigenen Testfälle zu erstellen, müssen Sie Unterklassen von TestCase schreiben oder FunctionTestCase verwenden.
Der Testcode einer TestCase-Instanz sollte vollständig in sich geschlossen sein, so dass er entweder isoliert oder in beliebiger Kombination mit einer beliebigen Anzahl anderer Testfälle ausgeführt werden kann.
Die einfachste TestCase-Unterklasse implementiert einfach eine Testmethode (d. h. eine Methode, deren Name mit test beginnt), um spezifischen Testcode auszuführen.
import unittest
class DefaultWidgetSizeTestCase(unittest.TestCase):
def test_default_widget_size(self):
widget = Widget('The widget')
self.assertEqual(widget.size(), (50, 50))
Beachten Sie, dass wir zum Testen von etwas eine der assert*-Methoden verwenden, die von der Basisklasse TestCase bereitgestellt werden. Wenn der Test fehlschlägt, wird eine Ausnahme mit einer erklärenden Meldung ausgelöst, und unittest identifiziert den Testfall als Fehler. Alle anderen Ausnahmen werden als Fehler behandelt.
Tests können zahlreich sein und ihre Vorbereitung kann repetitiv sein. Glücklicherweise können wir Vorbereitungscode auslagern, indem wir eine Methode namens setUp() implementieren, die das Test-Framework automatisch für jede von uns ausgeführte Testmethode aufruft.
import unittest
class WidgetTestCase(unittest.TestCase):
def setUp(self):
self.widget = Widget('The widget')
def test_default_widget_size(self):
self.assertEqual(self.widget.size(), (50,50),
'incorrect default size')
def test_widget_resize(self):
self.widget.resize(100,150)
self.assertEqual(self.widget.size(), (100,150),
'wrong size after resize')
Hinweis
Die Reihenfolge, in der die verschiedenen Tests ausgeführt werden, wird durch Sortieren der Testmethodennamen in Bezug auf die eingebaute Sortierung für Strings bestimmt.
Wenn die Methode setUp() während der Ausführung des Tests eine Ausnahme auslöst, betrachtet das Framework den Test als fehlerhaft, und die Testmethode wird nicht ausgeführt.
Ebenso können wir eine Methode tearDown() bereitstellen, die nach der Ausführung der Testmethode aufräumt.
import unittest
class WidgetTestCase(unittest.TestCase):
def setUp(self):
self.widget = Widget('The widget')
def tearDown(self):
self.widget.dispose()
Wenn setUp() erfolgreich war, wird tearDown() ausgeführt, unabhängig davon, ob die Testmethode erfolgreich war oder nicht.
Eine solche Arbeitsumgebung für den Testcode wird als Test-Fixture bezeichnet. Eine neue TestCase-Instanz wird als eindeutiges Test-Fixture erstellt, das zur Ausführung jeder einzelnen Testmethode verwendet wird. Daher werden setUp(), tearDown() und __init__() einmal pro Test aufgerufen.
Es wird empfohlen, TestCase-Implementierungen zu verwenden, um Tests nach den getesteten Funktionen zu gruppieren. unittest bietet einen Mechanismus dafür: die Test-Suite, repräsentiert durch die Klasse unittest’s TestSuite. In den meisten Fällen erledigt ein Aufruf von unittest.main() das Richtige und sammelt alle Testfälle des Moduls und führt sie aus.
Wenn Sie jedoch die Erstellung Ihrer Test-Suite anpassen möchten, können Sie dies selbst tun:
def suite():
suite = unittest.TestSuite()
suite.addTest(WidgetTestCase('test_default_widget_size'))
suite.addTest(WidgetTestCase('test_widget_resize'))
return suite
if __name__ == '__main__':
runner = unittest.TextTestRunner()
runner.run(suite())
Sie können die Definitionen von Testfällen und Test-Suiten in denselben Modulen wie der Code, den sie testen sollen (wie z. B. widget.py), platzieren, aber es gibt mehrere Vorteile, den Testcode in einem separaten Modul zu platzieren, wie z. B. test_widget.py:
Das Testmodul kann eigenständig von der Kommandozeile aus ausgeführt werden.
Der Testcode kann leichter vom ausgelieferten Code getrennt werden.
Es besteht weniger Versuchung, Testcode zu ändern, um ihn an den Code anzupassen, den er testet, ohne guten Grund.
Testcode sollte viel seltener geändert werden als der Code, den er testet.
Getesteter Code kann einfacher refaktoriert werden.
Tests für in C geschriebene Module müssen ohnehin in separaten Modulen sein, warum also nicht konsistent sein?
Wenn sich die Teststrategie ändert, müssen Sie den Quellcode nicht ändern.
Wiederverwendung von altem Testcode¶
Einige Benutzer werden feststellen, dass sie vorhandenen Testcode haben, den sie gerne aus unittest ausführen möchten, ohne jede alte Testfunktion in eine TestCase-Unterklasse zu konvertieren.
Aus diesem Grund bietet unittest eine Klasse FunctionTestCase. Diese Unterklasse von TestCase kann verwendet werden, um eine vorhandene Testfunktion zu umschließen. Setup- und Teardown-Funktionen können ebenfalls bereitgestellt werden.
Gegeben die folgende Testfunktion:
def testSomething():
something = makeSomething()
assert something.name is not None
# ...
kann eine äquivalente Testfallinstanz wie folgt erstellt werden, mit optionalen Setup- und Teardown-Methoden:
testcase = unittest.FunctionTestCase(testSomething,
setUp=makeSomethingDB,
tearDown=deleteSomethingDB)
Hinweis
Obwohl FunctionTestCase verwendet werden kann, um eine bestehende Testbasis schnell in ein unittest-basiertes System zu konvertieren, wird dieser Ansatz nicht empfohlen. Wenn Sie sich die Zeit nehmen, ordnungsgemäße TestCase-Unterklassen einzurichten, wird dies zukünftige Testrefactorings unendlich erleichtern.
In einigen Fällen wurden die bestehenden Tests möglicherweise mit dem Modul doctest geschrieben. Wenn dies der Fall ist, stellt doctest eine Klasse DocTestSuite bereit, die automatisch unittest.TestSuite-Instanzen aus den vorhandenen doctest-basierten Tests erstellen kann.
Tests überspringen und erwartete Fehler¶
Hinzugefügt in Version 3.1.
Unittest unterstützt das Überspringen einzelner Testmethoden und sogar ganzer Testklassen. Darüber hinaus unterstützt es das Markieren eines Tests als „erwarteter Fehler“, d. h. eines Tests, der fehlerhaft ist und fehlschlagen wird, aber in einem TestResult nicht als Fehler gezählt werden sollte.
Ein Testüberspringen ist einfach eine Frage der Verwendung des skip() Dekorators oder einer seiner bedingten Varianten, des Aufrufs von TestCase.skipTest() innerhalb einer setUp() oder Testmethode oder des direkten Auslösens von SkipTest.
Grundlegendes Überspringen sieht so aus
class MyTestCase(unittest.TestCase):
@unittest.skip("demonstrating skipping")
def test_nothing(self):
self.fail("shouldn't happen")
@unittest.skipIf(mylib.__version__ < (1, 3),
"not supported in this library version")
def test_format(self):
# Tests that work for only a certain version of the library.
pass
@unittest.skipUnless(sys.platform.startswith("win"), "requires Windows")
def test_windows_support(self):
# windows specific testing code
pass
def test_maybe_skipped(self):
if not external_resource_available():
self.skipTest("external resource not available")
# test code that depends on the external resource
pass
Dies ist die Ausgabe des Ausführens des obigen Beispiels im ausführlichen Modus
test_format (__main__.MyTestCase.test_format) ... skipped 'not supported in this library version'
test_nothing (__main__.MyTestCase.test_nothing) ... skipped 'demonstrating skipping'
test_maybe_skipped (__main__.MyTestCase.test_maybe_skipped) ... skipped 'external resource not available'
test_windows_support (__main__.MyTestCase.test_windows_support) ... skipped 'requires Windows'
----------------------------------------------------------------------
Ran 4 tests in 0.005s
OK (skipped=4)
Klassen können wie Methoden übersprungen werden
@unittest.skip("showing class skipping")
class MySkippedTestCase(unittest.TestCase):
def test_not_run(self):
pass
TestCase.setUp() kann den Test ebenfalls überspringen. Dies ist nützlich, wenn eine Ressource, die eingerichtet werden muss, nicht verfügbar ist.
Erwartete Fehler verwenden den expectedFailure() Dekorator.
class ExpectedFailureTestCase(unittest.TestCase):
@unittest.expectedFailure
def test_fail(self):
self.assertEqual(1, 0, "broken")
Es ist einfach, eigene Überspringungsdekoratoren zu erstellen, indem ein Dekorator erstellt wird, der skip() für den Test aufruft, wenn er übersprungen werden soll. Dieser Dekorator überspringt den Test, es sei denn, das übergebene Objekt hat ein bestimmtes Attribut
def skipUnlessHasattr(obj, attr):
if hasattr(obj, attr):
return lambda func: func
return unittest.skip("{!r} doesn't have {!r}".format(obj, attr))
Die folgenden Dekoratoren und Ausnahmen implementieren das Überspringen von Tests und erwartete Fehler
- @unittest.skip(reason)¶
Überspringt den dekorierten Test bedingungslos. reason sollte beschreiben, warum der Test übersprungen wird.
- @unittest.skipIf(condition, reason)¶
Überspringt den dekorierten Test, wenn condition wahr ist.
- @unittest.skipUnless(condition, reason)¶
Überspringt den dekorierten Test, es sei denn, condition ist wahr.
- @unittest.expectedFailure¶
Markiert den Test als erwarteten Fehler oder unerwartetes Ergebnis. Wenn der Test fehlschlägt oder einen Fehler auslöst, wird er als Erfolg gewertet. Wenn der Test erfolgreich ist, wird er als Fehler gewertet.
- exception unittest.SkipTest(reason)¶
Diese Ausnahme wird ausgelöst, um einen Test zu überspringen.
Normalerweise können Sie
TestCase.skipTest()oder einen der Überspringungsdekoratoren verwenden, anstatt diese direkt auszulösen.
Übersprungene Tests werden nicht mit setUp() oder tearDown() ausgeführt. Übersprungene Klassen werden nicht mit setUpClass() oder tearDownClass() ausgeführt. Übersprungene Module werden nicht mit setUpModule() oder tearDownModule() ausgeführt.
Unterscheiden von Testiterationen mithilfe von Subtests¶
Hinzugefügt in Version 3.4.
Wenn es sehr kleine Unterschiede zwischen Ihren Tests gibt, zum Beispiel einige Parameter, ermöglicht unittest Ihnen, diese innerhalb des Körpers einer Testmethode mithilfe des subTest() Kontextmanagers zu unterscheiden.
Zum Beispiel wird der folgende Test
class NumbersTest(unittest.TestCase):
def test_even(self):
"""
Test that numbers between 0 and 5 are all even.
"""
for i in range(0, 6):
with self.subTest(i=i):
self.assertEqual(i % 2, 0)
die folgende Ausgabe erzeugen
======================================================================
FAIL: test_even (__main__.NumbersTest.test_even) (i=1)
Test that numbers between 0 and 5 are all even.
----------------------------------------------------------------------
Traceback (most recent call last):
File "subtests.py", line 11, in test_even
self.assertEqual(i % 2, 0)
^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: 1 != 0
======================================================================
FAIL: test_even (__main__.NumbersTest.test_even) (i=3)
Test that numbers between 0 and 5 are all even.
----------------------------------------------------------------------
Traceback (most recent call last):
File "subtests.py", line 11, in test_even
self.assertEqual(i % 2, 0)
^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: 1 != 0
======================================================================
FAIL: test_even (__main__.NumbersTest.test_even) (i=5)
Test that numbers between 0 and 5 are all even.
----------------------------------------------------------------------
Traceback (most recent call last):
File "subtests.py", line 11, in test_even
self.assertEqual(i % 2, 0)
^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: 1 != 0
Ohne die Verwendung eines Subtests würde die Ausführung nach dem ersten Fehler stoppen, und der Fehler wäre schwerer zu diagnostizieren, da der Wert von i nicht angezeigt würde
======================================================================
FAIL: test_even (__main__.NumbersTest.test_even)
----------------------------------------------------------------------
Traceback (most recent call last):
File "subtests.py", line 32, in test_even
self.assertEqual(i % 2, 0)
AssertionError: 1 != 0
Klassen und Funktionen¶
Dieser Abschnitt beschreibt ausführlich die API von unittest.
Testfälle¶
- class unittest.TestCase(methodName='runTest')¶
Instanzen der
TestCase-Klasse stellen die logischen Testeinheiten imunittest-Universum dar. Diese Klasse ist als Basisklasse gedacht, wobei spezifische Tests von konkreten Unterklassen implementiert werden. Diese Klasse implementiert die Schnittstelle, die vom Testrunner benötigt wird, um die Tests auszuführen, und Methoden, die der Testcode verwenden kann, um verschiedene Arten von Fehlern zu überprüfen und zu melden.Jede Instanz von
TestCaseführt eine einzige Basismethode aus: die Methode mit dem Namen methodName. In den meisten Anwendungen vonTestCasewerden Sie weder den methodName ändern noch die StandardmethoderunTest()neu implementieren.Geändert in Version 3.2:
TestCasekann erfolgreich instanziiert werden, ohne einen methodName anzugeben. Dies erleichtert das Experimentieren mitTestCasevom interaktiven Interpreter aus.TestCase-Instanzen stellen drei Gruppen von Methoden zur Verfügung: eine Gruppe zur Ausführung des Tests, eine weitere, die von der Testimplementierung zur Überprüfung von Bedingungen und Meldung von Fehlern verwendet wird, und einige Abfragemethoden, die das Sammeln von Informationen über den Test selbst ermöglichen.Methoden in der ersten Gruppe (Ausführung des Tests) sind
- setUp()¶
Methode, die aufgerufen wird, um das Test-Fixture vorzubereiten. Diese wird unmittelbar vor dem Aufruf der Testmethode aufgerufen; mit Ausnahme von
AssertionErroroderSkipTestwird jede von dieser Methode ausgelöste Ausnahme als Fehler und nicht als Testfehler betrachtet. Die Standardimplementierung tut nichts.
- tearDown()¶
Methode, die unmittelbar nach dem Aufruf der Testmethode und der Aufzeichnung des Ergebnisses aufgerufen wird. Dies geschieht auch dann, wenn die Testmethode eine Ausnahme ausgelöst hat, sodass die Implementierung in Unterklassen möglicherweise besonders sorgfältig auf den internen Zustand achten muss. Jede von dieser Methode ausgelöste Ausnahme, mit Ausnahme von
AssertionErroroderSkipTest, wird als zusätzlicher Fehler und nicht als Testfehler betrachtet (wodurch die Gesamtzahl der gemeldeten Fehler erhöht wird). Diese Methode wird nur aufgerufen, wennsetUp()erfolgreich war, unabhängig vom Ergebnis der Testmethode. Die Standardimplementierung tut nichts.
- setUpClass()¶
Eine Klassenmethode, die vor der Ausführung von Tests in einer einzelnen Klasse aufgerufen wird.
setUpClasswird mit der Klasse als einzigem Argument aufgerufen und muss alsclassmethod()dekoriert sein.@classmethod def setUpClass(cls): ...
Weitere Details finden Sie unter Klassen- und Modulfixtures.
Hinzugefügt in Version 3.2.
- tearDownClass()¶
Eine Klassenmethode, die nach der Ausführung von Tests in einer einzelnen Klasse aufgerufen wird.
tearDownClasswird mit der Klasse als einzigem Argument aufgerufen und muss alsclassmethod()dekoriert sein.@classmethod def tearDownClass(cls): ...
Weitere Details finden Sie unter Klassen- und Modulfixtures.
Hinzugefügt in Version 3.2.
- run(result=None)¶
Führt den Test aus und sammelt das Ergebnis im als result übergebenen
TestResult-Objekt. Wenn result weggelassen wird oderNoneist, wird ein temporäres Ergebnisobjekt erstellt (durch Aufruf der MethodedefaultTestResult()) und verwendet. Das Ergebnisobjekt wird an den Aufrufer vonrun()zurückgegeben.Der gleiche Effekt kann erzielt werden, indem einfach die
TestCase-Instanz aufgerufen wird.Geändert in Version 3.3: Frühere Versionen von
rungaben das Ergebnis nicht zurück. Ebenso wenig der Aufruf einer Instanz.
- skipTest(reason)¶
Der Aufruf dieser Methode während einer Testmethode oder
setUp()überspringt den aktuellen Test. Weitere Informationen finden Sie unter Tests und erwartete Fehler überspringen.Hinzugefügt in Version 3.1.
- subTest(msg=None, **params)¶
Gibt einen Kontextmanager zurück, der den eingeschlossenen Codeblock als Subtest ausführt. msg und params sind optionale, beliebige Werte, die angezeigt werden, wenn ein Subtest fehlschlägt, was eine klare Identifizierung ermöglicht.
Ein Testfall kann eine beliebige Anzahl von Subtest-Deklarationen enthalten, und diese können beliebig verschachtelt werden.
Weitere Informationen finden Sie unter Unterscheiden von Testiterationen mithilfe von Subtests.
Hinzugefügt in Version 3.4.
- debug()¶
Führt den Test aus, ohne das Ergebnis zu sammeln. Dies ermöglicht es, dass von dem Test ausgelöste Ausnahmen an den Aufrufer weitergegeben werden, und kann zur Unterstützung der Ausführung von Tests unter einem Debugger verwendet werden.
Die Klasse
TestCasebietet mehrere Assert-Methoden zum Überprüfen und Melden von Fehlern. Die folgende Tabelle listet die gebräuchlichsten Methoden auf (weitere Assert-Methoden finden Sie in den folgenden Tabellen).Methode
Prüft, dass
Neu in
a == ba != bbool(x) ist Truebool(x) ist Falsea ist b3.1
a ist nicht b3.1
x ist None3.1
x ist nicht None3.1
a in b3.1
a nicht in b3.1
isinstance(a, b)3.2
nicht isinstance(a, b)3.2
issubclass(a, b)3.14
nicht issubclass(a, b)3.14
Alle Assert-Methoden akzeptieren ein Argument msg, das, wenn es angegeben wird, als Fehlermeldung bei einem Fehler verwendet wird (siehe auch
longMessage). Beachten Sie, dass das Schlüsselwortargument msg nur fürassertRaises(),assertRaisesRegex(),assertWarns(),assertWarnsRegex()übergeben werden kann, wenn diese als Kontextmanager verwendet werden.- assertEqual(first, second, msg=None)¶
Prüft, ob first und second gleich sind. Wenn die Werte nicht gleich sind, schlägt der Test fehl.
Darüber hinaus, wenn first und second vom exakt gleichen Typ sind und einer von list, tuple, dict, set, frozenset oder str oder einem beliebigen Typ, den eine Unterklasse bei
addTypeEqualityFunc()registriert, wird die typspezifische Gleichheitsfunktion aufgerufen, um eine nützlichere Standardfehlermeldung zu generieren (siehe auch die Liste der typspezifischen Methoden).Geändert in Version 3.1: Hinzufügen des automatischen Aufrufs der typspezifischen Gleichheitsfunktion.
Geändert in Version 3.2:
assertMultiLineEqual()als Standard-Ty-Gleichheitsfunktion für den Vergleich von Zeichenketten hinzugefügt.
- assertNotEqual(first, second, msg=None)¶
Prüft, ob first und second nicht gleich sind. Wenn die Werte gleich sind, schlägt der Test fehl.
- assertTrue(expr, msg=None)¶
- assertFalse(expr, msg=None)¶
Prüft, ob expr wahr (oder falsch) ist.
Beachten Sie, dass dies äquivalent zu
bool(expr) ist Trueund nicht zuexpr ist Trueist (verwenden SieassertIs(expr, True)für Letzteres). Diese Methode sollte auch vermieden werden, wenn spezifischere Methoden verfügbar sind (z. B.assertEqual(a, b)anstelle vonassertTrue(a == b)), da sie im Fehlerfall eine bessere Fehlermeldung liefern.
- assertIs(first, second, msg=None)¶
- assertIsNot(first, second, msg=None)¶
Prüft, ob first und second dasselbe Objekt sind (oder nicht sind).
Hinzugefügt in Version 3.1.
- assertIsNone(expr, msg=None)¶
- assertIsNotNone(expr, msg=None)¶
Prüft, ob expr
Noneist (oder nicht ist).Hinzugefügt in Version 3.1.
- assertIn(member, container, msg=None)¶
- assertNotIn(member, container, msg=None)¶
Prüft, ob member in container ist (oder nicht).
Hinzugefügt in Version 3.1.
- assertIsInstance(obj, cls, msg=None)¶
- assertNotIsInstance(obj, cls, msg=None)¶
Prüft, ob obj eine Instanz von cls ist (oder nicht ist) (wobei cls eine Klasse oder ein Tupel von Klassen sein kann, wie von
isinstance()unterstützt wird). Um den exakten Typ zu überprüfen, verwenden SieassertIs(type(obj), cls).Hinzugefügt in Version 3.2.
- assertIsSubclass(cls, superclass, msg=None)¶
- assertNotIsSubclass(cls, superclass, msg=None)¶
Prüft, ob cls eine Unterklasse von superclass ist (oder nicht ist) (wobei superclass eine Klasse oder ein Tupel von Klassen sein kann, wie von
issubclass()unterstützt wird). Um den exakten Typ zu überprüfen, verwenden SieassertIs(cls, superclass).Hinzugefügt in Version 3.14.
Es ist auch möglich, die Erzeugung von Ausnahmen, Warnungen und Log-Nachrichten mit den folgenden Methoden zu überprüfen
Methode
Prüft, dass
Neu in
fun(*args, **kwds)löst exc ausfun(*args, **kwds)löst exc aus und die Nachricht stimmt mit dem Regex r überein3.1
fun(*args, **kwds)löst warn aus3.2
fun(*args, **kwds)löst warn aus und die Nachricht stimmt mit dem Regex r überein3.2
Der
with-Block loggt auf logger mit der minimalen level3.4
- Der
with-Block loggt nicht auf logger mit der minimalen level
3.10
- assertRaises(exception, callable, *args, **kwds)¶
- assertRaises(exception, *, msg=None)
Prüft, ob eine Ausnahme ausgelöst wird, wenn callable mit beliebigen Positions- oder Schlüsselwortargumenten aufgerufen wird, die ebenfalls an
assertRaises()übergeben werden. Der Test ist bestanden, wenn exception ausgelöst wird, es ist ein Fehler, wenn eine andere Ausnahme ausgelöst wird, oder er schlägt fehl, wenn keine Ausnahme ausgelöst wird. Um eine beliebige Ausnahme aus einer Gruppe von Ausnahmen abzufangen, kann ein Tupel, das die Ausnahme-Klassen enthält, als exception übergeben werden.Wenn nur die Argumente exception und möglicherweise msg angegeben sind, wird ein Kontextmanager zurückgegeben, sodass der zu testende Code inline und nicht als Funktion geschrieben werden kann.
with self.assertRaises(SomeException): do_something()
Bei Verwendung als Kontextmanager akzeptiert
assertRaises()das zusätzliche Schlüsselwortargument msg.Der Kontextmanager speichert das abgefangene Ausnahmeobjekt in seinem
exception-Attribut. Dies kann nützlich sein, wenn die Absicht darin besteht, zusätzliche Überprüfungen an der ausgelösten Ausnahme durchzuführen.with self.assertRaises(SomeException) as cm: do_something() the_exception = cm.exception self.assertEqual(the_exception.error_code, 3)
Geändert in Version 3.1: Hinzufügen der Möglichkeit,
assertRaises()als Kontextmanager zu verwenden.Geändert in Version 3.2: Hinzufügen des
exception-Attributs.Geändert in Version 3.3: Hinzufügen des msg-Schlüsselwortarguments bei Verwendung als Kontextmanager.
- assertRaisesRegex(exception, regex, callable, *args, **kwds)¶
- assertRaisesRegex(exception, regex, *, msg=None)
Wie
assertRaises(), prüft aber auch, ob regex mit der Zeichenkettendarstellung der ausgelösten Ausnahme übereinstimmt. regex kann ein reguläres Ausdrucksobjekt oder eine Zeichenkette sein, die einen regulären Ausdruck für die Verwendung durchre.search()enthält. Beispieleself.assertRaisesRegex(ValueError, "invalid literal for.*XYZ'$", int, 'XYZ')
oder
with self.assertRaisesRegex(ValueError, 'literal'): int('XYZ')
Hinzugefügt in Version 3.1: Unter dem Namen
assertRaisesRegexphinzugefügt.Geändert in Version 3.2: Umbenannt in
assertRaisesRegex().Geändert in Version 3.3: Hinzufügen des msg-Schlüsselwortarguments bei Verwendung als Kontextmanager.
- assertWarns(warning, callable, *args, **kwds)¶
- assertWarns(warning, *, msg=None)
Prüft, ob eine Warnung ausgelöst wird, wenn callable mit beliebigen Positions- oder Schlüsselwortargumenten aufgerufen wird, die ebenfalls an
assertWarns()übergeben werden. Der Test ist bestanden, wenn warning ausgelöst wird, und schlägt fehl, wenn nicht. Jede Ausnahme ist ein Fehler. Um eine beliebige Warnung aus einer Gruppe von Warnungen abzufangen, kann ein Tupel, das die Warnungsklassen enthält, als warnings übergeben werden.Wenn nur die Argumente warning und möglicherweise msg übergeben werden, wird ein Kontextmanager zurückgegeben, sodass der zu testende Code inline und nicht als Funktion geschrieben werden kann
with self.assertWarns(SomeWarning): do_something()
Wenn
assertWarns()als Kontextmanager verwendet wird, akzeptiert es das zusätzliche Schlüsselwortargument msg.Der Kontextmanager speichert das abgefangene Warnungsobjekt in seinem Attribut
warningund die Quellzeile, die die Warnungen ausgelöst hat, in den Attributenfilenameundlineno. Dies kann nützlich sein, wenn die Absicht besteht, zusätzliche Überprüfungen der abgefangenen Warnung durchzuführenwith self.assertWarns(SomeWarning) as cm: do_something() self.assertIn('myfile.py', cm.filename) self.assertEqual(320, cm.lineno)
Diese Methode funktioniert unabhängig von den aktiven Warnungsfiltern, wenn sie aufgerufen wird.
Hinzugefügt in Version 3.2.
Geändert in Version 3.3: Hinzufügen des msg-Schlüsselwortarguments bei Verwendung als Kontextmanager.
- assertWarnsRegex(warning, regex, callable, *args, **kwds)¶
- assertWarnsRegex(warning, regex, *, msg=None)
Ähnlich wie
assertWarns(), testet aber auch, dass regex auf die Nachricht der ausgelösten Warnung passt. regex kann ein reguläres Ausdrucksobjekt oder ein String sein, der einen regulären Ausdruck enthält, der für die Verwendung mitre.search()geeignet ist. Beispielself.assertWarnsRegex(DeprecationWarning, r'legacy_function\(\) is deprecated', legacy_function, 'XYZ')
oder
with self.assertWarnsRegex(RuntimeWarning, 'unsafe frobnicating'): frobnicate('/etc/passwd')
Hinzugefügt in Version 3.2.
Geändert in Version 3.3: Hinzufügen des msg-Schlüsselwortarguments bei Verwendung als Kontextmanager.
- assertLogs(logger=None, level=None)¶
Ein Kontextmanager, der testet, ob mindestens eine Nachricht auf dem logger oder einem seiner Kinder mit mindestens dem angegebenen level protokolliert wird.
Wenn angegeben, sollte logger ein
logging.Logger-Objekt oder einstrmit dem Namen eines Loggers sein. Der Standardwert ist der Root-Logger, der alle Nachrichten abfängt, die nicht durch einen nicht-propagierenden Nachkommen-Logger blockiert wurden.Wenn angegeben, sollte level entweder ein numerischer Logging-Level oder seine String-Entsprechung sein (z. B. entweder
"ERROR"oderlogging.ERROR). Der Standardwert istlogging.INFO.Der Test ist erfolgreich, wenn mindestens eine Nachricht, die innerhalb des
with-Blocks ausgegeben wird, den logger- und level-Bedingungen entspricht, andernfalls schlägt er fehl.Das vom Kontextmanager zurückgegebene Objekt ist ein Aufzeichnungshilfe, das die übereinstimmenden Log-Nachrichten verfolgt. Es hat zwei Attribute
- records¶
Eine Liste von
logging.LogRecord-Objekten der übereinstimmenden Log-Nachrichten.
Beispiel
with self.assertLogs('foo', level='INFO') as cm: logging.getLogger('foo').info('first message') logging.getLogger('foo.bar').error('second message') self.assertEqual(cm.output, ['INFO:foo:first message', 'ERROR:foo.bar:second message'])
Hinzugefügt in Version 3.4.
- assertNoLogs(logger=None, level=None)¶
Ein Kontextmanager, der testet, dass keine Nachrichten auf dem logger oder einem seiner Kinder mit mindestens dem angegebenen level protokolliert werden.
Wenn angegeben, sollte logger ein
logging.Logger-Objekt oder einstrmit dem Namen eines Loggers sein. Der Standardwert ist der Root-Logger, der alle Nachrichten abfängt.Wenn angegeben, sollte level entweder ein numerischer Logging-Level oder seine String-Entsprechung sein (z. B. entweder
"ERROR"oderlogging.ERROR). Der Standardwert istlogging.INFO.Im Gegensatz zu
assertLogs()wird vom Kontextmanager nichts zurückgegeben.Hinzugefügt in Version 3.10.
Es gibt auch andere Methoden, die für spezifischere Prüfungen verwendet werden, wie z. B.
Methode
Prüft, dass
Neu in
round(a-b, 7) == 0round(a-b, 7) != 0a > b3.1
a >= b3.1
a < b3.1
a <= b3.1
r.search(s)3.1
not r.search(s)3.2
a und b haben die gleichen Elemente in der gleichen Anzahl, unabhängig von ihrer Reihenfolge.
3.2
a.startswith(b)3.14
not a.startswith(b)3.14
a.endswith(b)3.14
not a.endswith(b)3.14
hastattr(a, b)3.14
not hastattr(a, b)3.14
- assertAlmostEqual(first, second, places=7, msg=None, delta=None)¶
- assertNotAlmostEqual(first, second, places=7, msg=None, delta=None)¶
Testet, ob first und second ungefähr gleich (oder nicht ungefähr gleich) sind, indem die Differenz berechnet, auf die angegebene Anzahl von Dezimalstellen (standardmäßig 7) gerundet und mit Null verglichen wird. Beachten Sie, dass diese Methoden die Werte auf die angegebene Anzahl von Dezimalstellen runden (d. h. wie die Funktion
round()) und nicht auf signifikante Ziffern.Wenn delta anstelle von places angegeben wird, muss die Differenz zwischen first und second kleiner oder gleich (oder größer als) delta sein.
Die Angabe von sowohl delta als auch places löst einen
TypeErroraus.Geändert in Version 3.2:
assertAlmostEqual()berücksichtigt automatisch fast gleiche Objekte, die gleich verglichen werden.assertNotAlmostEqual()schlägt fehl, wenn die Objekte gleich verglichen werden. Das Schlüsselwortargument delta wurde hinzugefügt.
- assertGreater(first, second, msg=None)¶
- assertGreaterEqual(first, second, msg=None)¶
- assertLess(first, second, msg=None)¶
- assertLessEqual(first, second, msg=None)¶
Testet, ob first größer, größer oder gleich, kleiner oder kleiner oder gleich second ist, je nach Methodenname. Andernfalls schlägt der Test fehl.
>>> self.assertGreaterEqual(3, 4) AssertionError: "3" unexpectedly not greater than or equal to "4"
Hinzugefügt in Version 3.1.
- assertRegex(text, regex, msg=None)¶
- assertNotRegex(text, regex, msg=None)¶
Testet, ob eine regex-Suche text übereinstimmt (oder nicht übereinstimmt). Im Fehlerfall enthält die Fehlermeldung das Muster und den text (oder das Muster und den Teil des text, der unerwartet übereinstimmte). regex kann ein reguläres Ausdrucksobjekt oder ein String sein, der einen regulären Ausdruck enthält, der für die Verwendung mit
re.search()geeignet ist.Hinzugefügt in Version 3.1: Unter dem Namen
assertRegexpMatcheshinzugefügt.Geändert in Version 3.2: Die Methode
assertRegexpMatches()wurde inassertRegex()umbenannt.Hinzugefügt in Version 3.2:
assertNotRegex().
- assertCountEqual(first, second, msg=None)¶
Testet, ob die Sequenz first die gleichen Elemente wie second enthält, unabhängig von ihrer Reihenfolge. Wenn dies nicht der Fall ist, wird eine Fehlermeldung generiert, die die Unterschiede zwischen den Sequenzen auflistet.
Duplikate Elemente werden beim Vergleichen von first und second nicht ignoriert. Es wird überprüft, ob jedes Element in beiden Sequenzen die gleiche Anzahl hat. Entspricht:
assertEqual(Counter(list(first)), Counter(list(second))), funktioniert aber auch mit Sequenzen von nicht hashbaren Objekten.Hinzugefügt in Version 3.2.
- assertStartsWith(s, prefix, msg=None)¶
- assertNotStartsWith(s, prefix, msg=None)¶
Testet, ob die Unicode- oder Byte-Zeichenkette s mit einem prefix beginnt (oder nicht beginnt). prefix kann auch ein Tupel von Zeichenketten sein, die ausprobiert werden sollen.
Hinzugefügt in Version 3.14.
- assertEndsWith(s, suffix, msg=None)¶
- assertNotEndsWith(s, suffix, msg=None)¶
Testet, ob die Unicode- oder Byte-Zeichenkette s mit einem suffix endet (oder nicht endet). suffix kann auch ein Tupel von Zeichenketten sein, die ausprobiert werden sollen.
Hinzugefügt in Version 3.14.
- assertHasAttr(obj, name, msg=None)¶
- assertNotHasAttr(obj, name, msg=None)¶
Testet, ob das Objekt obj ein Attribut name hat (oder nicht hat).
Hinzugefügt in Version 3.14.
Die Methode
assertEqual()leitet die Gleichheitsprüfung für Objekte desselben Typs an verschiedene typspezifische Methoden weiter. Diese Methoden sind für die meisten eingebauten Typen bereits implementiert, aber es ist auch möglich, neue Methoden mitaddTypeEqualityFunc()zu registrieren.- addTypeEqualityFunc(typeobj, function)¶
Registriert eine typspezifische Methode, die von
assertEqual()aufgerufen wird, um zu prüfen, ob zwei Objekte genau desselben typeobj (nicht Unterklassen) gleich sind. function muss zwei Positionsargumente und ein drittes msg=None-Schlüsselwortargument akzeptieren, genau wieassertEqual(). Sie mussself.failureException(msg)auslösen, wenn eine Ungleichheit zwischen den ersten beiden Parametern erkannt wird – möglicherweise unter Angabe nützlicher Informationen und Erläuterung der Ungleichheiten in der Fehlermeldung.Hinzugefügt in Version 3.1.
Die Liste der typspezifischen Methoden, die automatisch von
assertEqual()verwendet werden, ist in der folgenden Tabelle zusammengefasst. Beachten Sie, dass diese Methoden normalerweise nicht direkt aufgerufen werden müssen.Methode
Verwendet zum Vergleichen
Neu in
Strings
3.1
Sequenzen
3.1
Listen
3.1
Tupel
3.1
Sets oder Frozensets
3.1
Dicts
3.1
- assertMultiLineEqual(first, second, msg=None)¶
Testet, ob der mehrzeilige String first mit dem String second übereinstimmt. Wenn nicht, wird eine Differenz der beiden Strings, die die Unterschiede hervorhebt, in die Fehlermeldung aufgenommen. Diese Methode wird standardmäßig beim Vergleichen von Strings mit
assertEqual()verwendet.Hinzugefügt in Version 3.1.
- assertSequenceEqual(first, second, msg=None, seq_type=None)¶
Testet, ob zwei Sequenzen gleich sind. Wenn ein seq_type angegeben wird, müssen sowohl first als auch second Instanzen von seq_type sein, andernfalls wird ein Fehler ausgelöst. Wenn die Sequenzen unterschiedlich sind, wird eine Fehlermeldung konstruiert, die die Unterschiede zwischen beiden zeigt.
Diese Methode wird nicht direkt von
assertEqual()aufgerufen, sondern wird zur Implementierung vonassertListEqual()undassertTupleEqual()verwendet.Hinzugefügt in Version 3.1.
- assertListEqual(first, second, msg=None)¶
- assertTupleEqual(first, second, msg=None)¶
Testet, ob zwei Listen oder Tupel gleich sind. Wenn nicht, wird eine Fehlermeldung erstellt, die nur die Unterschiede zwischen den beiden anzeigt. Ein Fehler wird auch ausgelöst, wenn einer der Parameter vom falschen Typ ist. Diese Methoden werden standardmäßig beim Vergleichen von Listen oder Tupeln mit
assertEqual()verwendet.Hinzugefügt in Version 3.1.
- assertSetEqual(first, second, msg=None)¶
Testet, ob zwei Sets gleich sind. Wenn nicht, wird eine Fehlermeldung erstellt, die die Unterschiede zwischen den Sets auflistet. Diese Methode wird standardmäßig beim Vergleichen von Sets oder Frozensets mit
assertEqual()verwendet.Schlägt fehl, wenn first oder second keine
set.difference()Methode hat.Hinzugefügt in Version 3.1.
- assertDictEqual(first, second, msg=None)¶
Testet, ob zwei Wörterbücher gleich sind. Wenn nicht, wird eine Fehlermeldung erstellt, die die Unterschiede in den Wörterbüchern anzeigt. Diese Methode wird standardmäßig zum Vergleichen von Wörterbüchern in Aufrufen von
assertEqual()verwendet.Hinzugefügt in Version 3.1.
Schließlich bietet die
TestCasedie folgenden Methoden und Attribute- fail(msg=None)¶
Signalisiert bedingungslos einen Testfehler, mit msg oder
Nonefür die Fehlermeldung.
- failureException¶
Dieses Klassenattribut gibt die Ausnahme an, die von der Testmethode ausgelöst wird. Wenn ein Test-Framework eine spezialisierte Ausnahme verwenden muss, möglicherweise um zusätzliche Informationen zu übermitteln, muss es diese Ausnahme unterklassifizieren, um mit dem Framework „fair zu spielen“. Der Anfangswert dieses Attributs ist
AssertionError.
- longMessage¶
Dieses Klassenattribut bestimmt, was passiert, wenn eine benutzerdefinierte Fehlermeldung als msg-Argument an einen fehlschlagenden assertXYY-Aufruf übergeben wird.
Trueist der Standardwert. In diesem Fall wird die benutzerdefinierte Meldung am Ende der Standardfehlermeldung angehängt. Wenn aufFalsegesetzt, ersetzt die benutzerdefinierte Meldung die Standardmeldung.Die Klasseneinstellung kann in einzelnen Testmethoden überschrieben werden, indem ein Instanzattribut, self.longMessage, auf
TrueoderFalsegesetzt wird, bevor die Assert-Methoden aufgerufen werden.Die Klasseneinstellung wird vor jedem Testaufruf zurückgesetzt.
Hinzugefügt in Version 3.1.
- maxDiff¶
Dieses Attribut steuert die maximale Länge von Diffs, die von Assert-Methoden ausgegeben werden, die Diffs bei einem Fehler berichten. Es ist standardmäßig auf 80*8 Zeichen eingestellt. Von diesem Attribut betroffene Assert-Methoden sind
assertSequenceEqual()(einschließlich aller Sequenzvergleichsmethoden, die an sie delegieren),assertDictEqual()undassertMultiLineEqual().Das Setzen von
maxDiffaufNonebedeutet, dass es keine maximale Länge für Diffs gibt.Hinzugefügt in Version 3.2.
Test-Frameworks können die folgenden Methoden verwenden, um Informationen über den Test zu sammeln
- countTestCases()¶
Gibt die Anzahl der von diesem Testobjekt dargestellten Tests zurück. Für
TestCase-Instanzen ist dies immer1.
- defaultTestResult()¶
Gibt eine Instanz der Test-Ergebnisklasse zurück, die für diese Testfallklasse verwendet werden sollte (wenn keine andere Ergebnisinstanz an die Methode
run()übergeben wird).Für
TestCase-Instanzen ist dies immer eine Instanz vonTestResult; Unterklassen vonTestCasesollten dies nach Bedarf überschreiben.
- id()¶
Gibt eine Zeichenkette zurück, die den spezifischen Testfall identifiziert. Dies ist normalerweise der vollständige Name der Testmethode, einschließlich des Modul- und Klassennamens.
- shortDescription()¶
Gibt eine Beschreibung des Tests zurück oder
None, wenn keine Beschreibung angegeben wurde. Die Standardimplementierung dieser Methode gibt die erste Zeile des Docstrings der Testmethode zurück, falls verfügbar, oderNone.Geändert in Version 3.1: In 3.1 wurde dies geändert, um den Testnamen zur kurzen Beschreibung hinzuzufügen, auch wenn ein Docstring vorhanden war. Dies verursachte Kompatibilitätsprobleme mit unittest-Erweiterungen, und das Hinzufügen des Testnamens wurde in Python 3.2 in
TextTestResultverschoben.
- addCleanup(function, /, *args, **kwargs)¶
Fügt eine Funktion hinzu, die nach
tearDown()aufgerufen wird, um während des Tests verwendete Ressourcen zu bereinigen. Funktionen werden in umgekehrter Reihenfolge zu ihrer Hinzufügung aufgerufen (LIFO). Sie werden mit allen Argumenten und Schlüsselwortargumenten aufgerufen, die beim Hinzufügen anaddCleanup()übergeben wurden.Wenn
setUp()fehlschlägt, was bedeutet, dasstearDown()nicht aufgerufen wird, werden alle hinzugefügten Bereinigungsfunktionen trotzdem aufgerufen.Hinzugefügt in Version 3.1.
- enterContext(cm)¶
Tritt in den bereitgestellten Kontextmanager ein. Bei Erfolg wird seine
__exit__()-Methode als Bereinigungsfunktion überaddCleanup()hinzugefügt, und das Ergebnis der__enter__()-Methode wird zurückgegeben.Hinzugefügt in Version 3.11.
- doCleanups()¶
Diese Methode wird bedingungslos nach
tearDown()aufgerufen, oder nachsetUp(), wennsetUp()eine Ausnahme auslöst.Sie ist dafür verantwortlich, alle von
addCleanup()hinzugefügten Bereinigungsfunktionen aufzurufen. Wenn Sie möchten, dass Bereinigungsfunktionen *vor*tearDown()aufgerufen werden, können SiedoCleanups()selbst aufrufen.doCleanups()holt Methoden nacheinander vom Stapel der Bereinigungsfunktionen, sodass sie jederzeit aufgerufen werden kann.Hinzugefügt in Version 3.1.
- classmethod addClassCleanup(function, /, *args, **kwargs)¶
Fügt eine Funktion hinzu, die nach
tearDownClass()aufgerufen wird, um während der Testklasse verwendete Ressourcen zu bereinigen. Funktionen werden in umgekehrter Reihenfolge zu ihrer Hinzufügung aufgerufen (LIFO). Sie werden mit allen Argumenten und Schlüsselwortargumenten aufgerufen, die beim Hinzufügen anaddClassCleanup()übergeben wurden.Wenn
setUpClass()fehlschlägt, was bedeutet, dasstearDownClass()nicht aufgerufen wird, werden alle hinzugefügten Bereinigungsfunktionen trotzdem aufgerufen.Hinzugefügt in Version 3.8.
- classmethod enterClassContext(cm)¶
Tritt in den bereitgestellten Kontextmanager ein. Bei Erfolg wird seine
__exit__()-Methode als Bereinigungsfunktion überaddClassCleanup()hinzugefügt, und das Ergebnis der__enter__()-Methode wird zurückgegeben.Hinzugefügt in Version 3.11.
- classmethod doClassCleanups()¶
Diese Methode wird bedingungslos nach
tearDownClass()aufgerufen, oder nachsetUpClass(), wennsetUpClass()eine Ausnahme auslöst.Sie ist dafür verantwortlich, alle von
addClassCleanup()hinzugefügten Bereinigungsfunktionen aufzurufen. Wenn Sie möchten, dass Bereinigungsfunktionen *vor*tearDownClass()aufgerufen werden, können SiedoClassCleanups()selbst aufrufen.doClassCleanups()holt Methoden nacheinander vom Stapel der Bereinigungsfunktionen, sodass sie jederzeit aufgerufen werden kann.Hinzugefügt in Version 3.8.
- class unittest.IsolatedAsyncioTestCase(methodName='runTest')¶
Diese Klasse bietet eine API, die
TestCaseähnelt und auch Koroutinen als Testfunktionen akzeptiert.Hinzugefügt in Version 3.8.
- loop_factory¶
Die an
asyncio.Runnerübergebene loop_factory. Überschreiben Sie in Unterklassen mitasyncio.EventLoop, um die Verwendung des asyncio-Richtliniensystems zu vermeiden.Hinzugefügt in Version 3.13.
- async asyncSetUp()¶
Methode, die aufgerufen wird, um die Testfixture vorzubereiten. Dies geschieht nach
setUp(). Dies wird unmittelbar vor dem Aufruf der Testmethode aufgerufen; mit Ausnahme vonAssertionErroroderSkipTestwerden alle von dieser Methode ausgelösten Ausnahmen als Fehler und nicht als Testfehler betrachtet. Die Standardimplementierung tut nichts.
- async asyncTearDown()¶
Methode, die unmittelbar nach dem Aufruf der Testmethode und der Aufzeichnung des Ergebnisses aufgerufen wird. Dies geschieht vor
tearDown(). Sie wird auch dann aufgerufen, wenn die Testmethode eine Ausnahme auslöst. Die Implementierung in Unterklassen muss daher möglicherweise besonders sorgfältig auf den internen Zustand prüfen. Jede Ausnahme, mit Ausnahme vonAssertionErroroderSkipTest, die von dieser Methode ausgelöst wird, wird als zusätzlicher Fehler und nicht als Testfehler betrachtet (wodurch sich die Gesamtzahl der gemeldeten Fehler erhöht). Diese Methode wird nur aufgerufen, wennasyncSetUp()erfolgreich war, unabhängig vom Ergebnis der Testmethode. Die Standardimplementierung tut nichts.
- addAsyncCleanup(function, /, *args, **kwargs)¶
Diese Methode akzeptiert eine Koroutine, die als Bereinigungsfunktion verwendet werden kann.
- async enterAsyncContext(cm)¶
Tritt in den bereitgestellten asynchronen Kontextmanager ein. Bei Erfolg wird seine
__aexit__()-Methode als Bereinigungsfunktion überaddAsyncCleanup()hinzugefügt, und das Ergebnis der__aenter__()-Methode wird zurückgegeben.Hinzugefügt in Version 3.11.
- run(result=None)¶
Richtet eine neue Ereignisschleife ein, um den Test auszuführen, und sammelt das Ergebnis im als result übergebenen
TestResult-Objekt. Wenn result weggelassen wird oderNoneist, wird ein temporäres Ergebnisobjekt erstellt (durch Aufruf der MethodedefaultTestResult()) und verwendet. Das Ergebnisobjekt wird an den Aufrufer vonrun()zurückgegeben. Am Ende des Tests werden alle Tasks in der Ereignisschleife abgebrochen.
Ein Beispiel zur Veranschaulichung der Reihenfolge
from unittest import IsolatedAsyncioTestCase events = [] class Test(IsolatedAsyncioTestCase): def setUp(self): events.append("setUp") async def asyncSetUp(self): self._async_connection = await AsyncConnection() events.append("asyncSetUp") async def test_response(self): events.append("test_response") response = await self._async_connection.get("https://example.com") self.assertEqual(response.status_code, 200) self.addAsyncCleanup(self.on_cleanup) def tearDown(self): events.append("tearDown") async def asyncTearDown(self): await self._async_connection.close() events.append("asyncTearDown") async def on_cleanup(self): events.append("cleanup") if __name__ == "__main__": unittest.main()
Nach Ausführung des Tests würde
events["setUp", "asyncSetUp", "test_response", "asyncTearDown", "tearDown", "cleanup"]enthalten.
- class unittest.FunctionTestCase(testFunc, setUp=None, tearDown=None, description=None)¶
Diese Klasse implementiert den Teil der
TestCase-Schnittstelle, die es dem Test-Runner ermöglicht, den Test anzutreiben, bietet aber nicht die Methoden, die der Testcode zum Prüfen und Melden von Fehlern verwenden kann. Dies wird verwendet, um Testfälle aus Legacy-Testcode zu erstellen, wodurch dieser in ein aufunittestbasierendes Testframework integriert werden kann.
Tests gruppieren¶
- class unittest.TestSuite(tests=())¶
Diese Klasse stellt eine Aggregation einzelner Testfälle und Test-Suiten dar. Die Klasse stellt die Schnittstelle bereit, die der Test-Runner benötigt, um sie wie jeden anderen Testfall auszuführen. Das Ausführen einer
TestSuite-Instanz ist dasselbe wie das Iterieren über die Suite und das individuelle Ausführen jedes Tests.Wenn tests angegeben ist, muss es ein Iterable von einzelnen Testfällen oder anderen Test-Suiten sein, die zum anfänglichen Aufbau der Suite verwendet werden. Es werden zusätzliche Methoden bereitgestellt, um später Testfälle und Suiten zur Sammlung hinzuzufügen.
TestSuite-Objekte verhalten sich weitgehend wieTestCase-Objekte, außer dass sie tatsächlich keinen Test implementieren. Stattdessen werden sie verwendet, um Tests in Gruppen von Tests zu aggregieren, die zusammen ausgeführt werden sollen. Einige zusätzliche Methoden sind verfügbar, um Tests zuTestSuite-Instanzen hinzuzufügen.- addTests(tests)¶
Fügt alle Tests aus einem Iterable von
TestCase- undTestSuite-Instanzen zu dieser Testsuite hinzu.Dies entspricht dem Iterieren über tests und dem Aufrufen von
addTest()für jedes Element.
TestSuiteteilt die folgenden Methoden mitTestCase- run(result)¶
Führt die mit dieser Suite verbundenen Tests aus und sammelt das Ergebnis im als result übergebenen Test-Ergebnisobjekt. Beachten Sie, dass
TestSuite.run(), im Gegensatz zuTestCase.run(), erfordert, dass das Ergebnisobjekt übergeben wird.
- debug()¶
Führt die mit dieser Suite verbundenen Tests aus, ohne das Ergebnis zu sammeln. Dies ermöglicht es, dass Ausnahmen, die vom Test ausgelöst werden, an den Aufrufer weitergegeben werden, und kann verwendet werden, um das Ausführen von Tests unter einem Debugger zu unterstützen.
- countTestCases()¶
Gibt die Anzahl der von diesem Testobjekt dargestellten Tests zurück, einschließlich aller einzelnen Tests und Unter-Suiten.
- __iter__()¶
Tests, die von einer
TestSuitegruppiert werden, werden immer über Iteration abgerufen. Unterklassen können Tests verzögert bereitstellen, indem sie__iter__()überschreiben. Beachten Sie, dass diese Methode mehrmals für eine einzelne Suite aufgerufen werden kann (z. B. beim Zählen von Tests oder beim Vergleichen auf Gleichheit), daher müssen die von wiederholten Iterationen vorTestSuite.run()zurückgegebenen Tests für jede Iteration gleich sein. NachTestSuite.run()sollten Aufrufer sich nicht auf die von dieser Methode zurückgegebenen Tests verlassen, es sei denn, der Aufrufer verwendet eine Unterklasse, dieTestSuite._removeTestAtIndex()überschreibt, um Testreferenzen beizubehalten.Geändert in Version 3.2: In früheren Versionen rief
TestSuiteTests direkt und nicht über Iteration ab, sodass das Überschreiben von__iter__()nicht ausreichte, um Tests bereitzustellen.Geändert in Version 3.4: In früheren Versionen hielt
TestSuiteReferenzen auf jedenTestCasenachTestSuite.run(). Unterklassen können dieses Verhalten wiederherstellen, indem sieTestSuite._removeTestAtIndex()überschreiben.
Bei der typischen Verwendung eines
TestSuite-Objekts wird die Methoderun()von einemTestRunnerund nicht vom Endbenutzer-Test-Harness aufgerufen.
Tests laden und ausführen¶
- class unittest.TestLoader¶
Die Klasse
TestLoaderwird verwendet, um Test-Suiten aus Klassen und Modulen zu erstellen. Normalerweise ist es nicht notwendig, eine Instanz dieser Klasse zu erstellen; das Modulunitteststellt eine Instanz bereit, die alsunittest.defaultTestLoadergemeinsam genutzt werden kann. Die Verwendung einer Unterklasse oder Instanz ermöglicht jedoch die Anpassung einiger konfigurierbarer Eigenschaften.TestLoader-Objekte haben die folgenden Attribute- errors¶
Eine Liste von nicht-fatalen Fehlern, die beim Laden von Tests aufgetreten sind. Wird vom Lader zu keinem Zeitpunkt zurückgesetzt. Fatale Fehler werden durch die relevante Methode signalisiert, die eine Ausnahme an den Aufrufer auslöst. Nicht-fatale Fehler werden auch durch einen synthetischen Test signalisiert, der beim Ausführen den ursprünglichen Fehler auslöst.
Hinzugefügt in Version 3.5.
TestLoader-Objekte haben die folgenden Methoden- loadTestsFromTestCase(testCaseClass)¶
Gibt eine Suite aller Testfälle zurück, die in der von
TestCaseabgeleiteten KlassetestCaseClassenthalten sind.Für jede Methode, deren Name von
getTestCaseNames()ermittelt wird, wird eine Testinstanz erstellt. Standardmäßig sind dies Methodennamen, die mittestbeginnen. WenngetTestCaseNames()keine Methoden zurückgibt, aber die MethoderunTest()implementiert ist, wird stattdessen eine einzelne Testinstanz für diese Methode erstellt.
- loadTestsFromModule(module, *, pattern=None)¶
Gibt eine Suite aller Testfälle im angegebenen Modul zurück. Diese Methode sucht im module nach Klassen, die von
TestCaseabgeleitet sind, und erstellt für jede für die Klasse definierte Testmethode eine Instanz der Klasse.Hinweis
Während die Verwendung einer Hierarchie von von
TestCaseabgeleiteten Klassen praktisch für die gemeinsame Nutzung von Fixtures und Hilfsfunktionen sein kann, funktioniert die Definition von Testmethoden in Basisklassen, die nicht direkt instanziiert werden sollen, mit dieser Methode nicht gut. Dies kann jedoch nützlich sein, wenn die Fixtures unterschiedlich sind und in Unterklassen definiert werden.Wenn ein Modul eine Funktion
load_testsbereitstellt, wird diese aufgerufen, um die Tests zu laden. Dies ermöglicht es Modulen, das Testladen anzupassen. Dies ist das load_tests-Protokoll. Das pattern-Argument wird als drittes Argument anload_testsübergeben.Geändert in Version 3.2: Unterstützung für
load_testshinzugefügt.Geändert in Version 3.5: Unterstützung für ein Keyword-only-Argument pattern wurde hinzugefügt.
Geändert in Version 3.12: Der undokumentierte und inoffizielle Parameter use_load_tests wurde entfernt.
- loadTestsFromName(name, module=None)¶
Gibt eine Suite aller Testfälle zurück, basierend auf einem Zeichenkettenbezeichner.
Der Bezeichner name ist ein „punktierter Name“, der entweder zu einem Modul, einer Testfallklasse, einer Testmethode innerhalb einer Testfallklasse, einer
TestSuite-Instanz oder einem aufrufbaren Objekt aufgelöst werden kann, das einenTestCase- oderTestSuite-Instanz zurückgibt. Diese Prüfungen werden in der aufgeführten Reihenfolge angewendet; das heißt, eine Methode in einer möglichen Testfallklasse wird als „eine Testmethode innerhalb einer Testfallklasse“ erkannt und nicht als „ein aufrufbares Objekt“.Wenn Sie beispielsweise ein Modul
SampleTestshaben, das eine vonTestCaseabgeleitete KlasseSampleTestCasemit drei Testmethoden (test_one(),test_two()undtest_three()) enthält, führt der Bezeichner'SampleTests.SampleTestCase'dazu, dass diese Methode eine Suite zurückgibt, die alle drei Testmethoden ausführt. Die Verwendung des Bezeichners'SampleTests.SampleTestCase.test_two'führt dazu, dass eine Testsuite zurückgegeben wird, die nur die Testmethodetest_two()ausführt. Der Bezeichner kann sich auf Module und Pakete beziehen, die noch nicht importiert wurden; sie werden als Nebeneffekt importiert.Die Methode löst optional name relativ zum angegebenen module auf.
Geändert in Version 3.5: Wenn während der Traversierung von name ein
ImportErroroderAttributeErrorauftritt, wird ein synthetischer Test zurückgegeben, der diesen Fehler beim Ausführen auslöst. Diese Fehler werden in den von self.errors gesammelten Fehlern enthalten.
- loadTestsFromNames(names, module=None)¶
Ähnlich wie
loadTestsFromName(), aber erwartet eine Sequenz von Namen anstelle eines einzelnen Namens. Der Rückgabewert ist eine Testsuite, die alle für jeden Namen definierten Tests unterstützt.
- getTestCaseNames(testCaseClass)¶
Gibt eine sortierte Sequenz von Methodennamen zurück, die in testCaseClass gefunden wurden; dies sollte eine Unterklasse von
TestCasesein.
- discover(start_dir, pattern='test*.py', top_level_dir=None)¶
Findet alle Testmodule, indem sie von Verzeichnis zu Verzeichnis rekursiv durchsucht werden, und gibt ein TestSuite-Objekt zurück, das diese enthält. Nur Testdateien, die dem pattern entsprechen, werden geladen. (Verwendet Shell-ähnliche Mustererkennung.) Nur Modulnamen, die importierbar sind (d.h. gültige Python-Bezeichner), werden geladen.
Alle Testmodule müssen vom obersten Level des Projekts importierbar sein. Wenn das Startverzeichnis nicht das oberste Level-Verzeichnis ist, muss top_level_dir separat angegeben werden.
Wenn der Import eines Moduls fehlschlägt, z. B. aufgrund eines Syntaxfehlers, wird dies als einzelner Fehler erfasst und die Suche wird fortgesetzt. Wenn der Importfehler darauf zurückzuführen ist, dass
SkipTestausgelöst wird, wird er als Überspringung anstelle eines Fehlers erfasst.Wenn ein Paket (ein Verzeichnis, das eine Datei namens
__init__.pyenthält) gefunden wird, wird das Paket auf eine Funktionload_testsüberprüft. Wenn diese existiert, wird sie alspackage.load_tests(loader, tests, pattern)aufgerufen. Die Testsuche stellt sicher, dass ein Paket während eines Aufrufs nur einmal auf Tests überprüft wird, auch wenn die Funktion load_tests selbstloader.discoveraufruft.Wenn
load_testsexistiert, rekursiert die Suche nicht in das Paket;load_testsist für das Laden aller Tests im Paket verantwortlich.Das Muster wird absichtlich nicht als Loader-Attribut gespeichert, damit Pakete die Suche selbst fortsetzen können.
top_level_dir wird intern gespeichert und als Standard für alle verschachtelten Aufrufe von
discover()verwendet. Das heißt, wennload_testseines Paketsloader.discover()aufruft, muss dieses Argument nicht übergeben werden.start_dir kann sowohl ein punktierter Modulname als auch ein Verzeichnis sein.
Hinzugefügt in Version 3.2.
Geändert in Version 3.4: Module, die
SkipTestbeim Import auslösen, werden als Überspringungen und nicht als Fehler erfasst.start_dir kann ein Namespace-Paket sein.
Pfade werden vor dem Import sortiert, damit die Ausführungsreihenfolge gleich ist, auch wenn die Reihenfolge des zugrunde liegenden Dateisystems nicht vom Dateinamen abhängt.
Geändert in Version 3.5: Gefundene Pakete werden jetzt auf
load_testsüberprüft, unabhängig davon, ob ihr Pfad mit pattern übereinstimmt, da es unmöglich ist, dass ein Paketname mit dem Standardmuster übereinstimmt.Geändert in Version 3.11: start_dir kann kein Namespace-Paket sein. Es ist seit Python 3.7 fehlerhaft und Python 3.11 entfernt es offiziell.
Geändert in Version 3.13: top_level_dir wird nur für die Dauer des discover-Aufrufs gespeichert.
Geändert in Version 3.14: start_dir kann wieder ein Namespace-Paket sein.
Die folgenden Attribute eines
TestLoaderkönnen entweder durch Ableitung oder durch Zuweisung an eine Instanz konfiguriert werden.- testMethodPrefix¶
Zeichenkette, die das Präfix von Methodennamen angibt, die als Testmethoden interpretiert werden. Der Standardwert ist
'test'.Dies wirkt sich auf
getTestCaseNames()und alleloadTestsFrom*Methoden aus.
- sortTestMethodsUsing¶
Funktion, die zum Vergleichen von Methodennamen beim Sortieren in
getTestCaseNames()und allenloadTestsFrom*Methoden verwendet werden soll.
- suiteClass¶
Aufrufbares Objekt, das eine Testsuite aus einer Liste von Tests erstellt. Es werden keine Methoden des resultierenden Objekts benötigt. Der Standardwert ist die
TestSuite-Klasse.Dies wirkt sich auf alle
loadTestsFrom*Methoden aus.
- testNamePatterns¶
Liste von Unix-Shell-ähnlichen Wildcard-Mustern für Testnamen, die von Testmethoden erfüllt werden müssen, um in Testsuiten aufgenommen zu werden (siehe Option
-k).Wenn dieses Attribut nicht
None(Standard) ist, müssen alle Testmethoden, die in Testsuiten aufgenommen werden sollen, einem der Muster in dieser Liste entsprechen. Beachten Sie, dass Übereinstimmungen immer mitfnmatch.fnmatchcase()durchgeführt werden, daher müssen im Gegensatz zu Mustern, die an die Option-kübergeben werden, einfache Teilmuster mit*-Wildcards konvertiert werden.Dies wirkt sich auf alle
loadTestsFrom*Methoden aus.Hinzugefügt in Version 3.7.
- class unittest.TestResult¶
Diese Klasse wird verwendet, um Informationen darüber zu kompilieren, welche Tests erfolgreich waren und welche fehlgeschlagen sind.
Ein
TestResult-Objekt speichert die Ergebnisse einer Reihe von Tests. Die KlassenTestCaseundTestSuitestellen sicher, dass die Ergebnisse korrekt aufgezeichnet werden; Testautoren müssen sich keine Gedanken über die Aufzeichnung des Testergebnisses machen.Test-Frameworks, die auf
unittestaufbauen, möchten möglicherweise auf dasTestResult-Objekt zugreifen, das durch Ausführen einer Reihe von Tests für Berichterstattungszwecke generiert wird; eineTestResult-Instanz wird von der MethodeTestRunner.run()zu diesem Zweck zurückgegeben.TestResult-Instanzen haben die folgenden Attribute, die für die Inspektion der Ergebnisse der Ausführung einer Reihe von Tests von Interesse sind.- errors¶
Eine Liste, die 2-Tupel von
TestCase-Instanzen und Zeichenketten mit formatierten Tracebacks enthält. Jedes Tupel stellt einen Test dar, der eine unerwartete Ausnahme ausgelöst hat.
- failures¶
Eine Liste, die 2-Tupel von
TestCase-Instanzen und Zeichenketten mit formatierten Tracebacks enthält. Jedes Tupel stellt einen Test dar, bei dem ein Fehler explizit mit den assert*-Methoden signalisiert wurde.
- skipped¶
Eine Liste, die 2-Tupel von
TestCase-Instanzen und Zeichenketten mit dem Grund für die Überspringung des Tests enthält.Hinzugefügt in Version 3.1.
- expectedFailures¶
Eine Liste, die 2-Tupel von
TestCase-Instanzen und Zeichenketten mit formatierten Tracebacks enthält. Jedes Tupel stellt einen erwarteten Fehler oder Ausfallfall der Testinstanz dar.
- unexpectedSuccesses¶
Eine Liste, die
TestCase-Instanzen enthält, die als erwartete Fehler markiert wurden, aber erfolgreich waren.
- collectedDurations¶
Eine Liste, die 2-Tupel von Testfallnamen und Floats enthält, die die verstrichene Zeit jedes ausgeführten Tests darstellen.
Hinzugefügt in Version 3.12.
- shouldStop¶
Wird auf
Truegesetzt, wenn die Ausführung von Tests durchstop()abgebrochen werden soll.
- testsRun¶
Die Gesamtzahl der bisher ausgeführten Tests.
- buffer¶
Wenn auf True gesetzt, werden
sys.stdoutundsys.stderrzwischen dem Aufruf vonstartTest()undstopTest()gepuffert. Gesammelte Ausgaben werden nur dann auf die tatsächlichensys.stdoutundsys.stderrausgegeben, wenn der Test fehlschlägt oder Fehler verursacht. Jede Ausgabe wird auch an die Fehlermeldung / den Fehler angehängt.Hinzugefügt in Version 3.2.
- failfast¶
Wenn auf True gesetzt, wird
stop()beim ersten Fehlschlag oder Fehler aufgerufen, wodurch der Testlauf abgebrochen wird.Hinzugefügt in Version 3.2.
- tb_locals¶
Wenn auf True gesetzt, werden lokale Variablen in Tracebacks angezeigt.
Hinzugefügt in Version 3.5.
- wasSuccessful()¶
Gibt
Truezurück, wenn alle bisher ausgeführten Tests bestanden wurden, andernfalls gibt sieFalsezurück.Geändert in Version 3.4: Gibt
Falsezurück, wenn es unerwartete Erfolge (unexpectedSuccesses) bei Tests gab, die mit dem DekoratorexpectedFailure()markiert waren.
- stop()¶
Diese Methode kann aufgerufen werden, um zu signalisieren, dass die auszuführenden Tests abgebrochen werden sollen, indem das Attribut
shouldStopaufTruegesetzt wird.TestRunner-Objekte sollten diese Flagge berücksichtigen und zurückkehren, ohne zusätzliche Tests auszuführen.Diese Funktion wird beispielsweise von der Klasse
TextTestRunnerverwendet, um das Test-Framework zu stoppen, wenn der Benutzer eine Unterbrechung von der Tastatur signalisiert. Interaktive Werkzeuge, dieTestRunner-Implementierungen bereitstellen, können dies in ähnlicher Weise nutzen.
Die folgenden Methoden der Klasse
TestResultwerden verwendet, um die internen Datenstrukturen zu verwalten, und können in Unterklassen erweitert werden, um zusätzliche Berichterstattungsanforderungen zu unterstützen. Dies ist besonders nützlich beim Erstellen von Werkzeugen, die interaktive Berichterstattung unterstützen, während Tests ausgeführt werden.- startTest(test)¶
Wird aufgerufen, wenn die Testinstanz test kurz vor der Ausführung steht.
- stopTest(test)¶
Wird aufgerufen, nachdem die Testinstanz test ausgeführt wurde, unabhängig vom Ergebnis.
- startTestRun()¶
Wird einmal aufgerufen, bevor Tests ausgeführt werden.
Hinzugefügt in Version 3.1.
- stopTestRun()¶
Wird einmal nach der Ausführung aller Tests aufgerufen.
Hinzugefügt in Version 3.1.
- addError(test, err)¶
Wird aufgerufen, wenn die Testinstanz test eine unerwartete Ausnahme auslöst. err ist ein Tupel der Form, wie es von
sys.exc_info()zurückgegeben wird:(type, value, traceback).Die Standardimplementierung hängt ein Tupel
(test, formatted_err)an das Attributerrorsder Instanz an, wobei formatted_err ein formatierter Traceback ist, der von err abgeleitet wurde.
- addFailure(test, err)¶
Wird aufgerufen, wenn die Testinstanz test einen Fehlschlag signalisiert. err ist ein Tupel der Form, wie es von
sys.exc_info()zurückgegeben wird:(type, value, traceback).Die Standardimplementierung hängt ein Tupel
(test, formatted_err)an das Attributfailuresder Instanz an, wobei formatted_err ein formatierter Traceback ist, der von err abgeleitet wurde.
- addSuccess(test)¶
Wird aufgerufen, wenn die Testinstanz test erfolgreich war.
Die Standardimplementierung tut nichts.
- addSkip(test, reason)¶
Wird aufgerufen, wenn die Testinstanz test übersprungen wird. reason ist der Grund für die Überspringung des Tests.
Die Standardimplementierung hängt ein Tupel
(test, reason)an das Attributskippedder Instanz an.
- addExpectedFailure(test, err)¶
Wird aufgerufen, wenn die Testinstanz test fehlschlägt oder einen Fehler verursacht, aber mit dem Dekorator
expectedFailure()markiert wurde.Die Standardimplementierung hängt ein Tupel
(test, formatted_err)an das AttributexpectedFailuresder Instanz an, wobei formatted_err ein formatierter Traceback ist, der von err abgeleitet wurde.
- addUnexpectedSuccess(test)¶
Wird aufgerufen, wenn die Testinstanz test mit dem Dekorator
expectedFailure()markiert wurde, aber erfolgreich war.Die Standardimplementierung hängt den Test an das Attribut
unexpectedSuccessesder Instanz an.
- addSubTest(test, subtest, outcome)¶
Wird aufgerufen, wenn ein Subtest beendet wird. test ist die Testinstanz, die der Testmethode entspricht. subtest ist eine benutzerdefinierte
TestCase-Instanz, die den Subtest beschreibt.Wenn outcome
Noneist, war der Subtest erfolgreich. Andernfalls ist er mit einer Ausnahme fehlgeschlagen, wobei outcome ein Tupel der Form ist, wie es vonsys.exc_info()zurückgegeben wird:(type, value, traceback).Die Standardimplementierung tut nichts, wenn das Ergebnis ein Erfolg ist, und zeichnet Subtestfehler als normale Fehler auf.
Hinzugefügt in Version 3.4.
- addDuration(test, elapsed)¶
Wird aufgerufen, wenn die Testinstanz beendet wird. elapsed ist die Zeit in Sekunden und beinhaltet die Ausführung von Aufräumfunktionen.
Hinzugefügt in Version 3.12.
- class unittest.TextTestResult(stream, descriptions, verbosity, *, durations=None)¶
Eine konkrete Implementierung von
TestResult, die vonTextTestRunnerverwendet wird. Unterklassen sollten**kwargsakzeptieren, um die Kompatibilität bei Änderungen der Schnittstelle zu gewährleisten.Hinzugefügt in Version 3.2.
Geändert in Version 3.12: Der Keyword-Parameter durations wurde hinzugefügt.
- unittest.defaultTestLoader¶
Instanz der Klasse
TestLoader, die geteilt werden soll. Wenn keine Anpassung desTestLoadererforderlich ist, kann diese Instanz anstelle von wiederholtem Erstellen neuer Instanzen verwendet werden.
- class unittest.TextTestRunner(stream=None, descriptions=True, verbosity=1, failfast=False, buffer=False, resultclass=None, warnings=None, *, tb_locals=False, durations=None)¶
Eine grundlegende Test-Runner-Implementierung, die Ergebnisse in einen Stream ausgibt. Wenn stream
Noneist (Standard), wirdsys.stderrals Ausgabestrom verwendet. Diese Klasse verfügt über einige konfigurierbare Parameter, ist aber im Wesentlichen sehr einfach. Grafische Anwendungen, die Test-Suiten ausführen, sollten alternative Implementierungen bereitstellen. Solche Implementierungen sollten**kwargsals Schnittstelle akzeptieren, da sich die Schnittstelle zum Erstellen von Runnern ändert, wenn Funktionen zu unittest hinzugefügt werden.Standardmäßig zeigt dieser Runner
DeprecationWarning,PendingDeprecationWarning,ResourceWarningundImportWarningan, auch wenn diese standardmäßig ignoriert werden. Dieses Verhalten kann mit den Python-Optionen-Wdoder-Waüberschrieben werden (siehe Warnungssteuerung) und warnings aufNonebelassen.Geändert in Version 3.2: Der Parameter warnings wurde hinzugefügt.
Geändert in Version 3.2: Der Standard-Stream wird zur Instanziierungszeit auf
sys.stderrgesetzt, anstatt zur Importzeit.Geändert in Version 3.5: Der Parameter tb_locals wurde hinzugefügt.
Geändert in Version 3.12: Der Parameter durations wurde hinzugefügt.
- _makeResult()¶
Diese Methode gibt die Instanz von
TestResultzurück, die vonrun()verwendet wird. Sie ist nicht dafür bestimmt, direkt aufgerufen zu werden, kann aber in Unterklassen überschrieben werden, um ein benutzerdefiniertesTestResultbereitzustellen._makeResult()instanziiert die Klasse oder aufrufbare Funktion, die im Konstruktor vonTextTestRunnerals Argumentresultclassübergeben wird. Standardmäßig ist diesTextTestResult, wenn keineresultclassangegeben ist. Die Ergebnisklasse wird mit den folgenden Argumenten instanziiertstream, descriptions, verbosity
- run(test)¶
Diese Methode ist die Hauptschnittstelle für
TextTestRunner. Diese Methode nimmt eine Instanz vonTestSuiteoderTestCaseentgegen. EinTestResultwird durch Aufruf von_makeResult()erstellt, und die Tests werden ausgeführt und die Ergebnisse auf stdout gedruckt.
- unittest.main(module='__main__', defaultTest=None, argv=None, testRunner=None, testLoader=unittest.defaultTestLoader, exit=True, verbosity=1, failfast=None, catchbreak=None, buffer=None, warnings=None)¶
Ein Kommandozeilenprogramm, das eine Reihe von Tests aus module lädt und ausführt; dies dient hauptsächlich dazu, Testmodule bequem ausführbar zu machen. Die einfachste Verwendung dieser Funktion ist, die folgende Zeile am Ende eines Testskripts einzufügen
if __name__ == '__main__': unittest.main()
Sie können Tests mit detaillierteren Informationen ausführen, indem Sie das Argument verbosity übergeben
if __name__ == '__main__': unittest.main(verbosity=2)
Das Argument defaultTest ist entweder der Name eines einzelnen Tests oder eine Iterable von Testnamen, die ausgeführt werden sollen, wenn über argv keine Testnamen angegeben sind. Wenn es nicht angegeben oder
Noneist und keine Testnamen über argv bereitgestellt werden, werden alle in module gefundenen Tests ausgeführt.Das Argument argv kann eine Liste von Optionen sein, die an das Programm übergeben werden, wobei das erste Element der Programmname ist. Wenn es nicht angegeben oder
Noneist, werden die Werte vonsys.argvverwendet.Das Argument testRunner kann entweder eine Test-Runner-Klasse oder eine bereits erstellte Instanz davon sein. Standardmäßig ruft
mainsys.exit()mit einem Exit-Code auf, der den Erfolg (0) oder Misserfolg (1) der ausgeführten Tests angibt. Ein Exit-Code von 5 bedeutet, dass keine Tests ausgeführt oder übersprungen wurden.Das Argument testLoader muss eine Instanz von
TestLoadersein und ist standardmäßigdefaultTestLoader.mainunterstützt die Verwendung mit dem interaktiven Interpreter, indem das Argumentexit=Falseübergeben wird. Dies zeigt das Ergebnis auf der Standardausgabe an, ohnesys.exit()aufzurufen>>> from unittest import main >>> main(module='test_module', exit=False)
Die Parameter failfast, catchbreak und buffer haben die gleiche Auswirkung wie die gleichnamigen Kommandozeilenoptionen.
Das Argument warnings gibt den Warnungsfilter an, der beim Ausführen der Tests verwendet werden soll. Wenn es nicht angegeben ist, bleibt es
None, wenn eine-WOption an python übergeben wird (siehe Warnungssteuerung), andernfalls wird es auf'default'gesetzt.Der Aufruf von
maingibt ein Objekt mit dem Attributresultzurück, das das Ergebnis der ausgeführten Tests alsunittest.TestResultenthält.Geändert in Version 3.1: Der Parameter exit wurde hinzugefügt.
Geändert in Version 3.2: Die Parameter verbosity, failfast, catchbreak, buffer und warnings wurden hinzugefügt.
Geändert in Version 3.4: Der Parameter defaultTest wurde so geändert, dass er auch eine Iterable von Testnamen akzeptiert.
load_tests Protokoll¶
Hinzugefügt in Version 3.2.
Module oder Pakete können anpassen, wie Tests von ihnen während normaler Testläufe oder Testentdeckung geladen werden, indem sie eine Funktion namens load_tests implementieren.
Wenn ein Testmodul load_tests definiert, wird es von TestLoader.loadTestsFromModule() mit den folgenden Argumenten aufgerufen
load_tests(loader, standard_tests, pattern)
wobei pattern direkt von loadTestsFromModule weitergegeben wird. Es ist standardmäßig None.
Es sollte eine TestSuite zurückgegeben werden.
loader ist die Instanz von TestLoader, die das Laden durchführt. standard_tests sind die Tests, die standardmäßig aus dem Modul geladen würden. Es ist üblich, dass Testmodule nur Tests aus dem Standardsatz von Tests hinzufügen oder entfernen möchten. Das dritte Argument wird beim Laden von Paketen als Teil der Testentdeckung verwendet.
Eine typische load_tests Funktion, die Tests aus einem bestimmten Satz von TestCase-Klassen lädt, könnte so aussehen
test_cases = (TestCase1, TestCase2, TestCase3)
def load_tests(loader, tests, pattern):
suite = TestSuite()
for test_class in test_cases:
tests = loader.loadTestsFromTestCase(test_class)
suite.addTests(tests)
return suite
Wenn die Entdeckung in einem Verzeichnis mit einer Paketstruktur gestartet wird, entweder über die Kommandozeile oder durch Aufruf von TestLoader.discover(), dann wird die __init__.py Datei des Pakets auf load_tests geprüft. Wenn diese Funktion nicht existiert, wird die Entdeckung in das Paket rekursiv fortgesetzt, als wäre es nur ein weiteres Verzeichnis. Andernfalls wird die Entdeckung der Tests des Pakets load_tests überlassen, die mit den folgenden Argumenten aufgerufen wird
load_tests(loader, standard_tests, pattern)
Dies sollte eine TestSuite zurückgeben, die alle Tests aus dem Paket repräsentiert. (standard_tests enthält nur Tests, die aus __init__.py gesammelt wurden.)
Da das Muster an load_tests übergeben wird, ist das Paket frei, die Testentdeckung fortzusetzen (und potenziell zu modifizieren). Eine load_tests Funktion, die nichts tut, für ein Testpaket würde so aussehen
def load_tests(loader, standard_tests, pattern):
# top level directory cached on loader instance
this_dir = os.path.dirname(__file__)
package_tests = loader.discover(start_dir=this_dir, pattern=pattern)
standard_tests.addTests(package_tests)
return standard_tests
Geändert in Version 3.5: Die Entdeckung prüft Paketnamen nicht mehr auf Übereinstimmung mit dem pattern, da Paketnamen nicht mit dem Standardmuster übereinstimmen können.
Klassen- und Modul-Fixtures¶
Klassen- und Modul-Level-Fixtures werden in TestSuite implementiert. Wenn die Test-Suite auf einen Test aus einer neuen Klasse trifft, wird die tearDownClass() der vorherigen Klasse (falls vorhanden) aufgerufen, gefolgt von setUpClass() der neuen Klasse.
Ähnlich, wenn ein Test aus einem anderen Modul als der vorherige Test stammt, wird tearDownModule aus dem vorherigen Modul ausgeführt, gefolgt von setUpModule aus dem neuen Modul.
Nachdem alle Tests ausgeführt wurden, werden die abschließenden tearDownClass und tearDownModule aufgerufen.
Beachten Sie, dass gemeinsame Fixtures nicht gut mit [potenziellen] Funktionen wie Testparallelisierung harmonieren und die Testisolation brechen. Sie sollten mit Vorsicht verwendet werden.
Die Standardreihenfolge der Tests, die von den unittest-Testladern erstellt werden, ist, alle Tests aus denselben Modulen und Klassen zusammenzufassen. Dies führt dazu, dass setUpClass / setUpModule (usw.) genau einmal pro Klasse und Modul aufgerufen werden. Wenn Sie die Reihenfolge zufällig ändern, so dass Tests aus verschiedenen Modulen und Klassen nebeneinander liegen, können diese gemeinsamen Fixture-Funktionen während eines Testlaufs mehrmals aufgerufen werden.
Gemeinsame Fixtures sind nicht für Suiten mit nicht standardmäßiger Reihenfolge vorgesehen. Eine BaseTestSuite existiert weiterhin für Frameworks, die keine Unterstützung für gemeinsame Fixtures wünschen.
Wenn während einer der gemeinsamen Fixture-Funktionen Ausnahmen ausgelöst werden, wird der Test als Fehler gemeldet. Da es keine entsprechende Testinstanz gibt, wird ein _ErrorHolder-Objekt (das die gleiche Schnittstelle wie ein TestCase hat) erstellt, um den Fehler darzustellen. Wenn Sie nur den Standard-unittest-Test-Runner verwenden, ist dieses Detail unerheblich, aber wenn Sie ein Framework-Autor sind, kann es relevant sein.
setUpClass und tearDownClass¶
Diese müssen als Klassenmethoden implementiert werden
import unittest
class Test(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls._connection = createExpensiveConnectionObject()
@classmethod
def tearDownClass(cls):
cls._connection.destroy()
Wenn Sie möchten, dass die setUpClass und tearDownClass von Basisklassen aufgerufen werden, müssen Sie sie selbst aufrufen. Die Implementierungen in TestCase sind leer.
Wenn während eines setUpClass eine Ausnahme ausgelöst wird, werden die Tests in der Klasse nicht ausgeführt und tearDownClass nicht ausgeführt. Übersprungene Klassen haben weder setUpClass noch tearDownClass ausgeführt. Wenn die Ausnahme eine SkipTest-Ausnahme ist, wird die Klasse als übersprungen statt als Fehler gemeldet.
setUpModule und tearDownModule¶
Diese sollten als Funktionen implementiert werden
def setUpModule():
createConnection()
def tearDownModule():
closeConnection()
Wenn in einem setUpModule eine Ausnahme ausgelöst wird, werden keine Tests im Modul ausgeführt und tearDownModule wird nicht ausgeführt. Wenn die Ausnahme eine SkipTest-Ausnahme ist, wird das Modul als übersprungen statt als Fehler gemeldet.
Um Aufräumcode hinzuzufügen, der auch im Falle einer Ausnahme ausgeführt werden muss, verwenden Sie addModuleCleanup
- unittest.addModuleCleanup(function, /, *args, **kwargs)¶
Fügt eine Funktion hinzu, die nach
tearDownModule()aufgerufen wird, um Ressourcen aufzuräumen, die während der Testklasse verwendet wurden. Funktionen werden in umgekehrter Reihenfolge ihrer Hinzufügung aufgerufen (letzter Ein, erster Aus - LIFO). Sie werden mit den Argumenten und Schlüsselwortargumenten aufgerufen, die anaddModuleCleanup()übergeben wurden, als sie hinzugefügt wurden.Wenn
setUpModule()fehlschlägt, d. h.tearDownModule()nicht aufgerufen wird, werden die hinzugefügten Bereinigungsfunktionen trotzdem aufgerufen.Hinzugefügt in Version 3.8.
- unittest.enterModuleContext(cm)¶
Betritt den bereitgestellten Kontextmanager. Wenn dies erfolgreich ist, wird auch seine Methode
__exit__()als Bereinigungsfunktion durchaddModuleCleanup()hinzugefügt und das Ergebnis der Methode__enter__()zurückgegeben.Hinzugefügt in Version 3.11.
- unittest.doModuleCleanups()¶
Diese Funktion wird bedingungslos nach
tearDownModule()aufgerufen, oder nachsetUpModule(), wennsetUpModule()eine Ausnahme auslöst.Sie ist dafür verantwortlich, alle Bereinigungsfunktionen aufzurufen, die von
addModuleCleanup()hinzugefügt wurden. Wenn Sie möchten, dass Bereinigungsfunktionen *vor*tearDownModule()aufgerufen werden, können SiedoModuleCleanups()selbst aufrufen.doModuleCleanups()entfernt Methoden vom Stapel der Bereinigungsfunktionen nacheinander, sodass sie jederzeit aufgerufen werden kann.Hinzugefügt in Version 3.8.
Signalbehandlung¶
Hinzugefügt in Version 3.2.
Die Kommandozeilenoption -c/--catch für unittest zusammen mit dem Parameter catchbreak für unittest.main() sorgen für eine benutzerfreundlichere Behandlung von Strg+C während eines Testlaufs. Mit aktivierter Strg+C-Verhalten wird der aktuell laufende Test abgeschlossen, der Testlauf wird dann beendet und alle bisherigen Ergebnisse gemeldet. Ein zweites Strg+C löst wie üblich eine KeyboardInterrupt aus.
Der Signalhandler für die Strg+C-Behandlung versucht, mit Code oder Tests kompatibel zu bleiben, die ihren eigenen signal.SIGINT-Handler installieren. Wenn der unittest-Handler aufgerufen wird, aber *nicht* der installierte signal.SIGINT-Handler ist, d. h. er wurde vom System unter Test ersetzt und delegiert, ruft er den Standardhandler auf. Dies ist normalerweise das erwartete Verhalten von Code, der einen installierten Handler ersetzt und an ihn delegiert. Für einzelne Tests, bei denen die Strg+C-Behandlung von unittest deaktiviert werden muss, kann der Dekorator removeHandler() verwendet werden.
Es gibt einige Hilfsfunktionen für Framework-Autoren, um die Strg+C-Behandlungsfunktionalität innerhalb von Test-Frameworks zu ermöglichen.
- unittest.installHandler()¶
Installiert den Strg+C-Handler. Wenn ein
signal.SIGINTempfangen wird (normalerweise als Reaktion auf die Eingabe von Strg+C durch den Benutzer), wird für alle registrierten Ergebnissestop()aufgerufen.
- unittest.registerResult(result)¶
Registriert ein
TestResult-Objekt für die Strg+C-Behandlung. Das Registrieren eines Ergebnisses speichert eine schwache Referenz darauf, sodass es die Garbage Collection des Ergebnisses nicht verhindert.Das Registrieren eines
TestResult-Objekts hat keine Nebenwirkungen, wenn die Strg+C-Behandlung nicht aktiviert ist. Test-Frameworks können also alle von ihnen erstellten Ergebnisse bedingungslos registrieren, unabhängig davon, ob die Behandlung aktiviert ist oder nicht.
- unittest.removeResult(result)¶
Entfernt ein registriertes Ergebnis. Sobald ein Ergebnis entfernt wurde, wird
stop()für dieses Ergebnisobjekt aufgrund eines Strg+C nicht mehr aufgerufen.
- unittest.removeHandler(function=None)¶
Wenn diese Funktion ohne Argumente aufgerufen wird, entfernt sie den Strg+C-Handler, falls er installiert wurde. Diese Funktion kann auch als Test-Dekorator verwendet werden, um den Handler während der Ausführung des Tests vorübergehend zu entfernen
@unittest.removeHandler def test_signal_handling(self): ...