test — Paket mit den Regressionstests für Python

Bemerkung

Das Paket test ist nur für den internen Gebrauch durch Python gedacht. Es ist für die Kernentwickler von Python beschrieben. Von der Verwendung außerhalb der Python-Standardbibliothek wird abgeraten, denn der hier genannte Code kann sich zwischen Python-Veröffentlichungen ohne Vorankündigung ändern oder wegfallen.


Das Paket test enthält alle Regressionstests für Python sowie die Module test.support und test.regrtest. test.support dient dazu, deine Tests zu erweitern, während test.regrtest die Testsuite steuert.

Jedes Modul im Paket test, dessen Name mit test_ beginnt, ist eine Testsuite für ein bestimmtes Modul oder Merkmal. Alle neuen Tests sollten mit dem Modul unittest oder doctest geschrieben werden. Einige ältere Tests sind in einem „traditionellen“ Teststil geschrieben, der die nach sys.stdout ausgegebene Ausgabe vergleicht. Dieser Teststil gilt als veraltet.

Siehe auch

Modul unittest

PyUnit-Regressionstests schreiben.

Modul doctest

Tests, die in Docstrings eingebettet sind.

Unit-Tests für das Paket test schreiben

Für Tests, die das Modul unittest verwenden, sind einige Regeln erwünscht. Eine davon: Der Name des Testmoduls beginnt mit test_ und endet mit dem Namen des geprüften Moduls. Die Testmethoden im Testmodul sollten mit test_ beginnen und mit einer Beschreibung dessen enden, was die Methode prüft. Das ist nötig, damit der Testtreiber sie als Testmethoden erkennt. Außerdem sollte die Methode keinen Docstring enthalten; die Dokumentation von Testmethoden gehört in einen Kommentar, etwa # Tests function returns only True or False. Der Grund: Docstrings werden ausgegeben, wenn es sie gibt, und dann steht nicht mehr da, welcher Test gerade läuft.

Häufig dient folgendes Boilerplate als Grundlage:

import unittest
from test import support

class MyTestCase1(unittest.TestCase):

    # Only use setUp() and tearDown() if necessary

    def setUp(self):
        ... code to execute in preparation for tests ...

    def tearDown(self):
        ... code to execute to clean up after tests ...

    def test_feature_one(self):
        # Test feature one.
        ... testing code ...

    def test_feature_two(self):
        # Test feature two.
        ... testing code ...

    ... more test methods ...

class MyTestCase2(unittest.TestCase):
    ... same structure as MyTestCase1 ...

... more test classes ...

if __name__ == '__main__':
    unittest.main()

Mit diesem Codemuster lässt sich die Testsuite von test.regrtest ausführen, für sich allein als Skript, das die Befehlszeilenschnittstelle von unittest unterstützt, oder über die Befehlszeilenschnittstelle python -m unittest.

Ziel des Regressionstests ist es, Code zum Scheitern zu bringen. Daraus ergeben sich einige Regeln:

  • Die Testsuite sollte alle Klassen, Funktionen und Konstanten durchspielen. Dazu gehört nicht nur die äußere API, die nach außen gezeigt wird, sondern auch „privater“ Code.

  • Whitebox-Tests sind vorzuziehen, bei denen man beim Schreiben der Tests den geprüften Code ansieht. Blackbox-Tests, die nur die veröffentlichte Benutzerschnittstelle prüfen, sind nicht vollständig genug, um alle Rand- und Grenzfälle abzudecken.

  • Stelle sicher, dass alle möglichen Werte geprüft werden, auch die ungültigen. So ist nicht nur gesichert, dass alle gültigen Werte angenommen werden, sondern auch, dass unpassende Werte richtig behandelt werden.

  • Erschöpfe so viele Codepfade wie möglich. Prüfe, wo verzweigt wird, und schneide die Eingabe so zu, dass möglichst viele verschiedene Pfade durch den Code genommen werden.

  • Ergänze für jeden gefundenen Fehler im geprüften Code einen eigenen Test. So ist sichergestellt, dass der Fehler nicht wieder auftaucht, wenn der Code später geändert wird.

  • Räume nach deinen Tests auf, schließe und entferne also zum Beispiel alle temporären Dateien.

  • Hängt ein Test von einer bestimmten Bedingung des Betriebssystems ab, prüfe vorab, ob diese Bedingung schon erfüllt ist, bevor du den Test versuchst.

  • Importiere so wenige Module wie möglich und so früh wie möglich. Das hält die äußeren Abhängigkeiten der Tests klein und ebenso das mögliche ungewöhnliche Verhalten durch Nebenwirkungen eines Modulimports.

  • Versuche, Code so weit wie möglich wiederzuverwenden. Manchmal unterscheiden sich Tests nur in einer Kleinigkeit, etwa im verwendeten Eingabetyp. Halte doppelten Code klein, indem du von einer Basistestklasse eine Klasse ableitest, die die Eingabe festlegt:

    class TestFuncAcceptsSequencesMixin:
    
        func = mySuperWhammyFunction
    
        def test_func(self):
            self.func(self.arg)
    
    class AcceptLists(TestFuncAcceptsSequencesMixin, unittest.TestCase):
        arg = [1, 2, 3]
    
    class AcceptStrings(TestFuncAcceptsSequencesMixin, unittest.TestCase):
        arg = 'abc'
    
    class AcceptTuples(TestFuncAcceptsSequencesMixin, unittest.TestCase):
        arg = (1, 2, 3)
    

    Denk bei diesem Muster daran, dass alle Klassen, die von unittest.TestCase erben, als Tests ausgeführt werden. Die Klasse TestFuncAcceptsSequencesMixin im Beispiel oben hat keine Daten und lässt sich daher nicht für sich allein ausführen. Deshalb erbt sie nicht von unittest.TestCase.

Siehe auch

Test Driven Development

Ein Buch von Kent Beck darüber, Tests vor dem Code zu schreiben.

Tests über die Befehlszeilenschnittstelle ausführen

Das Paket test lässt sich dank der Option -m als Skript ausführen, um die Regressionstestsuite von Python zu steuern: python -m test. Darunter kommt test.regrtest zum Einsatz. Der Aufruf python -m test.regrtest, wie ihn frühere Python-Versionen verwendeten, funktioniert weiterhin. Führt man das Skript allein aus, laufen selbsttätig alle Regressionstests im Paket test. Dazu sucht es Module und Pakete, deren Namen mit test_ beginnen, importiert jedes davon und lädt seine Tests mit unittest.TestLoader.loadTestsFromModule(). Das load_tests-Protokoll beschreibt, wie ein Modul oder Paket anpassen kann, was geladen wird. Eine Funktion test_main() auf Modulebene zu definieren wird nicht unterstützt und lässt den Test scheitern. Dem Skript lassen sich auch die Namen der auszuführenden Tests übergeben. Gibt man einen einzelnen Regressionstest an (python -m test test_spam), bleibt die Ausgabe knapp und es wird nur ausgegeben, ob der Test bestanden wurde oder nicht.

Führt man test unmittelbar aus, lässt sich festlegen, welche Ressourcen den Tests zur Verfügung stehen. Dazu dient die Befehlszeilenoption -u. Gibt man all als Wert für -u an, werden alle möglichen Ressourcen eingeschaltet: python -m test -uall. Will man alle außer einer Ressource – der häufigere Fall –, lässt sich nach all eine durch Kommas getrennte Liste der unerwünschten Ressourcen angeben. Der Befehl python -m test -uall,-audio,-largefile führt test mit allen Ressourcen außer audio und largefile aus. Eine Liste aller Ressourcen und weitere Befehlszeilenoptionen liefert python -m test -h.

Weitere Wege, die Regressionstests auszuführen, hängen von der Plattform ab. Unter Unix kannst du make test im obersten Verzeichnis ausführen, in dem Python gebaut wurde. Unter Windows führt rt.bat aus deinem PCbuild-Verzeichnis alle Regressionstests aus.

Added in version 3.14: Die Ausgabe ist voreingestellt farbig und lässt sich über Umgebungsvariablen steuern.

test.support — Werkzeuge für die Python-Testsuite

Das Modul test.support unterstützt die Regressionstestsuite von Python.

Bemerkung

test.support ist kein öffentliches Modul. Es ist hier beschrieben, um Python-Entwicklern beim Schreiben von Tests zu helfen. Die API dieses Moduls kann sich zwischen Veröffentlichungen ändern, ohne Rücksicht auf Rückwärtskompatibilität.

Dieses Modul definiert die folgenden Ausnahmen:

exception test.support.TestFailed

Ausnahme, die ausgelöst werden soll, wenn ein Test scheitert. Veraltet zugunsten von Tests auf unittest-Basis und den Zusicherungsmethoden von unittest.TestCase.

exception test.support.ResourceDenied

Unterklasse von unittest.SkipTest. Wird ausgelöst, wenn eine Ressource nicht zur Verfügung steht, etwa eine Netzwerkverbindung. Ausgelöst von der Funktion requires().

Das Modul test.support definiert die folgenden Konstanten:

test.support.verbose

True, wenn die ausführliche Ausgabe eingeschaltet ist. Sollte geprüft werden, wenn genauere Angaben zu einem laufenden Test gewünscht sind. verbose wird von test.regrtest gesetzt.

test.support.is_jython

True, wenn der laufende Interpreter Jython ist.

test.support.is_android

True, wenn sys.platform android ist.

test.support.is_emscripten

True, wenn sys.platform emscripten ist.

test.support.is_wasi

True, wenn sys.platform wasi ist.

test.support.is_apple_mobile

True, wenn sys.platform ios, tvos oder watchos ist.

test.support.is_apple

True, wenn sys.platform darwin ist oder is_apple_mobile True ist.

test.support.unix_shell

Pfad zur Shell, wenn nicht unter Windows, sonst None.

test.support.LOOPBACK_TIMEOUT

Zeitgrenze in Sekunden für Tests mit einem Netzwerkserver, der auf der lokalen Loopback-Schnittstelle wie 127.0.0.1 lauscht.

Die Zeitgrenze ist lang genug, damit der Test nicht scheitert: Sie berücksichtigt, dass Client und Server in verschiedenen Threads oder sogar verschiedenen Prozessen laufen können.

Die Zeitgrenze sollte für die Methoden connect(), recv() und send() von socket.socket lang genug sein.

Der voreingestellte Wert beträgt 10 Sekunden.

Siehe auch INTERNET_TIMEOUT.

test.support.INTERNET_TIMEOUT

Zeitgrenze in Sekunden für Netzwerkanfragen ins Internet.

Die Zeitgrenze ist kurz genug, damit ein Test nicht zu lange wartet, wenn die Internetanfrage aus irgendeinem Grund blockiert ist.

Eine Zeitüberschreitung mit INTERNET_TIMEOUT sollte einen Test normalerweise nicht als gescheitert markieren, sondern ihn überspringen. Siehe transient_internet().

Der voreingestellte Wert beträgt 1 Minute.

Siehe auch LOOPBACK_TIMEOUT.

test.support.SHORT_TIMEOUT

Zeitgrenze in Sekunden, nach der ein Test als gescheitert markiert wird, weil er „zu lange“ braucht.

Der Wert der Zeitgrenze hängt von der Befehlszeilenoption --timeout von regrtest ab.

Scheitert ein Test mit SHORT_TIMEOUT auf langsamen Buildbots zufällig, verwende stattdessen LONG_TIMEOUT.

Der voreingestellte Wert beträgt 30 Sekunden.

test.support.LONG_TIMEOUT

Zeitgrenze in Sekunden, um zu erkennen, dass ein Test hängt.

Sie ist lang genug, um das Risiko zu senken, dass Tests auf den langsamsten Python-Buildbots scheitern. Sie sollte nicht dazu dienen, einen Test als gescheitert zu markieren, weil er „zu lange“ braucht. Der Wert der Zeitgrenze hängt von der Befehlszeilenoption --timeout von regrtest ab.

Der voreingestellte Wert beträgt 5 Minuten.

Siehe auch LOOPBACK_TIMEOUT, INTERNET_TIMEOUT und SHORT_TIMEOUT.

test.support.PGO

Gesetzt, wenn Tests übersprungen werden dürfen, weil sie für PGO nichts bringen.

test.support.PIPE_MAX_SIZE

Eine Konstante, die voraussichtlich größer ist als die Puffergröße der Pipes des Betriebssystems, damit Schreibvorgänge blockieren.

test.support.Py_DEBUG

True, wenn Python mit definiertem Makro Py_DEBUG gebaut wurde, also wenn Python im Debug-Modus gebaut wurde.

Added in version 3.12.

test.support.SOCK_MAX_SIZE

Eine Konstante, die voraussichtlich größer ist als die Puffergröße der Sockets des Betriebssystems, damit Schreibvorgänge blockieren.

test.support.TEST_SUPPORT_DIR

Enthält das oberste Verzeichnis, in dem test.support liegt.

test.support.TEST_HOME_DIR

Enthält das oberste Verzeichnis des Testpakets.

test.support.TEST_DATA_DIR

Enthält das Verzeichnis data innerhalb des Testpakets.

test.support.MAX_Py_ssize_t

Für Tests mit großem Speicherbedarf auf sys.maxsize gesetzt.

test.support.max_memuse

Von set_memlimit() als Speichergrenze für Tests mit großem Speicherbedarf gesetzt. Begrenzt durch MAX_Py_ssize_t.

test.support.real_max_memuse

Von set_memlimit() als Speichergrenze für Tests mit großem Speicherbedarf gesetzt. Nicht begrenzt durch MAX_Py_ssize_t.

test.support.MISSING_C_DOCSTRINGS

True, wenn Python ohne Docstrings gebaut ist, das Makro WITH_DOC_STRINGS also nicht definiert ist. Siehe die Option configure --without-doc-strings.

Siehe auch die Variable HAVE_DOCSTRINGS.

test.support.HAVE_DOCSTRINGS

True, wenn Docstrings von Funktionen zur Verfügung stehen. Siehe die Option python -OO, die die Docstrings von in Python umgesetzten Funktionen entfernt.

Siehe auch die Variable MISSING_C_DOCSTRINGS.

test.support.TEST_HTTP_URL

Legt die URL eines eigenen HTTP-Servers für die Netzwerktests fest.

test.support.ALWAYS_EQ

Objekt, das allem gleich ist. Dient dazu, Vergleiche gemischter Typen zu prüfen.

test.support.NEVER_EQ

Objekt, das nichts gleich ist, auch nicht ALWAYS_EQ. Dient dazu, Vergleiche gemischter Typen zu prüfen.

test.support.LARGEST

Objekt, das größer ist als alles andere, außer als es selbst. Dient dazu, Vergleiche gemischter Typen zu prüfen.

test.support.SMALLEST

Objekt, das kleiner ist als alles andere, außer als es selbst. Dient dazu, Vergleiche gemischter Typen zu prüfen.

Das Modul test.support definiert die folgenden Funktionen:

test.support.busy_retry(timeout, err_msg=None, /, *, error=True)

Führt den Schleifenkörper aus, bis break die Schleife beendet.

Löst nach timeout Sekunden einen AssertionError aus, wenn error wahr ist, oder beendet einfach die Schleife, wenn error falsch ist.

Beispiel:

for _ in support.busy_retry(support.SHORT_TIMEOUT):
    if check():
        break

Beispiel für die Verwendung mit error=False:

for _ in support.busy_retry(support.SHORT_TIMEOUT, error=False):
    if check():
        break
else:
    raise RuntimeError('my custom error')
test.support.sleeping_retry(timeout, err_msg=None, /, *, init_delay=0.010, max_delay=1.0, error=True)

Wartestrategie mit exponentiellem Zurückweichen.

Führt den Schleifenkörper aus, bis break die Schleife beendet. Schläft bei jedem Schleifendurchlauf, aber nicht beim ersten. Die Schlafdauer verdoppelt sich mit jedem Durchlauf, bis zu max_delay Sekunden.

Zur Verwendung der Parameter siehe die Dokumentation von busy_retry().

Beispiel, das nach SHORT_TIMEOUT Sekunden eine Ausnahme auslöst:

for _ in support.sleeping_retry(support.SHORT_TIMEOUT):
    if check():
        break

Beispiel für die Verwendung mit error=False:

for _ in support.sleeping_retry(support.SHORT_TIMEOUT, error=False):
    if check():
        break
else:
    raise RuntimeError('my custom error')
test.support.is_resource_enabled(resource)

Gibt True zurück, wenn resource eingeschaltet und verfügbar ist. Die Liste der verfügbaren Ressourcen wird nur gesetzt, wenn test.regrtest die Tests ausführt.

test.support.get_resource_value(resource)

Gibt den für resource angegebenen Wert zurück (als -u resource=value). Gibt None zurück, wenn resource abgeschaltet ist oder kein Wert angegeben wurde.

test.support.python_is_optimized()

Gibt True zurück, wenn Python nicht mit -O0 oder -Og gebaut wurde.

test.support.with_pymalloc()

Gibt True zurück, wenn Python mit pymalloc eingeschaltet gebaut wurde und kein Build mit freien Threads ist.

test.support.requires(resource, msg=None)

Löst ResourceDenied aus, wenn resource nicht zur Verfügung steht. msg ist das Argument für ResourceDenied, falls sie ausgelöst wird. Gibt immer True zurück, wenn der Aufruf aus einer Funktion kommt, deren __name__ '__main__' ist. Wird verwendet, wenn test.regrtest die Tests ausführt.

test.support.sortdict(dict)

Gibt eine repr-Darstellung von dict mit sortierten Schlüsseln zurück.

test.support.findfile(filename, subdir=None)

Gibt den Pfad zur Datei mit dem Namen filename zurück. Wird keine Entsprechung gefunden, wird filename zurückgegeben. Das bedeutet kein Scheitern, denn es kann der Pfad zur Datei sein.

Setzt man subdir, gibt das einen relativen Pfad an, über den die Datei gesucht wird, statt unmittelbar in den Verzeichnissen des Pfades zu suchen.

test.support.get_pagesize()

Liefert die Größe einer Speicherseite in Bytes.

Added in version 3.12.

test.support.setswitchinterval(interval)

Setzt sys.setswitchinterval() auf das angegebene interval. Legt für Android-Systeme ein kleinstes Intervall fest, damit das System nicht hängen bleibt.

test.support.check_impl_detail(**guards)

Mit dieser Prüfung sicherst du Tests ab, die von der CPython-Umsetzung abhängen, oder führst sie nur auf den Umsetzungen aus, die die Argumente benennen. Die Funktion gibt je nach Hostplattform True oder False zurück. Beispiel:

check_impl_detail()               # Only on CPython (default).
check_impl_detail(jython=True)    # Only on Jython.
check_impl_detail(cpython=False)  # Everywhere except CPython.
test.support.set_memlimit(limit)

Setzt die Werte von max_memuse und real_max_memuse für Tests mit großem Speicherbedarf.

test.support.record_original_stdout(stdout)

Speichert den Wert von stdout. Er soll stdout zu dem Zeitpunkt festhalten, an dem der regrtest begann.

test.support.get_original_stdout()

Gibt das ursprüngliche stdout zurück, das record_original_stdout() gesetzt hat, oder sys.stdout, wenn es nicht gesetzt ist.

test.support.args_from_interpreter_flags()

Gibt eine Liste von Befehlszeilenargumenten zurück, die die aktuellen Einstellungen in sys.flags und sys.warnoptions nachbilden.

test.support.optim_args_from_interpreter_flags()

Gibt eine Liste von Befehlszeilenargumenten zurück, die die aktuellen Optimierungseinstellungen in sys.flags nachbilden.

test.support.captured_stdin()
test.support.captured_stdout()
test.support.captured_stderr()

Ein Kontextmanager, der den genannten Strom vorübergehend durch ein io.StringIO-Objekt ersetzt.

Beispiel für die Verwendung mit Ausgabeströmen:

with captured_stdout() as stdout, captured_stderr() as stderr:
    print("hello")
    print("error", file=sys.stderr)
assert stdout.getvalue() == "hello\n"
assert stderr.getvalue() == "error\n"

Beispiel für die Verwendung mit dem Eingabestrom:

with captured_stdin() as stdin:
    stdin.write('hello\n')
    stdin.seek(0)
    # call test code that consumes from sys.stdin
    captured = input()
self.assertEqual(captured, "hello")
test.support.disable_faulthandler()

Ein Kontextmanager, der faulthandler vorübergehend abschaltet.

test.support.gc_collect()

Erzwingt, dass so viele Objekte wie möglich eingesammelt werden. Das ist nötig, weil der Garbage Collector keine zeitnahe Freigabe garantiert. Daher können __del__-Methoden später aufgerufen werden als erwartet und Weakrefs länger am Leben bleiben als erwartet.

test.support.disable_gc()

Ein Kontextmanager, der beim Eintritt den Garbage Collector abschaltet. Beim Verlassen wird sein vorheriger Zustand wiederhergestellt.

test.support.swap_attr(obj, attr, new_val)

Kontextmanager, um ein Attribut gegen ein neues Objekt auszutauschen.

Verwendung:

with swap_attr(obj, "attr", 5):
    ...

Das setzt obj.attr für die Dauer des with-Blocks auf 5 und stellt am Ende des Blocks den alten Wert wieder her. Gibt es attr an obj nicht, wird es erzeugt und am Ende des Blocks wieder gelöscht.

Der alte Wert – oder None, wenn es ihn nicht gibt – wird dem Ziel der „as“-Klausel zugewiesen, sofern es eine gibt.

test.support.swap_item(obj, attr, new_val)

Kontextmanager, um einen Eintrag gegen ein neues Objekt auszutauschen.

Verwendung:

with swap_item(obj, "item", 5):
    ...

Das setzt obj["item"] für die Dauer des with-Blocks auf 5 und stellt am Ende des Blocks den alten Wert wieder her. Gibt es item an obj nicht, wird es erzeugt und am Ende des Blocks wieder gelöscht.

Der alte Wert – oder None, wenn es ihn nicht gibt – wird dem Ziel der „as“-Klausel zugewiesen, sofern es eine gibt.

test.support.flush_std_streams()

Ruft die Methode flush() auf sys.stdout und dann auf sys.stderr auf. Damit lässt sich sicherstellen, dass die Reihenfolge der Protokolleinträge stimmt, bevor nach stderr geschrieben wird.

Added in version 3.11.

test.support.print_warning(msg)

Gibt eine Warnung nach sys.__stderr__ aus. Formatiert die Meldung als f"Warning -- {msg}". Besteht msg aus mehreren Zeilen, wird jeder Zeile das Präfix "Warning -- " vorangestellt.

Added in version 3.9.

test.support.wait_process(pid, *, exitcode, timeout=None)

Wartet, bis der Prozess pid fertig ist, und prüft, dass sein Beendigungscode exitcode ist.

Löst einen AssertionError aus, wenn der Beendigungscode des Prozesses nicht exitcode ist.

Läuft der Prozess länger als timeout Sekunden (voreingestellt SHORT_TIMEOUT), wird er abgebrochen und ein AssertionError ausgelöst. Die Zeitgrenze steht unter Windows nicht zur Verfügung.

Added in version 3.9.

test.support.calcobjsize(fmt)

Gibt die Größe des PyObject zurück, dessen Strukturelemente durch fmt festgelegt sind. Der zurückgegebene Wert umfasst die Größe des Python-Objektkopfes und die Ausrichtung.

test.support.calcvobjsize(fmt)

Gibt die Größe des PyVarObject zurück, dessen Strukturelemente durch fmt festgelegt sind. Der zurückgegebene Wert umfasst die Größe des Python-Objektkopfes und die Ausrichtung.

test.support.checksizeof(test, o, size)

Sichert für den Testfall test zu, dass sys.getsizeof für o plus die Größe des GC-Kopfes gleich size ist.

@test.support.anticipate_failure(condition)

Ein Dekorator, der Tests bedingt mit @unittest.expectedFailure markiert. Zu jeder Verwendung dieses Dekorators sollte ein Kommentar stehen, der das zugehörige Ticket benennt.

test.support.system_must_validate_cert(f)

Ein Dekorator, der den dekorierten Test überspringt, wenn die Prüfung von TLS-Zertifikaten fehlschlägt.

@test.support.run_with_locale(catstr, *locales)

Ein Dekorator, der eine Funktion in einer anderen Locale ausführt und diese danach richtig zurücksetzt. catstr ist die Locale-Kategorie als Zeichenkette, zum Beispiel "LC_ALL". Die übergebenen locales werden der Reihe nach probiert; die erste gültige Locale wird verwendet.

@test.support.run_with_tz(tz)

Ein Dekorator, der eine Funktion in einer bestimmten Zeitzone ausführt und diese danach richtig zurücksetzt.

@test.support.requires_freebsd_version(*min_version)

Dekorator für die kleinste Version, wenn der Test unter FreeBSD läuft. Ist die FreeBSD-Version kleiner als die kleinste, wird der Test übersprungen.

@test.support.requires_linux_version(*min_version)

Dekorator für die kleinste Version, wenn der Test unter Linux läuft. Ist die Linux-Version kleiner als die kleinste, wird der Test übersprungen.

@test.support.requires_mac_version(*min_version)

Dekorator für die kleinste Version, wenn der Test unter macOS läuft. Ist die macOS-Version kleiner als die kleinste, wird der Test übersprungen.

@test.support.requires_gil_enabled

Dekorator, um Tests beim Build mit freien Threads zu überspringen. Ist der GIL abgeschaltet, wird der Test übersprungen.

@test.support.requires_IEEE_754

Dekorator, um Tests auf Plattformen ohne IEEE 754 zu überspringen.

@test.support.requires_zlib

Dekorator, um Tests zu überspringen, wenn es zlib nicht gibt.

@test.support.requires_gzip

Dekorator, um Tests zu überspringen, wenn es gzip nicht gibt.

@test.support.requires_bz2

Dekorator, um Tests zu überspringen, wenn es bz2 nicht gibt.

@test.support.requires_lzma

Dekorator, um Tests zu überspringen, wenn es lzma nicht gibt.

@test.support.requires_resource(resource)

Dekorator, um Tests zu überspringen, wenn resource nicht zur Verfügung steht.

@test.support.requires_docstrings

Dekorator, der den Test nur bei HAVE_DOCSTRINGS ausführt.

@test.support.requires_limited_api

Dekorator, der den Test nur ausführt, wenn die eingeschränkte C-API zur Verfügung steht.

@test.support.cpython_only

Dekorator für Tests, die nur für CPython gelten.

@test.support.impl_detail(msg=None, **guards)

Dekorator, der check_impl_detail() mit guards aufruft. Gibt das False zurück, dient msg als Grund dafür, den Test zu überspringen.

@test.support.thread_unsafe(reason=None)

Dekorator, um Tests als nicht threadsicher zu markieren. Solch ein Test läuft immer in einem Thread, auch beim Aufruf mit --parallel-threads.

@test.support.no_tracing

Dekorator, der das Tracing für die Dauer des Tests vorübergehend abschaltet.

@test.support.refcount_test

Dekorator für Tests, bei denen Referenzzählung im Spiel ist. Der Dekorator führt den Test nicht aus, wenn er nicht von CPython ausgeführt wird. Eine etwaige Trace-Funktion wird für die Dauer des Tests entfernt, damit sie die Referenzzahlen nicht unerwartet verändert.

@test.support.bigmemtest(size, memuse, dry_run=True)

Dekorator für bigmem-Tests.

size ist eine gewünschte Größe für den Test, in beliebigen Einheiten, die der Test selbst deutet. memuse ist die Anzahl der Bytes je Einheit oder eine gute Schätzung davon. Ein Test, der zwei Bytepuffer von je 4 GiB braucht, ließe sich zum Beispiel mit @bigmemtest(size=_4G, memuse=2) dekorieren.

Das Argument size wird der dekorierten Testmethode normalerweise als zusätzliches Argument übergeben. Ist dry_run True, kann der an die Testmethode übergebene Wert kleiner sein als der gewünschte. Ist dry_run False, bedeutet das, dass der Test keine Probeläufe unterstützt, wenn -M nicht angegeben ist.

@test.support.bigaddrspacetest

Dekorator für Tests, die den Adressraum füllen.

test.support.linked_to_musl()

Gibt False zurück, wenn nichts darauf hindeutet, dass der Interpreter mit musl kompiliert wurde, sonst ein Versionstripel: (0, 0, 0), wenn die Version unbekannt ist, andernfalls die tatsächliche Version. Gedacht für die Verwendung in skip-Dekoratoren. Bei emscripten und wasi wird angenommen, dass sie mit musl kompiliert sind, sonst wird platform.libc_ver geprüft.

test.support.check_syntax_error(testcase, statement, errtext='', *, lineno=None, offset=None)

Prüft statement auf Syntaxfehler, indem versucht wird, es zu kompilieren. testcase ist die unittest-Instanz des Tests. errtext ist der reguläre Ausdruck, der auf die Zeichenkettendarstellung des ausgelösten SyntaxError passen soll. Ist lineno nicht None, wird mit der Zeile der Ausnahme verglichen. Ist offset nicht None, wird mit dem Offset der Ausnahme verglichen.

test.support.open_urlresource(url, *args, **kw)

Öffnet url. Schlägt das Öffnen fehl, wird TestFailed ausgelöst.

test.support.reap_children()

Rufe das aus setUp(), tearDown() oder tearDownModule() in Tests auf, die Subprozesse starten. So bleiben keine zusätzlichen Kindprozesse (Zombies) übrig, die Ressourcen belegen und bei der Suche nach Refleaks Ärger machen.

test.support.get_attribute(obj, name)

Holt ein Attribut und löst unittest.SkipTest aus, wenn ein AttributeError auftritt.

test.support.catch_unraisable_exception()

Kontextmanager, der eine nicht weiterleitbare Ausnahme (unraisable exception) mit sys.unraisablehook() abfängt.

Den Ausnahmewert zu speichern (cm.unraisable.exc_value) erzeugt einen Zirkelbezug. Dieser wird beim Verlassen des Kontextmanagers ausdrücklich aufgelöst.

Das Objekt zu speichern (cm.unraisable.object) kann es wiederbeleben, wenn es auf ein Objekt gesetzt wird, das gerade finalisiert wird. Beim Verlassen des Kontextmanagers wird das gespeicherte Objekt geleert.

Verwendung:

with support.catch_unraisable_exception() as cm:
    # code creating an "unraisable exception"
    ...

    # check the unraisable exception: use cm.unraisable
    ...

# cm.unraisable attribute no longer exists at this point
# (to break a reference cycle)

Added in version 3.8.

test.support.load_package_tests(pkg_dir, loader, standard_tests, pattern)

Allgemeine Umsetzung des load_tests-Protokolls von unittest für die Verwendung in Testpaketen. pkg_dir ist das Wurzelverzeichnis des Pakets; loader, standard_tests und pattern sind die Argumente, die load_tests erwartet. In einfachen Fällen kann die __init__.py des Testpakets so aussehen:

import os
from test.support import load_package_tests

def load_tests(*args):
    return load_package_tests(os.path.dirname(__file__), *args)
test.support.detect_api_mismatch(ref_api, other_api, *, ignore=())

Gibt die Menge der Attribute, Funktionen und Methoden von ref_api zurück, die sich nicht in other_api finden – abgesehen von einer festgelegten Liste von Einträgen in ignore, die bei dieser Prüfung übergangen werden.

Voreingestellt werden private Attribute übersprungen, die mit ‚_‘ beginnen. Alle magischen Methoden, also jene, die mit ‚__‘ beginnen und enden, sind dagegen eingeschlossen.

Added in version 3.5.

test.support.patch(test_instance, object_to_patch, attr_name, new_value)

Überschreibt object_to_patch.attr_name mit new_value. Ergänzt zugleich an test_instance eine Aufräumprozedur, die object_to_patch für attr_name wiederherstellt. attr_name sollte ein gültiges Attribut von object_to_patch sein.

test.support.run_in_subinterp(code)

Führt code in einem Subinterpreter aus. Löst unittest.SkipTest aus, wenn tracemalloc eingeschaltet ist.

@test.support.isolation.runInSubprocess(*, options=(), env=None, timeout=None)

Dekorator, der den dekorierten Test in einem frischen Interpreter-Subprozess isoliert ausführt, sodass er sich den globalen Zustand und den Zustand des Interpreters nicht mit dem restlichen Testlauf teilt. Er kann eine Testmethode oder eine ganze TestCase-Unterklasse dekorieren. Dekorierte Methoden dürfen keine zusätzlichen Argumente nehmen. Scheitert der Subprozess, tritt ein Fehler auf oder wird übersprungen, wird das für den entsprechenden Test gemeldet. Einzelne Subtests, die scheitern oder übersprungen werden, werden einzeln gemeldet. Ein gemeldetes Scheitern oder ein gemeldeter Fehler zeigt den ursprünglichen Traceback des Subprozesses als Ursache der Ausnahme.

Ist eine Methode dekoriert, läuft nur diese Methode in einem Subprozess. Alle Fixtures (setUp() / tearDown(), setUpClass() / tearDownClass() und setUpModule() / tearDownModule()) laufen sowohl im Elternprozess – wie gewohnt – als auch im Subprozess um die Methode herum.

Ist eine Klasse dekoriert, läuft die ganze Klasse in einem einzigen Subprozess, und setUpClass(), tearDownClass(), setUp() und tearDown() laufen je einmal im Subprozess und werden im Elternprozess übersprungen. Scheitert oder überspringt setUpClass() im Subprozess, wird das für die ganze Klasse gemeldet. setUpModule() lässt sich von einem Klassendekorator nicht steuern und läuft daher weiterhin auch im Elternprozess. Prüfe es bei Bedarf mit runningInSubprocess.

Der Subprozess erbt die eingeschalteten Ressourcen (-u), die Speichergrenze (-M) und die Ausführlichkeit (-v) des Eltern-Testlaufs, sodass requires_resource(), requires(), bigmemtest() und ähnliche sich in beiden Prozessen gleich verhalten.

options ist eine Folge von Befehlszeilenoptionen des Interpreters, mit denen der Subprozess läuft, und env eine Abbildung von Umgebungsvariablen, die darin zusätzlich zur geerbten Umgebung gesetzt werden. Ein Wert von None in env hebt die Variable auf. Beachte, dass -E und -I den Subprozess die PYTHON*-Umgebungsvariablen übergehen lassen, auch PYTHONPATH.

timeout ist die Anzahl der Sekunden, die auf den Subprozess gewartet wird. Wird er nicht rechtzeitig fertig, wird der Test als Fehler gemeldet. Voreingestellt gibt es keine Zeitgrenze, und ein hängender Test bleibt der Zeitgrenze des Testrunners überlassen.

Auf Plattformen ohne Unterstützung für Subprozesse wird der Test übersprungen.

test.support.isolation.runningInSubprocess

True, während der Code im isolierten Subprozess läuft, den runInSubprocess() erzeugt hat, sonst False – auch im Elternprozess und in einem gewöhnlichen, nicht isolierten Testlauf. Fixtures wie setUp(), tearDown(), setUpClass(), tearDownClass(), setUpModule() und tearDownModule() können den Wert prüfen, um zu entscheiden, welcher Code im Subprozess läuft.

test.support.check_free_after_iterating(test, iter, cls, args=())

Sichert zu, dass Instanzen von cls nach dem Iterieren freigegeben sind.

test.support.missing_compiler_executable(cmd_names=[])

Prüft, ob die Compiler-Programme vorhanden sind, deren Namen in cmd_names stehen – oder alle Compiler-Programme, wenn cmd_names leer ist –, und gibt das erste fehlende Programm zurück oder None, wenn keines fehlt.

test.support.check__all__(test_case, module, name_of_module=None, extra=(), not_exported=())

Sichert zu, dass die Variable __all__ von module alle öffentlichen Namen enthält.

Die öffentlichen Namen des Moduls – seine API – werden selbsttätig daran erkannt, ob sie der Konvention für öffentliche Namen entsprechen und in module definiert wurden.

Das Argument name_of_module kann angeben – als Zeichenkette oder als Tupel davon –, in welchen Modulen eine API definiert sein darf, um als öffentliche API erkannt zu werden. Das ist zum Beispiel der Fall, wenn module einen Teil seiner öffentlichen API aus anderen Modulen importiert, womöglich aus einem C-Backend, wie csv und sein _csv.

Das Argument extra kann eine Menge von Namen sein, die sonst nicht selbsttätig als „öffentlich“ erkannt würden, etwa Objekte ohne ein richtiges __module__-Attribut. Wird es angegeben, kommt es zu den selbsttätig erkannten hinzu.

Das Argument not_exported kann eine Menge von Namen sein, die nicht als Teil der öffentlichen API gelten dürfen, auch wenn ihre Namen etwas anderes vermuten lassen.

Beispiel:

import bar
import foo
import unittest
from test import support

class MiscTestCase(unittest.TestCase):
    def test__all__(self):
        support.check__all__(self, foo)

class OtherTestCase(unittest.TestCase):
    def test__all__(self):
        extra = {'BAR_CONST', 'FOO_CONST'}
        not_exported = {'baz'}  # Undocumented name.
        # bar imports part of its API from _bar.
        support.check__all__(self, bar, ('bar', '_bar'),
                             extra=extra, not_exported=not_exported)

Added in version 3.6.

test.support.skip_if_broken_multiprocessing_synchronize()

Überspringt Tests, wenn das Modul multiprocessing.synchronize fehlt, keine Umsetzung von Semaphoren zur Verfügung steht oder das Erzeugen eines Locks einen OSError auslöst.

Added in version 3.10.

test.support.check_disallow_instantiation(test_case, tp, *args, **kwds)

Sichert zu, dass sich der Typ tp nicht mit args und kwds instanzieren lässt.

Added in version 3.10.

test.support.adjust_int_max_str_digits(max_digits)

Diese Funktion gibt einen Kontextmanager zurück, der die globale Einstellung sys.set_int_max_str_digits() für die Dauer des Kontexts ändert. So lässt sich Testcode ausführen, der beim Umwandeln zwischen ganzer Zahl und Zeichenkette eine andere Grenze für die Anzahl der Ziffern braucht.

Added in version 3.11.

Das Modul test.support definiert die folgenden Klassen:

class test.support.SuppressCrashReport

Ein Kontextmanager, der zu verhindern versucht, dass bei Tests, die einen Subprozess absichtlich zum Abstürzen bringen, Absturzdialoge aufgehen.

Unter Windows schaltet er die Dialoge der Windows-Fehlerberichterstattung mit SetErrorMode ab.

Unter UNIX wird mit resource.setrlimit() die weiche Grenze von resource.RLIMIT_CORE auf 0 gesetzt, damit keine Coredump-Datei entsteht.

Auf beiden Plattformen stellt __exit__() den alten Wert wieder her.

class test.support.SaveSignals

Klasse, um die vom Python-Signalhandler angemeldeten Signalhandler zu sichern und wiederherzustellen.

save(self)

Sichert die Signalhandler in ein Dictionary, das Signalnummern auf den aktuellen Signalhandler abbildet.

restore(self)

Setzt die Signalnummern aus dem Dictionary von save() auf den gesicherten Handler.

class test.support.Matcher
matches(self, d, **kwargs)

Versucht, ein einzelnes Dict mit den übergebenen Argumenten abzugleichen.

match_value(self, k, dv, v)

Versucht, einen einzelnen gespeicherten Wert (dv) mit einem übergebenen Wert (v) abzugleichen.

test.support.socket_helper — Werkzeuge für Socket-Tests

Das Modul test.support.socket_helper unterstützt Socket-Tests.

Added in version 3.9.

test.support.socket_helper.IPV6_ENABLED

True, wenn IPv6 auf diesem Host eingeschaltet ist, sonst False.

test.support.socket_helper.find_unused_port(family=socket.AF_INET, socktype=socket.SOCK_STREAM)

Gibt einen unbenutzten Port zurück, der sich zum Binden eignen sollte. Dazu wird ein temporärer Socket derselben Familie und desselben Typs wie beim Parameter sock erzeugt (voreingestellt AF_INET, SOCK_STREAM) und mit Port 0 an die angegebene Hostadresse gebunden (voreingestellt 0.0.0.0), was dem Betriebssystem einen unbenutzten ephemeren Port entlockt. Der temporäre Socket wird dann geschlossen und gelöscht und der ephemere Port zurückgegeben.

Für Tests, bei denen ein Serversocket für die Dauer des Tests an einen bestimmten Port gebunden werden muss, sollte entweder diese Methode oder bind_port() verwendet werden. Welche davon, hängt davon ab, ob der aufrufende Code einen Python-Socket erzeugt oder ob ein unbenutzter Port in einem Konstruktor bereitgestellt oder an ein externes Programm übergeben werden muss – etwa das Argument -accept für den s_server-Modus von openssl. Gib wo möglich immer bind_port() den Vorzug vor find_unused_port(). Von einem festverdrahteten Port wird abgeraten, denn dann lassen sich mehrere Instanzen des Tests womöglich nicht gleichzeitig ausführen, was für Buildbots ein Problem ist.

test.support.socket_helper.bind_port(sock, host=HOST)

Bindet den Socket an einen freien Port und gibt die Portnummer zurück. Verlässt sich auf ephemere Ports, um sicherzugehen, dass ein nicht gebundener Port verwendet wird. Das ist wichtig, weil viele Tests gleichzeitig laufen können, besonders in einer Buildbot-Umgebung. Diese Methode löst eine Ausnahme aus, wenn sock.family AF_INET und sock.type SOCK_STREAM ist und am Socket SO_REUSEADDR oder SO_REUSEPORT gesetzt ist. Tests sollten diese Socket-Optionen für TCP/IP-Sockets nie setzen. Der einzige Grund, sie zu setzen, ist das Prüfen von Multicast über mehrere UDP-Sockets.

Steht außerdem die Socket-Option SO_EXCLUSIVEADDRUSE zur Verfügung, also unter Windows, wird sie am Socket gesetzt. Damit kann sich für die Dauer des Tests niemand sonst an unseren Host und Port binden.

test.support.socket_helper.bind_unix_socket(sock, addr)

Bindet einen Unix-Socket und löst unittest.SkipTest aus, wenn ein PermissionError auftritt.

@test.support.socket_helper.skip_unless_bind_unix_socket

Ein Dekorator für Tests, die ein funktionierendes bind() für Unix-Sockets brauchen.

test.support.socket_helper.transient_internet(resource_name, *, timeout=30.0, errnos=())

Ein Kontextmanager, der ResourceDenied auslöst, wenn sich verschiedene Probleme mit der Internetverbindung als Ausnahmen zeigen.

test.support.script_helper — Werkzeuge für die Tests der Python-Ausführung

Das Modul test.support.script_helper unterstützt die Tests der Skriptausführung von Python.

test.support.script_helper.interpreter_requires_environment()

Gibt True zurück, wenn sys.executable interpreter Umgebungsvariablen braucht, um überhaupt laufen zu können.

Gedacht für die Verwendung mit @unittest.skipIf(), um Tests zu kennzeichnen, die eine assert_python*()-Funktion brauchen, um einen Subinterpreter-Prozess im isolierten Modus (-I) oder ohne Umgebung (-E) zu starten.

Bei einem gewöhnlichen Bauen und Testen tritt diese Lage nicht auf, wohl aber, wenn man die Testsuite der Standardbibliothek von einem Interpreter aus laufen lässt, der für die aktuelle Logik von Python zur Suche des Home-Verzeichnisses kein offensichtliches Home hat.

PYTHONHOME zu setzen ist ein Weg, in dieser Lage den größten Teil der Testsuite zum Laufen zu bringen. PYTHONPATH und PYTHONNOUSERSITE sind weitere verbreitete Umgebungsvariablen, die beeinflussen können, ob der Interpreter startet.

test.support.script_helper.run_python_until_end(*args, **env_vars)

Richtet die Umgebung anhand von env_vars ein, um den Interpreter in einem Subprozess auszuführen. Zu den Werten können __isolated, __cleanenv, __cwd und TERM gehören.

Geändert in Version 3.9: Die Funktion entfernt keinen Leerraum mehr aus stderr.

test.support.script_helper.assert_python_ok(*args, **env_vars)

Sichert zu, dass der Interpreter mit args und den optionalen Umgebungsvariablen env_vars erfolgreich läuft (rc == 0), und gibt ein Tupel (return code, stdout, stderr) zurück.

Ist der nur als Schlüsselwort übergebbare Parameter __cleanenv gesetzt, dient env_vars als frische Umgebung.

Python startet im isolierten Modus (Befehlszeilenoption -I), es sei denn, der nur als Schlüsselwort übergebbare Parameter __isolated ist auf False gesetzt.

Geändert in Version 3.9: Die Funktion entfernt keinen Leerraum mehr aus stderr.

test.support.script_helper.assert_python_failure(*args, **env_vars)

Sichert zu, dass der Interpreter mit args und den optionalen Umgebungsvariablen env_vars scheitert (rc != 0), und gibt ein Tupel (return code, stdout, stderr) zurück.

Weitere Optionen unter assert_python_ok().

Geändert in Version 3.9: Die Funktion entfernt keinen Leerraum mehr aus stderr.

test.support.script_helper.spawn_python(*args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, **kw)

Führt einen Python-Subprozess mit den angegebenen Argumenten aus.

kw sind zusätzliche Schlüsselwortargumente für subprocess.Popen(). Gibt ein subprocess.Popen-Objekt zurück.

test.support.script_helper.kill_python(p)

Führt den angegebenen subprocess.Popen-Prozess bis zum Ende aus und gibt stdout zurück.

test.support.script_helper.make_script(script_dir, script_basename, source, omit_suffix=False)

Erzeugt im Pfad script_dir unter script_basename ein Skript mit dem Inhalt source. Ist omit_suffix False, wird .py an den Namen angehängt. Gibt den vollständigen Skriptpfad zurück.

test.support.script_helper.make_zip_script(zip_dir, zip_basename, script_name, name_in_zip=None)

Erzeugt unter zip_dir und zip_basename eine ZIP-Datei mit der Endung zip, die die Dateien aus script_name enthält. name_in_zip ist der Archivname. Gibt ein Tupel (full path, full path of archive name) zurück.

test.support.script_helper.make_pkg(pkg_dir, init_source='')

Erzeugt ein Verzeichnis pkg_dir mit einer Datei __init__, die init_source als Inhalt hat.

test.support.script_helper.make_zip_pkg(zip_dir, zip_basename, pkg_name, script_basename, source, depth=1, compiled=False)

Erzeugt unter zip_dir und zip_basename ein ZIP-Paketverzeichnis mit einer leeren Datei __init__ und einer Datei script_basename mit dem Inhalt source. Ist compiled True, werden beide Quelldateien kompiliert und dem ZIP-Paket hinzugefügt. Gibt ein Tupel aus dem vollständigen ZIP-Pfad und dem Archivnamen der ZIP-Datei zurück.

test.support.bytecode_helper — Hilfswerkzeuge, um die korrekte Bytecode-Erzeugung zu prüfen

Das Modul test.support.bytecode_helper unterstützt dabei, die Bytecode-Erzeugung zu prüfen und zu untersuchen.

Added in version 3.9.

Das Modul definiert die folgende Klasse:

class test.support.bytecode_helper.BytecodeTestCase(unittest.TestCase)

Diese Klasse hat eigene Zusicherungsmethoden, um Bytecode zu untersuchen.

BytecodeTestCase.get_disassembly_as_string(co)

Gibt die Disassemblierung von co als Zeichenkette zurück.

BytecodeTestCase.assertInBytecode(x, opname, argval=_UNSPECIFIED)

Gibt instr zurück, wenn opname gefunden wird, sonst wird AssertionError ausgelöst.

BytecodeTestCase.assertNotInBytecode(x, opname, argval=_UNSPECIFIED)

Löst AssertionError aus, wenn opname gefunden wird.

test.support.threading_helper — Werkzeuge für Threading-Tests

Das Modul test.support.threading_helper unterstützt Threading-Tests.

Added in version 3.10.

test.support.threading_helper.join_thread(thread, timeout=None)

Wartet innerhalb von timeout auf das Ende von thread. Löst einen AssertionError aus, wenn der Thread nach timeout Sekunden noch lebt.

@test.support.threading_helper.reap_threads

Dekorator, der sicherstellt, dass die Threads auch dann aufgeräumt werden, wenn der Test scheitert.

test.support.threading_helper.start_threads(threads, unlock=None)

Kontextmanager, der threads startet – eine Folge von Threads. unlock ist eine Funktion, die nach dem Start der Threads aufgerufen wird, auch wenn eine Ausnahme aufgetreten ist. Ein Beispiel wäre threading.Event.set(). Beim Verlassen versucht start_threads, auf das Ende der gestarteten Threads zu warten.

test.support.threading_helper.threading_cleanup(*original_values)

Räumt Threads auf, die nicht in original_values stehen. Soll eine Warnung ausgeben, wenn ein Test laufende Threads im Hintergrund hinterlässt.

test.support.threading_helper.threading_setup()

Gibt die aktuelle Anzahl der Threads und eine Kopie der hängenden Threads zurück.

test.support.threading_helper.wait_threads_exit(timeout=None)

Kontextmanager, der wartet, bis alle in der with-Anweisung erzeugten Threads beendet sind.

test.support.threading_helper.catch_threading_exception()

Kontextmanager, der eine Ausnahme aus threading.Thread mit threading.excepthook() abfängt.

Attribute, die beim Abfangen einer Ausnahme gesetzt werden:

  • exc_type

  • exc_value

  • exc_traceback

  • thread

Siehe die Dokumentation von threading.excepthook().

Diese Attribute werden beim Verlassen des Kontextmanagers gelöscht.

Verwendung:

with threading_helper.catch_threading_exception() as cm:
    # code spawning a thread which raises an exception
    ...

    # check the thread exception, use cm attributes:
    # exc_type, exc_value, exc_traceback, thread
    ...

# exc_type, exc_value, exc_traceback, thread attributes of cm no longer
# exists at this point
# (to avoid reference cycles)

Added in version 3.8.

test.support.threading_helper.run_concurrently(worker_func, nthreads, args=(), kwargs={})

Führt die Worker-Funktion gleichzeitig in mehreren Threads aus. Löst eine Ausnahme erneut aus, wenn irgendein Thread eine auslöst, nachdem alle Threads fertig sind.

test.support.os_helper — Werkzeuge für os-Tests

Das Modul test.support.os_helper unterstützt os-Tests.

Added in version 3.10.

test.support.os_helper.FS_NONASCII

Ein Zeichen außerhalb von ASCII, das sich mit os.fsencode() kodieren lässt.

test.support.os_helper.SAVEDCWD

Enthält os.getcwd().

test.support.os_helper.TESTFN

Enthält einen Namen, der sich gefahrlos als Name einer temporären Datei verwenden lässt. Jede erzeugte temporäre Datei sollte geschlossen und entfernt werden.

test.support.os_helper.TESTFN_NONASCII

Enthält einen Dateinamen mit dem Zeichen FS_NONASCII, sofern es ihn gibt. Das garantiert, dass sich der Dateiname, wenn er vorhanden ist, mit der voreingestellten Kodierung des Dateisystems kodieren und dekodieren lässt. So lassen sich Tests, die einen Dateinamen außerhalb von ASCII brauchen, auf Plattformen leicht überspringen, auf denen sie nicht funktionieren können.

test.support.os_helper.TESTFN_UNENCODABLE

Enthält einen Dateinamen (Typ str), der sich im strengen Modus nicht mit der Kodierung des Dateisystems kodieren lassen sollte. Kann None sein, wenn sich ein solcher Dateiname nicht erzeugen lässt.

test.support.os_helper.TESTFN_UNDECODABLE

Enthält einen Dateinamen (Typ bytes), der sich im strengen Modus nicht mit der Kodierung des Dateisystems dekodieren lassen sollte. Kann None sein, wenn sich ein solcher Dateiname nicht erzeugen lässt.

test.support.os_helper.TESTFN_UNICODE

Enthält einen Namen außerhalb von ASCII für eine temporäre Datei.

class test.support.os_helper.EnvironmentVarGuard

Klasse, um Umgebungsvariablen vorübergehend zu setzen oder aufzuheben. Instanzen lassen sich als Kontextmanager verwenden und haben eine vollständige Dictionary-Schnittstelle, um das zugrunde liegende os.environ abzufragen und zu ändern. Nach dem Verlassen des Kontextmanagers werden alle über diese Instanz vorgenommenen Änderungen an Umgebungsvariablen zurückgerollt.

Geändert in Version 3.1: Die Dictionary-Schnittstelle kam hinzu.

class test.support.os_helper.FakePath(path)

Einfaches pfadartiges Objekt. Es setzt die Methode __fspath__() um, die einfach das Argument path zurückgibt. Ist path eine Ausnahme, wird sie in __fspath__() ausgelöst.

EnvironmentVarGuard.set(envvar, value)

Setzt die Umgebungsvariable envvar vorübergehend auf den Wert von value.

EnvironmentVarGuard.unset(envvar, *others)

Hebt eine oder mehrere Umgebungsvariablen vorübergehend auf.

Geändert in Version 3.14: Es lässt sich mehr als eine Umgebungsvariable aufheben.

Gibt True zurück, wenn das Betriebssystem symbolische Verknüpfungen unterstützt, sonst False.

test.support.os_helper.can_xattr()

Gibt True zurück, wenn das Betriebssystem xattr unterstützt, sonst False.

test.support.os_helper.change_cwd(path, quiet=False)

Ein Kontextmanager, der das aktuelle Arbeitsverzeichnis vorübergehend auf path ändert und das Verzeichnis liefert.

Ist quiet False, löst der Kontextmanager bei einem Fehler eine Ausnahme aus. Andernfalls gibt er nur eine Warnung aus und lässt das aktuelle Arbeitsverzeichnis unverändert.

test.support.os_helper.create_empty_file(filename)

Erzeugt eine leere Datei filename. Gibt es sie schon, wird sie abgeschnitten.

test.support.os_helper.fd_count()

Zählt die offenen Dateideskriptoren.

test.support.os_helper.fs_is_case_insensitive(directory)

Gibt True zurück, wenn das Dateisystem von directory die Groß- und Kleinschreibung nicht beachtet.

test.support.os_helper.make_bad_fd()

Erzeugt einen ungültigen Dateideskriptor, indem eine temporäre Datei geöffnet und geschlossen und ihr Deskriptor zurückgegeben wird.

test.support.os_helper.rmdir(filename)

Ruft os.rmdir() für filename auf. Unter Windows ist das in eine Warteschleife gehüllt, die prüft, ob die Datei noch vorhanden ist; das ist wegen Antivirenprogrammen nötig, die Dateien offen halten und so das Löschen verhindern können.

test.support.os_helper.rmtree(path)

Ruft shutil.rmtree() für path auf oder os.lstat() und os.rmdir(), um einen Pfad und seinen Inhalt zu entfernen. Wie bei rmdir() ist das unter Windows in eine Warteschleife gehüllt, die prüft, ob die Dateien noch vorhanden sind.

Ein Dekorator für Tests, die Unterstützung für symbolische Verknüpfungen brauchen.

@test.support.os_helper.skip_unless_xattr

Ein Dekorator für Tests, die Unterstützung für xattr brauchen.

test.support.os_helper.temp_cwd(name='tempcwd', quiet=False)

Ein Kontextmanager, der vorübergehend ein neues Verzeichnis erzeugt und das aktuelle Arbeitsverzeichnis wechselt.

Der Kontextmanager erzeugt im aktuellen Verzeichnis ein temporäres Verzeichnis mit dem Namen name, bevor er das aktuelle Arbeitsverzeichnis vorübergehend wechselt. Ist name None, wird das temporäre Verzeichnis mit tempfile.mkdtemp() erzeugt.

Ist quiet False und lässt sich das aktuelle Arbeitsverzeichnis nicht erzeugen oder wechseln, wird ein Fehler ausgelöst. Andernfalls erscheint nur eine Warnung und das ursprüngliche Arbeitsverzeichnis wird verwendet.

test.support.os_helper.temp_dir(path=None, quiet=False)

Ein Kontextmanager, der unter path ein temporäres Verzeichnis erzeugt und das Verzeichnis liefert.

Ist path None, wird das temporäre Verzeichnis mit tempfile.mkdtemp() erzeugt. Ist quiet False, löst der Kontextmanager bei einem Fehler eine Ausnahme aus. Andernfalls erscheint nur eine Warnung, wenn path angegeben ist und sich nicht erzeugen lässt.

test.support.os_helper.temp_umask(umask)

Ein Kontextmanager, der die umask des Prozesses vorübergehend setzt.

Ruft os.unlink() für filename auf. Wie bei rmdir() ist das unter Windows in eine Warteschleife gehüllt, die prüft, ob die Datei noch vorhanden ist.

@test.support.os_helper.with_source_date_epoch(*, epoch=123456789)

Ein Dekorator, der Tests mit der Umgebungsvariablen SOURCE_DATE_EPOCH auf epoch gesetzt ausführt.

@test.support.os_helper.without_source_date_epoch

Ein Dekorator, der Tests mit aufgehobener Umgebungsvariable SOURCE_DATE_EPOCH ausführt.

class test.support.os_helper.SourceDateEpochTestMeta

Metaklasse, die alle Testmethoden der Klasse in with_source_date_epoch() hüllt, wenn das Schlüsselwort-Klassenargument source_date_epoch wahr ist, sonst in without_source_date_epoch(). Zum Beispiel:

class TestsWithSourceEpoch(Tests,
                           metaclass=SourceDateEpochTestMeta,
                           source_date_epoch=True):
    pass

test.support.import_helper — Werkzeuge für Import-Tests

Das Modul test.support.import_helper unterstützt Import-Tests.

Added in version 3.10.

Creating module objects

test.support.import_helper.create_module(name, loader=None, *, ispkg=False)

Create a new, empty module or package and return it.

name, loader and ispkg (as is_package) are passed to importlib.machinery.ModuleSpec.

test.support.import_helper.add_module(spec, *, parents=True)

Create a module from a name or spec and add it to sys.modules.

If parents is True, create any missing parent modules.

Return the new module.

test.support.import_helper.add_package(spec, *, parents=True)

Create a package from a name or spec and add it to sys.modules.

If parents is True, create any missing parent modules.

Return the new package.

Manipulating sys.modules

test.support.import_helper.unload(name)

Remove the module named name from sys.modules.

test.support.import_helper.forget(modname)

Remove the module named modname from sys.modules and delete any byte-compiled files of the module.

test.support.import_helper.modules_setup()

Return a tuple containing a copy of sys.modules.

test.support.import_helper.modules_cleanup(oldmodules)

Remove modules except for oldmodules and encodings from sys.modules in order to preserve the internal cache.

test.support.import_helper.isolated_modules()

A context manager that makes a copy of sys.modules on entry and restores it on exit.

class test.support.import_helper.CleanImport(*module_names, usefrozen=False)

A context manager to force imports to return new module references. This is useful for testing module-level behaviors, such as the emission of a DeprecationWarning on import.

When created, this makes a copy of sys.modules and removes names from module_names from the original. On exit, the original module references are restored.

If usefrozen is False (the default) then the frozen importer is disabled (except for essential modules like importlib._bootstrap).

Example usage:

with CleanImport('foo'):
      importlib.import_module('foo')  # New reference.

Importing modules

test.support.import_helper.import_module(name, deprecated=False, *, required_on=())

Diese Funktion importiert das genannte Modul und gibt es zurück. Anders als ein gewöhnlicher Import löst sie unittest.SkipTest aus, wenn sich das Modul nicht importieren lässt.

Meldungen über veraltete Module und Pakete werden während dieses Imports unterdrückt, wenn deprecated True ist. Ist ein Modul auf einer Plattform erforderlich, auf anderen aber optional, setze required_on auf ein Iterable von Plattformpräfixen, die mit sys.platform verglichen werden.

Added in version 3.1.

test.support.import_helper.import_fresh_module(name, fresh=(), blocked=(), *, deprecated=False, usefrozen=False)

This function imports and returns a fresh copy of the named Python module by removing the named module from sys.modules before doing the import. Note that unlike reload, the original module is not affected by this operation.

fresh is an iterable of additional module names that are also removed from the sys.modules cache before doing the import.

blocked ist ein Iterable von Modulnamen, die im Modul-Zwischenspeicher während des Imports durch None ersetzt werden, damit Versuche, sie zu importieren, einen ImportError auslösen.

The named module and any modules named in the fresh and blocked parameters are saved before starting the import and then reinserted into sys.modules when the fresh import is complete.

Meldungen über veraltete Module und Pakete werden während dieses Imports unterdrückt, wenn deprecated True ist.

If usefrozen is False (the default) then the frozen importer is disabled (except for essential modules like importlib._bootstrap).

Diese Funktion löst ImportError aus, wenn sich das genannte Modul nicht importieren lässt.

Beispiel:

# Get copies of the warnings module for testing without affecting the
# version being used by the rest of the test suite. One copy uses the
# C implementation, the other is forced to use the pure Python fallback
# implementation
py_warnings = import_fresh_module('warnings', blocked=['_warnings'])
c_warnings = import_fresh_module('warnings', fresh=['_warnings'])

Added in version 3.1.

test.support.import_helper.ensure_module_imported(name, *, clearnone=True)

Import and return the named module.

If the module is already imported, this is returned. Otherwise, import the module and return it. If the module is not found a new, empty module will be created.

If clearnone is True, this will first remove any None values that would block the import.

Manipulating sys.path

class test.support.import_helper.DirsOnSysPath(*paths)

Ein Kontextmanager, um sys.path vorübergehend Verzeichnisse hinzuzufügen.

Er legt eine Kopie von sys.path an, hängt alle als positionsbezogene Argumente übergebenen Verzeichnisse an und setzt sys.path am Ende des Kontexts auf die kopierten Einstellungen zurück.

Beachte, dass alle Änderungen an sys.path im Körper des Kontextmanagers am Ende des Blocks zurückgenommen werden, auch ein Austausch des Objekts.

test.support.import_helper.ready_to_import(name=None, source='')

A context manager that will create a new Python module name with source source code in a temporary directory and inserts this directory at the start of sys.path. The context manager yields a tuple with the name and the path to the script in the temporary directory.

If the name matches an existing module, this will be cleared from sys.modules on entry and restored on exit.

If no name is given, the module will be named „spam“.

Manipulating internals

test.support.import_helper.make_legacy_pyc(source, allow_compile=False)

Move a PEP 3147/PEP 488 pyc file to its legacy pyc location and return the file system path to the legacy pyc file. The source value is the file system path to the source file. It does not need to exist, however the PEP 3147/488 pyc file must exist or allow_compile must be set.

If allow_compile is True this will create a .pyc file if it does not exist.

test.support.import_helper.frozen_modules(enabled=True)

A context manager that forces frozen modules to be used or excluded.

If enabled is True frozen modules are used, otherwise they are excluded.

This only applies to modules that have not yet been imported. Some essential modules will always be imported frozen.

test.support.import_helper.multi_interp_extensions_check(enabled=True)

A context manager that forces (if enabled is True) or prevents legacy (single-phase init) modules from being allowed in subinterpreters.

This only applies to modules that haven’t been imported yet. It overrides the PyInterpreterConfig.check_multi_interp_extensions setting.

Lazy imports

test.support.import_helper.ensure_lazy_imports(imported_module, modules_to_block, *, additional_code=None)

Test that when imported_module is imported, none of the modules named in modules_to_block are imported as a side effect.

additional_code if given should be additional Python source code to execute before checking that the blocked modules still haven’t been imported.

test.support.warnings_helper — Werkzeuge für Warnungs-Tests

Das Modul test.support.warnings_helper unterstützt Warnungs-Tests.

Added in version 3.10.

test.support.warnings_helper.ignore_warnings(*, category)

Unterdrückt Warnungen, die Instanzen von category sind. Diese muss Warning oder eine Unterklasse davon sein. Entspricht in etwa warnings.catch_warnings() mit warnings.simplefilter('ignore', category=category). Zum Beispiel:

@warning_helper.ignore_warnings(category=DeprecationWarning)
def test_suppress_warning():
    # do something

Added in version 3.8.

test.support.warnings_helper.check_no_resource_warning(testcase)

Kontextmanager, der prüft, dass keine ResourceWarning ausgelöst wurde. Du musst das Objekt, das eine ResourceWarning ausgeben kann, vor dem Ende des Kontextmanagers entfernen.

test.support.warnings_helper.check_syntax_warning(testcase, statement, errtext='', *, lineno=1, offset=None)

Prüft statement auf eine Syntaxwarnung, indem versucht wird, es zu kompilieren. Prüft außerdem, dass die SyntaxWarning nur einmal ausgegeben und in einen SyntaxError umgewandelt wird, wenn aus ihr ein Fehler gemacht wird. testcase ist die unittest-Instanz des Tests. errtext ist der reguläre Ausdruck, der auf die Zeichenkettendarstellung der ausgegebenen SyntaxWarning und des ausgelösten SyntaxError passen soll. Ist lineno nicht None, wird mit der Zeile von Warnung und Ausnahme verglichen. Ist offset nicht None, wird mit dem Offset der Ausnahme verglichen.

Added in version 3.8.

test.support.warnings_helper.check_warnings(*filters, quiet=True)

Eine praktische Hülle um warnings.catch_warnings(), die es einfacher macht zu prüfen, dass eine Warnung richtig ausgelöst wurde. Entspricht in etwa dem Aufruf warnings.catch_warnings(record=True) mit warnings.simplefilter() auf always, mit der Möglichkeit, die aufgezeichneten Ergebnisse selbsttätig zu prüfen.

check_warnings nimmt als positionsbezogene Argumente Zweiertupel der Form ("message regexp", WarningCategory) an. Werden ein oder mehrere filters angegeben oder ist das optionale Schlüsselwortargument quiet False, wird geprüft, dass die Warnungen den Erwartungen entsprechen: Jeder angegebene Filter muss auf mindestens eine der Warnungen des eingeschlossenen Codes passen, sonst scheitert der Test. Und werden Warnungen ausgelöst, die auf keinen der angegebenen Filter passen, scheitert der Test ebenfalls. Um die erste dieser Prüfungen abzuschalten, setze quiet auf True.

Ohne Argumente gilt:

check_warnings(("", Warning), quiet=True)

In diesem Fall werden alle Warnungen abgefangen und keine Fehler ausgelöst.

Beim Eintritt in den Kontextmanager wird eine WarningsRecorder-Instanz zurückgegeben. Die aufgezeichneten Warnungen stehen über ihr Attribut warnings zur Verfügung, und ihre Methode reset() verwirft die bisher aufgezeichneten Warnungen.

Der Kontextmanager ist für diese Verwendung gedacht:

with check_warnings(("assertion is always true", SyntaxWarning),
                    ("", UserWarning)):
    exec('assert(False, "Hey!")')
    warnings.warn(UserWarning("Hide me!"))

Wurde in diesem Fall eine der beiden Warnungen nicht ausgelöst oder eine andere Warnung, würde check_warnings() einen Fehler auslösen.

Muss ein Test genauer in die Warnungen hineinsehen, statt nur zu prüfen, ob sie aufgetreten sind, lässt sich Code wie dieser verwenden:

with check_warnings(quiet=True) as w:
    warnings.warn("foo")
    assert str(w.message) == "foo"
    warnings.warn("bar")
    assert str(w.message) == "bar"
    assert str(w.warnings[0].message) == "foo"
    assert str(w.warnings[1].message) == "bar"
    w.reset()
    assert len(w.warnings) == 0

Hier werden alle Warnungen abgefangen und der Testcode prüft die aufgefangenen Warnungen unmittelbar.

Geändert in Version 3.2: Neue optionale Argumente filters und quiet.

class test.support.warnings_helper.WarningsRecorder(warnings_list)

Klasse, um Warnungen für Unit-Tests aufzuzeichnen. Hüllt die Liste der Warnungen, die warnings.catch_warnings() beim eingeschalteten Aufzeichnen zurückgibt. check_warnings() gibt eine Instanz dieser Klasse zurück.

Zur Bequemlichkeit lassen sich die Attribute des Objekts, das die jüngste Warnung darstellt, auch unmittelbar über das Recorder-Objekt erreichen. Wurde seit dem Erzeugen oder dem letzten Zurücksetzen des Recorders keine Warnung ausgelöst, geben diese Attribute None zurück.

warnings

Eine Liste der Warnungen, die seit dem Erzeugen oder dem letzten Zurücksetzen des Recorders aufgezeichnet wurden.

reset()

Verwirft die bisher aufgezeichneten Warnungen aus der Sicht des Recorders. Die zugrunde liegende Liste der Warnungen bleibt unverändert.