test — Regressionstestsammlung für Python

Hinweis

Das Paket test ist nur für die interne Verwendung durch Python bestimmt. Es wird zur Information der Kernentwickler von Python dokumentiert. Jede Verwendung dieses Pakets außerhalb der Standardbibliothek von Python wird nicht empfohlen, da der hier erwähnte Code zwischen den Python-Versionen ohne Vorankündigung geändert oder entfernt werden kann.


Das Paket test enthält alle Regressionstests für Python sowie die Module test.support und test.regrtest. test.support wird verwendet, um Ihre 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 Feature. Alle neuen Tests sollten mit dem Modul unittest oder doctest geschrieben werden. Einige ältere Tests sind im "traditionellen" Teststil geschrieben, der die an sys.stdout ausgegebene Ausgabe vergleicht; dieser Teststil gilt als veraltet.

Siehe auch

Modul unittest

Schreiben von PyUnit-Regressionstests.

Modul doctest

Tests, die in Dokumentationsstrings eingebettet sind.

Schreiben von Unit-Tests für das Paket test

Es wird bevorzugt, dass Tests, die das Modul unittest verwenden, einige Richtlinien befolgen. Eine davon ist, das Testmodul durch Voranstellen von test_ und Anhängen des zu testenden Modulnamens zu benennen. Die Testmethoden im Testmodul sollten mit test_ beginnen und mit einer Beschreibung dessen, was die Methode testet, enden. Dies ist notwendig, damit die Methoden vom Testtreiber als Testmethoden erkannt werden. Außerdem sollten keine Docstrings für die Methode enthalten sein. Ein Kommentar (wie z. B. # Tests funktion gibt nur True oder False zurück) sollte zur Dokumentation von Testmethoden verwendet werden. Dies geschieht, weil Docstrings ausgegeben werden, wenn sie vorhanden sind, und somit nicht angegeben wird, welcher Test gerade ausgeführt wird.

Eine grundlegende Boilerplate wird oft verwendet

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()

Dieses Code-Muster ermöglicht es, die Testsuite von test.regrtest auszuführen, eigenständig als Skript, das die unittest CLI unterstützt, oder über die python -m unittest CLI.

Das Ziel von Regressionstests ist es, zu versuchen, Code zu brechen. Dies führt zu einigen Richtlinien, die befolgt werden müssen

  • Die Testsuite sollte alle Klassen, Funktionen und Konstanten durchlaufen. Dies umfasst nicht nur die externe API, die der Außenwelt präsentiert werden soll, sondern auch den "privaten" Code.

  • Whitebox-Testing (Untersuchung des zu testenden Codes während des Schreibens der Tests) wird bevorzugt. Blackbox-Testing (nur Testen der veröffentlichten Benutzeroberfläche) ist nicht ausreichend, um sicherzustellen, dass alle Grenz- und Randfälle getestet werden.

  • Stellen Sie sicher, dass alle möglichen Werte getestet werden, einschließlich ungültiger. Dies stellt sicher, dass nicht nur alle gültigen Werte akzeptiert werden, sondern auch, dass fehlerhafte Werte korrekt behandelt werden.

  • Schöpfen Sie so viele Code-Pfade wie möglich aus. Testen Sie Verzweigungen und passen Sie die Eingaben so an, dass möglichst viele verschiedene Pfade durch den Code genommen werden.

  • Fügen Sie einen expliziten Test für alle gefundenen Fehler im getesteten Code hinzu. Dies stellt sicher, dass der Fehler in Zukunft nicht wieder auftritt, wenn der Code geändert wird.

  • Stellen Sie sicher, dass Sie Ihre Tests aufräumen (z. B. alle temporären Dateien schließen und löschen).

  • Wenn ein Test von einer bestimmten Bedingung des Betriebssystems abhängt, verifizieren Sie, dass die Bedingung bereits besteht, bevor Sie den Test versuchen.

  • Importieren Sie so wenige Module wie möglich und tun Sie dies so früh wie möglich. Dies minimiert externe Abhängigkeiten von Tests und minimiert auch mögliche anomale Verhaltensweisen durch Nebeneffekte beim Importieren eines Moduls.

  • Versuchen Sie, die Code-Wiederverwendung zu maximieren. Gelegentlich variieren Tests um Kleinigkeiten wie die Art der verwendeten Eingabe. Minimieren Sie Code-Duplizierung durch Unterklassifizierung einer grundlegenden Testklasse mit einer Klasse, die die Eingabe spezifiziert.

    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)
    

    Wenn Sie dieses Muster verwenden, denken Sie daran, dass alle Klassen, die von unittest.TestCase erben, als Tests ausgeführt werden. Die Klasse TestFuncAcceptsSequencesMixin im obigen Beispiel enthält keine Daten und kann daher nicht eigenständig ausgeführt werden, daher erbt sie nicht von unittest.TestCase.

Siehe auch

Testgetriebene Entwicklung

Ein Buch von Kent Beck über das Schreiben von Tests vor dem Code.

Ausführen von Tests über die Befehlszeilenschnittstelle

Das Paket test kann als Skript zur Steuerung der Python-Regressionstestsammlung ausgeführt werden, dank der Option -m: python -m test. Intern wird test.regrtest verwendet; der Aufruf python -m test.regrtest, der in früheren Python-Versionen verwendet wurde, funktioniert immer noch. Das Skript eigenständig auszuführen, beginnt automatisch mit der Ausführung aller Regressionstests im Paket test. Dies geschieht durch Auffinden aller Module im Paket, deren Name mit test_ beginnt, Importieren dieser und Ausführen der Funktion test_main(), falls vorhanden, oder Laden der Tests über unittest.TestLoader.loadTestsFromModule, falls test_main nicht existiert. Die Namen der auszuführenden Tests können auch an das Skript übergeben werden. Die Angabe eines einzelnen Regressionstests (python -m test test_spam) minimiert die Ausgabe und gibt nur aus, ob der Test bestanden oder fehlgeschlagen ist.

Das direkte Ausführen von test ermöglicht es, die für Tests verfügbaren Ressourcen festzulegen. Dies geschieht über die Befehlszeilenoption -u. Die Angabe von all als Wert für die Option -u aktiviert alle möglichen Ressourcen: python -m test -uall. Wenn alle bis auf eine Ressource gewünscht sind (ein häufigerer Fall), kann eine durch Kommas getrennte Liste der nicht gewünschten Ressourcen nach all aufgeführt werden. Der Befehl python -m test -uall,-audio,-largefile führt test mit allen Ressourcen außer den Ressourcen audio und largefile aus. Eine Liste aller Ressourcen und weitere Befehlszeilenoptionen erhalten Sie mit python -m test -h.

Einige andere Möglichkeiten, die Regressionstests auszuführen, hängen von der Plattform ab, auf der die Tests ausgeführt werden. Unter Unix können Sie make test im obersten Verzeichnis ausführen, in dem Python erstellt wurde. Unter Windows führt die Ausführung von rt.bat aus Ihrem PCbuild-Verzeichnis alle Regressionstests aus.

Hinzugefügt in Version 3.14: Die Ausgabe wird standardmäßig farblich hervorgehoben und kann über Umgebungsvariablen gesteuert werden.

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

Das Modul test.support bietet Unterstützung für die Regressionstestsammlung von Python.

Hinweis

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

Dieses Modul definiert die folgenden Ausnahmen

exception test.support.TestFailed

Ausnahme, die ausgelöst wird, wenn ein Test fehlschlägt. Dies ist zugunsten von unittest-basierten Tests und den Assertionsmethoden von unittest.TestCase veraltet.

exception test.support.ResourceDenied

Unterklasse von unittest.SkipTest. Wird ausgelöst, wenn eine Ressource (wie eine Netzwerkverbindung) nicht verfügbar ist. Wird von der Funktion requires() ausgelöst.

Das Modul test.support definiert die folgenden Konstanten

test.support.verbose

True, wenn eine ausführliche Ausgabe aktiviert ist. Sollte geprüft werden, wenn detailliertere Informationen 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

Timeout in Sekunden für Tests, die einen Netzwerkserver verwenden, der auf der lokalen Loopback-Schnittstelle des Netzwerks lauscht, wie z. B. 127.0.0.1.

Der Timeout ist lang genug, um Testfehler zu verhindern: Er berücksichtigt, dass der Client und der Server in verschiedenen Threads oder sogar verschiedenen Prozessen laufen können.

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

Sein Standardwert ist 5 Sekunden.

Siehe auch INTERNET_TIMEOUT.

test.support.INTERNET_TIMEOUT

Timeout in Sekunden für Netzwerkanfragen, die ins Internet gehen.

Der Timeout ist kurz genug, um zu verhindern, dass ein Test zu lange wartet, wenn die Internetanfrage aus irgendeinem Grund blockiert wird.

Normalerweise sollte ein Timeout mit INTERNET_TIMEOUT einen Test nicht als fehlgeschlagen markieren, sondern den Test stattdessen überspringen: siehe transient_internet().

Sein Standardwert ist 1 Minute.

Siehe auch LOOPBACK_TIMEOUT.

test.support.SHORT_TIMEOUT

Timeout in Sekunden, um einen Test als fehlgeschlagen zu markieren, wenn er "zu lange" dauert.

Der Timeout-Wert hängt von der Option --timeout der regrtest-Befehlszeile ab.

Wenn ein Test, der SHORT_TIMEOUT verwendet, auf langsamen Buildbots zufällig fehlschlägt, verwenden Sie stattdessen LONG_TIMEOUT.

Sein Standardwert ist 30 Sekunden.

test.support.LONG_TIMEOUT

Timeout in Sekunden, um zu erkennen, wann ein Test hängt.

Er ist lang genug, um das Risiko von Testfehlern auf den langsamsten Python-Buildbots zu reduzieren. Er sollte nicht verwendet werden, um einen Test als fehlgeschlagen zu markieren, wenn er "zu lange" dauert. Der Timeout-Wert hängt von der Option --timeout der regrtest-Befehlszeile ab.

Sein Standardwert ist 5 Minuten.

Siehe auch LOOPBACK_TIMEOUT, INTERNET_TIMEOUT und SHORT_TIMEOUT.

test.support.PGO

Gesetzt, wenn Tests übersprungen werden können, wenn sie für PGO nicht nützlich sind.

test.support.PIPE_MAX_SIZE

Eine Konstante, die wahrscheinlich größer ist als die zugrundeliegende Pipe-Puffergröße des Betriebssystems, um Schreibvorgänge blockierend zu machen.

test.support.Py_DEBUG

True, wenn Python mit der definierten Makro Py_DEBUG erstellt wurde, d.h. wenn Python im Debug-Modus erstellt wurde. Siehe die Option configure --enable-debug.

Hinzugefügt in Version 3.12.

test.support.SOCK_MAX_SIZE

Eine Konstante, die wahrscheinlich größer ist als die zugrundeliegende Socket-Puffergröße des Betriebssystems, um Schreibvorgänge blockierend zu machen.

test.support.TEST_SUPPORT_DIR

Auf das Stammverzeichnis gesetzt, das test.support enthält.

test.support.TEST_HOME_DIR

Auf das Stammverzeichnis für das Testpaket gesetzt.

test.support.TEST_DATA_DIR

Auf das data-Verzeichnis innerhalb des Testpakets gesetzt.

test.support.MAX_Py_ssize_t

Auf sys.maxsize für Tests mit großem Speicher gesetzt.

test.support.max_memuse

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

test.support.real_max_memuse

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

test.support.MISSING_C_DOCSTRINGS

Auf True gesetzt, wenn Python ohne Docstrings erstellt wurde (das Makro WITH_DOC_STRINGS ist nicht definiert). Siehe die Option configure --without-doc-strings.

Siehe auch die Variable HAVE_DOCSTRINGS.

test.support.HAVE_DOCSTRINGS

Auf True gesetzt, wenn Funktions-Docstrings verfügbar sind. Siehe die Option python -OO, die Docstrings von in Python implementierten Funktionen entfernt.

Siehe auch die Variable MISSING_C_DOCSTRINGS.

test.support.TEST_HTTP_URL

Definiert die URL eines dedizierten HTTP-Servers für die Netzwerktests.

test.support.ALWAYS_EQ

Objekt, das mit allem gleich ist. Wird zum Testen von Vergleichen unterschiedlicher Typen verwendet.

test.support.NEVER_EQ

Objekt, das mit nichts ungleich ist (nicht einmal mit ALWAYS_EQ). Wird zum Testen von Vergleichen unterschiedlicher Typen verwendet.

test.support.LARGEST

Objekt, das größer ist als alles andere (außer sich selbst). Wird zum Testen von Vergleichen unterschiedlicher Typen verwendet.

test.support.SMALLEST

Objekt, das kleiner ist als alles andere (außer sich selbst). Wird zum Testen von Vergleichen unterschiedlicher Typen verwendet.

Das Modul test.support definiert die folgenden Funktionen

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

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

Nach *timeout* Sekunden wird eine AssertionError ausgelöst, wenn *error* true ist, oder die Schleife wird einfach beendet, wenn *error* false ist.

Beispiel

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

Beispiel für error=False-Nutzung

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)

Warte-Strategie, die exponentielle Rückschaltung anwendet.

Führt den Schleifenkörper aus, bis break die Schleife beendet. Schläft bei jeder Schleifeniteration, aber nicht bei der ersten Iteration. Die Schlafverzögerung verdoppelt sich bei jeder Iteration (bis zu *max_delay* Sekunden).

Siehe die Dokumentation von busy_retry() für die Parameternutzung.

Beispiel für Auslösen einer Ausnahme nach SHORT_TIMEOUT Sekunden

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

Beispiel für error=False-Nutzung

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* aktiviert und verfügbar ist. Die Liste der verfügbaren Ressourcen wird nur gesetzt, wenn test.regrtest die Tests ausführt.

test.support.python_is_optimized()

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

test.support.with_pymalloc()

Gibt _testcapi.WITH_PYMALLOC zurück.

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

Löst ResourceDenied aus, wenn resource nicht verfügbar ist. msg ist das Argument für ResourceDenied, wenn es ausgelöst wird. Gibt immer True zurück, wenn es von einer Funktion aufgerufen wird, deren __name__ '__main__' ist. Wird verwendet, wenn Tests von test.regrtest ausgeführt werden.

test.support.sortdict(dict)

Gibt eine 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. Wenn keine Übereinstimmung gefunden wird, wird filename zurückgegeben. Dies entspricht keinem Fehler, da es der Pfad zur Datei sein könnte.

Das Setzen von subdir gibt einen relativen Pfad an, der zum Suchen der Datei verwendet werden soll, anstatt direkt in den Pfadverzeichnissen zu suchen.

test.support.get_pagesize()

Ermittelt die Seitengröße in Bytes.

Hinzugefügt in Version 3.12.

test.support.setswitchinterval(interval)

Setzt sys.setswitchinterval() auf das gegebene interval. Definiert ein minimales Intervall für Android-Systeme, um zu verhindern, dass das System einfriert.

test.support.check_impl_detail(**guards)

Verwenden Sie diese Prüfung, um CPythons implementierungsspezifische Tests zu schützen oder sie nur auf den durch die Argumente geschützten Implementierungen auszuführen. Diese Funktion gibt True oder False zurück, abhängig von der Host-Plattform. Beispielverwendung

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 für max_memuse und real_max_memuse für große Speichertests.

test.support.record_original_stdout(stdout)

Speichert den Wert von stdout. Er ist dazu gedacht, stdout zum Zeitpunkt des Beginns des regrtest zu speichern.

test.support.get_original_stdout()

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

test.support.args_from_interpreter_flags()

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

test.support.optim_args_from_interpreter_flags()

Gibt eine Liste von Kommandozeilenargumenten zurück, die die aktuellen Optimierungseinstellungen in sys.flags reproduzieren.

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

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

Beispiel für die Verwendung mit Ausgabestreams

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 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 deaktiviert.

test.support.gc_collect()

Erzwingt das Sammeln so vieler Objekte wie möglich. Dies ist notwendig, da die rechtzeitige Deallokation vom Garbage Collector nicht garantiert wird. Das bedeutet, dass `__del__`-Methoden später als erwartet aufgerufen werden können und WeakRefs länger als erwartet lebendig bleiben können.

test.support.disable_gc()

Ein Kontextmanager, der den Garbage Collector beim Eintritt deaktiviert. Beim Austritt wird der Garbage Collector in seinen vorherigen Zustand zurückversetzt.

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

Kontextmanager zum Austauschen eines Attributs mit einem neuen Objekt.

Verwendung

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

Dies setzt obj.attr während des with-Blocks auf 5 und stellt den alten Wert am Ende des Blocks wieder her. Wenn attr auf obj nicht existiert, wird es erstellt und am Ende des Blocks gelöscht.

Der alte Wert (oder None, wenn er nicht existiert) wird der Zielvariable der `as`-Klausel zugewiesen, falls eine vorhanden ist.

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

Kontextmanager zum Austauschen eines Elements mit einem neuen Objekt.

Verwendung

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

Dies setzt obj["item"] während des with-Blocks auf 5 und stellt den alten Wert am Ende des Blocks wieder her. Wenn item auf obj nicht existiert, wird es erstellt und am Ende des Blocks gelöscht.

Der alte Wert (oder None, wenn er nicht existiert) wird der Zielvariable der `as`-Klausel zugewiesen, falls eine vorhanden ist.

test.support.flush_std_streams()

Ruft die Methode flush() zuerst für sys.stdout und dann für sys.stderr auf. Sie kann verwendet werden, um sicherzustellen, dass die Protokollreihenfolge konsistent ist, bevor in stderr geschrieben wird.

Hinzugefügt in Version 3.11.

test.support.print_warning(msg)

Gibt eine Warnung in sys.__stderr__ aus. Formatiert die Nachricht als: f"Warning -- {msg}". Wenn msg aus mehreren Zeilen besteht, wird jeder Zeile das Präfix "Warning -- " vorangestellt.

Hinzugefügt in Version 3.9.

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

Wartet, bis der Prozess pid abgeschlossen ist, und prüft, ob der Prozessexitcode exitcode ist.

Löst einen AssertionError aus, wenn der Prozessexitcode nicht gleich exitcode ist.

Wenn der Prozess länger als timeout Sekunden läuft (SHORT_TIMEOUT standardmäßig), wird der Prozess beendet und ein AssertionError ausgelöst. Die Timeout-Funktion ist unter Windows nicht verfügbar.

Hinzugefügt in Version 3.9.

test.support.calcobjsize(fmt)

Gibt die Größe des PyObject zurück, dessen Strukturmember durch fmt definiert sind. Der zurückgegebene Wert enthält die Größe des Python-Objektheaders und die Ausrichtung.

test.support.calcvobjsize(fmt)

Gibt die Größe des PyVarObject zurück, dessen Strukturmember durch fmt definiert sind. Der zurückgegebene Wert enthält die Größe des Python-Objektheaders und die Ausrichtung.

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

Stellt für den Testfall test sicher, dass die sys.getsizeof für o plus die GC-Headergröße gleich size ist.

@test.support.anticipate_failure(condition)

Ein Dekorator, um Tests bedingt mit unittest.expectedFailure() zu kennzeichnen. Jede Verwendung dieses Dekorators sollte einen zugehörigen Kommentar mit der entsprechenden Tracker-Ausgabe haben.

test.support.system_must_validate_cert(f)

Ein Dekorator, der den dekorierten Test bei TLS-Zertifikatsvalidierungsfehlern überspringt.

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

Ein Dekorator zum Ausführen einer Funktion in einer anderen Locale, wobei sie nach Beendigung korrekt zurückgesetzt wird. catstr ist die Locale-Kategorie als String (z. B. "LC_ALL"). Die übergebenen locales werden sequenziell versucht, und die erste gültige Locale wird verwendet.

@test.support.run_with_tz(tz)

Ein Dekorator zum Ausführen einer Funktion in einer bestimmten Zeitzone, die nach Beendigung korrekt zurückgesetzt wird.

@test.support.requires_freebsd_version(*min_version)

Dekorator für die Mindestversion beim Ausführen von Tests unter FreeBSD. Wenn die FreeBSD-Version kleiner als das Minimum ist, wird der Test übersprungen.

@test.support.requires_linux_version(*min_version)

Dekorator für die Mindestversion beim Ausführen von Tests unter Linux. Wenn die Linux-Version kleiner als das Minimum ist, wird der Test übersprungen.

@test.support.requires_mac_version(*min_version)

Dekorator für die Mindestversion beim Ausführen von Tests unter macOS. Wenn die macOS-Version kleiner als das Minimum ist, wird der Test übersprungen.

@test.support.requires_gil_enabled

Dekorator zum Überspringen von Tests im Free-Threaded Build. Wenn die GIL deaktiviert ist, wird der Test übersprungen.

@test.support.requires_IEEE_754

Dekorator zum Überspringen von Tests auf Nicht-IEEE-754-Plattformen.

@test.support.requires_zlib

Dekorator zum Überspringen von Tests, wenn zlib nicht existiert.

@test.support.requires_gzip

Dekorator zum Überspringen von Tests, wenn gzip nicht existiert.

@test.support.requires_bz2

Dekorator zum Überspringen von Tests, wenn bz2 nicht existiert.

@test.support.requires_lzma

Dekorator zum Überspringen von Tests, wenn lzma nicht existiert.

@test.support.requires_resource(resource)

Dekorator zum Überspringen von Tests, wenn resource nicht verfügbar ist.

@test.support.requires_docstrings

Dekorator zum nur Ausführen des Tests, wenn HAVE_DOCSTRINGS wahr ist.

@test.support.requires_limited_api

Dekorator zum nur Ausführen des Tests, wenn die Limited C API verfügbar ist.

@test.support.cpython_only

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

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

Dekorator zum Aufrufen von check_impl_detail() auf guards. Wenn dies False zurückgibt, wird msg als Grund für das Überspringen des Tests verwendet.

@test.support.thread_unsafe(reason=None)

Dekorator zum Kennzeichnen von Tests als Thread-unsicher. Dieser Test wird immer in einem Thread ausgeführt, auch wenn er mit --parallel-threads aufgerufen wird.

@test.support.no_tracing

Dekorator zum vorübergehenden Deaktivieren des Tracings für die Dauer des Tests.

@test.support.refcount_test

Dekorator für Tests, die die Referenzzählung betreffen. Der Dekorator führt den Test nicht aus, wenn er nicht von CPython ausgeführt wird. Jede Trace-Funktion wird für die Dauer des Tests deaktiviert, um unerwartete Referenzzählungen, die durch die Trace-Funktion verursacht werden, zu vermeiden.

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

Dekorator für Bigmem-Tests.

size ist eine angeforderte Größe für den Test (in beliebigen, vom Test interpretierten Einheiten). memuse ist die Anzahl der Bytes pro Einheit für den Test oder eine gute Schätzung davon. Ein Test, der beispielsweise zwei Byte-Puffer von jeweils 4 GiB benötigt, könnte mit @bigmemtest(size=_4G, memuse=2) dekoriert werden.

Das Argument size wird normalerweise als zusätzliches Argument an die dekorierte Testmethode übergeben. Wenn dry_run True ist, kann der an die Testmethode übergebene Wert kleiner als der angeforderte Wert sein. Wenn dry_run False ist, bedeutet dies, dass der Test keine Dummy-Lä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 keine Hinweise darauf vorliegen, dass der Interpreter mit musl kompiliert wurde, andernfalls gibt er ein Versionstupel zurück, entweder (0, 0, 0), wenn die Version unbekannt ist, oder die tatsächliche Version, wenn sie bekannt ist. Gedacht für die Verwendung in skip-Dekoratoren. emscripten und wasi werden als mit musl kompiliert angenommen; andernfalls wird platform.libc_ver überprüft.

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

Prüft auf Syntaxfehler in statement, indem versucht wird, statement zu kompilieren. testcase ist die Instanz von unittest für den Test. errtext ist der reguläre Ausdruck, der die Zeichenfolgendarstellung des ausgelösten SyntaxError abgleichen soll. Wenn lineno nicht None ist, wird mit der Zeile der Ausnahme verglichen. Wenn offset nicht None ist, wird mit dem Offset der Ausnahme verglichen.

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

Öffnet url. Wenn das Öffnen fehlschlägt, wird TestFailed ausgelöst.

test.support.reap_children()

Verwenden Sie dies am Ende von test_main, wann immer Unterprozesse gestartet werden. Dies hilft sicherzustellen, dass keine zusätzlichen Kinder (Zombies) zurückbleiben, die Ressourcen verbrauchen und Probleme bei der Suche nach Refleaks verursachen.

test.support.get_attribute(obj, name)

Ruft ein Attribut ab und löst unittest.SkipTest aus, wenn ein AttributeError ausgelöst wird.

test.support.catch_unraisable_exception()

Kontextmanager zum Abfangen nicht behandelbarer Ausnahmen mittels sys.unraisablehook().

Das Speichern des Ausnahmewerts (cm.unraisable.exc_value) erzeugt einen Referenzzyklus. Der Referenzzyklus wird explizit beim Beenden des Kontextmanagers unterbrochen.

Das Speichern des Objekts (cm.unraisable.object) kann es wiederbeleben, wenn es auf ein Objekt gesetzt wird, das gerade finalisiert wird. Das Beenden des Kontextmanagers löscht das gespeicherte Objekt.

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)

Hinzugefügt in Version 3.8.

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

Generische Implementierung des unittest load_tests Protokolls zur Verwendung in Testpaketen. pkg_dir ist das Stammverzeichnis des Pakets; loader, standard_tests und pattern sind die Argumente, die von load_tests erwartet werden. In einfachen Fällen kann die __init__.py des Testpakets wie folgt 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 oder Methoden von ref_api zurück, die nicht in other_api gefunden werden, mit Ausnahme einer definierten Liste von Elementen, die bei dieser Prüfung ignoriert werden sollen und in ignore angegeben sind.

Standardmäßig werden private Attribute, die mit ‘_’ beginnen, übersprungen, aber alle magischen Methoden, d. h. diejenigen, die mit ‘__’ beginnen und enden, werden eingeschlossen.

Hinzugefügt 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. Fügt auch ein Bereinigungsverfahren zu test_instance hinzu, um object_to_patch für attr_name wiederherzustellen. Der attr_name sollte ein gültiges Attribut für object_to_patch sein.

test.support.run_in_subinterp(code)

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

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

Stellt sicher, dass Instanzen von cls nach der Iteration deallokiert werden.

test.support.missing_compiler_executable(cmd_names=[])

Prüft auf die Existenz der Compiler-Executable-Dateien, deren Namen in cmd_names aufgeführt sind, oder aller Compiler-Executable-Dateien, wenn cmd_names leer ist, und gibt die erste fehlende Executable oder None zurück, wenn keine fehlt.

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

Stellt sicher, dass die Variable __all__ von module alle öffentlichen Namen enthält.

Die öffentlichen Namen des Moduls (seine API) werden automatisch ermittelt, basierend darauf, ob sie der Konvention für öffentliche Namen entsprechen und im module definiert wurden.

Das Argument name_of_module kann angeben (als String oder Tupel davon), in welchem Modul/welchen Modulen eine API definiert sein könnte, um als öffentliche API erkannt zu werden. Ein Fall dafür ist, wenn module einen Teil seiner öffentlichen API aus anderen Modulen importiert, möglicherweise ein C-Backend (wie csv und sein _csv).

Das Argument extra kann eine Menge von Namen sein, die nicht automatisch als „öffentlich“ erkannt würden, wie z. B. Objekte ohne ein korrektes __module__-Attribut. Falls angegeben, wird es zu den automatisch erkannten hinzugefügt.

Das Argument not_exported kann eine Menge von Namen sein, die nicht als Teil der öffentlichen API behandelt werden dürfen, auch wenn ihre Namen darauf hindeuten.

Beispiel für die Verwendung

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)

Hinzugefügt in Version 3.6.

test.support.skip_if_broken_multiprocessing_synchronize()

Überspringt Tests, wenn das Modul multiprocessing.synchronize fehlt, wenn keine Semaphore-Implementierung verfügbar ist oder wenn das Erstellen eines Locks einen OSError auslöst.

Hinzugefügt in Version 3.10.

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

Stellt sicher, dass der Typ tp nicht mit args und kwds instanziiert werden kann.

Hinzugefügt in Version 3.10.

test.support.adjust_int_max_str_digits(max_digits)

Diese Funktion gibt einen Kontextmanager zurück, der die globale Einstellung von sys.set_int_max_str_digits() für die Dauer des Kontexts ändert, um die Ausführung von Testcode zu ermöglichen, der ein anderes Limit für die Anzahl der Ziffern bei der Konvertierung zwischen Ganzzahl und Zeichenkette benötigt.

Hinzugefügt in Version 3.11.

Das Modul test.support definiert die folgenden Klassen

class test.support.SuppressCrashReport

Ein Kontextmanager, der verwendet wird, um zu versuchen, Fehlermeldungen bei Abstürzen von Unterprozessen bei Tests zu verhindern, bei denen ein Absturz erwartet wird.

Unter Windows deaktiviert er Windows-Fehlerberichts-Dialoge mithilfe von SetErrorMode.

Unter UNIX wird resource.setrlimit() verwendet, um das Soft-Limit von resource.RLIMIT_CORE auf 0 zu setzen, um die Erstellung von Core-Dump-Dateien zu verhindern.

Auf beiden Plattformen wird der alte Wert durch __exit__() wiederhergestellt.

class test.support.SaveSignals

Klasse zum Speichern und Wiederherstellen von Signal-Handlern, die vom Python-Signal-Handler registriert wurden.

save(self)

Speichert die Signal-Handler in einem Wörterbuch, das Signalnummern auf den aktuellen Signal-Handler abbildet.

restore(self)

Setzt die Signalnummern aus dem Wörterbuch von save() auf den gespeicherten Handler.

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

Versucht, ein einzelnes Dictionary 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 — Hilfsprogramme für Socket-Tests

Das Modul test.support.socket_helper bietet Unterstützung für Socket-Tests.

Hinzugefügt in Version 3.9.

test.support.socket_helper.IPV6_ENABLED

Auf True gesetzt, wenn IPv6 auf diesem Host aktiviert ist, andernfalls False.

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

Gibt einen ungenutzten Port zurück, der zum Binden geeignet sein sollte. Dies wird erreicht, indem ein temporärer Socket mit der gleichen Familie und demselben Typ wie der sock-Parameter (Standard ist AF_INET, SOCK_STREAM) erstellt und an die angegebene Host-Adresse (Standard ist 0.0.0.0) mit Port 0 gebunden wird, um vom Betriebssystem einen ungenutzten, flüchtigen Port zu erhalten. Der temporäre Socket wird dann geschlossen und gelöscht, und der flüchtige Port wird zurückgegeben.

Entweder diese Methode oder bind_port() sollte für alle Tests verwendet werden, bei denen ein Server-Socket für die Dauer des Tests an einen bestimmten Port gebunden werden muss. Welche Methode verwendet werden soll, hängt davon ab, ob der aufrufende Code einen Python-Socket erstellt oder ob ein ungenutzter Port in einem Konstruktor bereitgestellt oder an ein externes Programm übergeben werden muss (d. h. das Argument -accept für den s_server-Modus von openssl). Bevorzugen Sie immer bind_port() gegenüber find_unused_port(), wo immer möglich. Die Verwendung eines hartkodierten Ports wird nicht empfohlen, da dies die gleichzeitige Ausführung mehrerer Testinstanzen unmöglich machen kann, was ein Problem für Buildbots darstellt.

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

Bindet den Socket an einen freien Port und gibt die Portnummer zurück. Nutzt flüchtige Ports, um sicherzustellen, dass ein ungebundener Port verwendet wird. Dies ist wichtig, da viele Tests gleichzeitig laufen können, insbesondere in einer Buildbot-Umgebung. Diese Methode löst eine Ausnahme aus, wenn sock.family AF_INET ist und sock.type SOCK_STREAM ist und der Socket die Optionen SO_REUSEADDR oder SO_REUSEPORT gesetzt hat. Tests sollten diese Socket-Optionen für TCP/IP-Sockets niemals setzen. Der einzige Fall, in dem diese Optionen gesetzt werden sollten, ist das Testen von Multicasting über mehrere UDP-Sockets.

Zusätzlich wird, wenn die Socket-Option SO_EXCLUSIVEADDRUSE verfügbar ist (d. h. unter Windows), diese auf dem Socket gesetzt. Dies verhindert, dass jemand anderes während der Laufzeit des Tests an unseren Host/Port bindet.

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

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

@test.support.socket_helper.skip_unless_bind_unix_socket

Ein Dekorator zum Ausführen von Tests, die ein funktionierendes bind() für Unix-Sockets erfordern.

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

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

test.support.script_helper — Hilfsprogramme für die Tests zur Ausführung von Python-Skripten

Das Modul test.support.script_helper bietet Unterstützung für die Tests zur Ausführung von Python-Skripten.

test.support.script_helper.interpreter_requires_environment()

Gibt True zurück, wenn der sys.executable Interpreter Umgebungsvariablen benötigt, um überhaupt ausgeführt werden zu können.

Dies ist zur Verwendung mit @unittest.skipIf() vorgesehen, um Tests zu annotieren, die eine assert_python*() Funktion verwenden müssen, um einen isolierten Modus (-I) oder einen Modus ohne Umgebung (-E) Unterinterpreterprozess zu starten.

Ein normaler Build & Test stößt nicht auf diese Situation, aber es kann passieren, wenn versucht wird, die Testsuite der Standardbibliothek von einem Interpreter auszuführen, der keine offensichtliche Heimat mit der aktuellen Python-Logik zur Ermittlung der Heimat hat.

Das Setzen von PYTHONHOME ist eine Möglichkeit, die meisten Tests in dieser Situation auszuführen. PYTHONPATH oder PYTHONUSERSITE sind andere gängige Umgebungsvariablen, die beeinflussen können, ob der Interpreter gestartet werden kann.

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

Richtet die Umgebung basierend auf env_vars für die Ausführung des Interpreters in einem Unterprozess ein. Die Werte können __isolated, __cleanenv, __cwd und TERM enthalten.

Geändert in Version 3.9: Die Funktion entfernt keine Leerzeichen mehr aus stderr.

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

Stellt sicher, dass die Ausführung des Interpreters mit args und optionalen Umgebungsvariablen env_vars erfolgreich ist (rc == 0) und gibt ein Tupel (return code, stdout, stderr) zurück.

Wenn der schlüsselwortbasierte Parameter __cleanenv gesetzt ist, wird env_vars als frische Umgebung verwendet.

Python wird im isolierten Modus gestartet (Befehlszeilenoption -I), es sei denn, der schlüsselwortbasierte Parameter __isolated ist auf False gesetzt.

Geändert in Version 3.9: Die Funktion entfernt keine Leerzeichen mehr aus stderr.

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

Stellt sicher, dass die Ausführung des Interpreters mit args und optionalen Umgebungsvariablen env_vars fehlschlägt (rc != 0) und gibt ein Tupel (return code, stdout, stderr) zurück.

Weitere Optionen finden Sie unter assert_python_ok().

Geändert in Version 3.9: Die Funktion entfernt keine Leerzeichen mehr aus stderr.

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

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

kw sind zusätzliche Schlüsselwortargumente, die an subprocess.Popen() übergeben werden. Gibt ein subprocess.Popen-Objekt zurück.

test.support.script_helper.kill_python(p)

Führt den gegebenen 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)

Erstellt ein Skript, das source im Pfad script_dir und script_basename enthält. Wenn omit_suffix False ist, 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)

Erstellt eine Zip-Datei unter zip_dir und zip_basename mit der Erweiterung zip, die die Dateien in script_name enthält. name_in_zip ist der Archivname. Gibt ein Tupel zurück, das (vollständiger Pfad, vollständiger Pfad des Archivnamens) enthält.

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

Erstellt ein Verzeichnis namens pkg_dir, das eine __init__-Datei mit init_source als Inhalt enthält.

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

Erstellt ein Zip-Paketverzeichnis mit dem Pfad zip_dir und zip_basename, das eine leere Datei __init__ und eine Datei script_basename enthält, welche den source enthält. Wenn compiled True ist, werden beide Quelldateien kompiliert und dem Zip-Paket hinzugefügt. Gibt ein Tupel des vollständigen Zip-Pfads und des Archivnamens der Zip-Datei zurück.

test.support.bytecode_helper — Unterstützungswerkzeuge zur Überprüfung der korrekten Bytecode-Generierung

Das Modul test.support.bytecode_helper bietet Unterstützung für Tests und die Inspektion der Bytecode-Generierung.

Hinzugefügt in Version 3.9.

Das Modul definiert die folgende Klasse

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

Diese Klasse verfügt über benutzerdefinierte Assertionsmethoden zur Inspektion von Bytecode.

BytecodeTestCase.get_disassembly_as_string(co)

Gibt die Disassemblierung von co als String zurück.

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

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

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

Löst eine AssertionError aus, wenn opname gefunden wird.

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

Das Modul test.support.threading_helper bietet Unterstützung für Threading-Tests.

Hinzugefügt in Version 3.10.

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

Verbindet einen thread innerhalb von timeout. Löst eine AssertionError aus, wenn der Thread nach timeout Sekunden noch aktiv ist.

@test.support.threading_helper.reap_threads

Dekorator, der sicherstellt, dass die Threads auch dann bereinigt werden, wenn der Test fehlschlägt.

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

Kontextmanager zum Starten von threads, einer Sequenz von Threads. unlock ist eine Funktion, die nach dem Start der Threads aufgerufen wird, auch wenn eine Ausnahme ausgelöst wurde; ein Beispiel wäre threading.Event.set(). start_threads versucht, die gestarteten Threads beim Beenden zu verbinden.

test.support.threading_helper.threading_cleanup(*original_values)

Bereinigt Threads, die nicht in original_values angegeben sind. Konzipiert, um eine Warnung auszugeben, wenn ein Test laufende Threads im Hintergrund hinterlässt.

test.support.threading_helper.threading_setup()

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

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

Kontextmanager, der wartet, bis alle Threads, die innerhalb der with-Anweisung erstellt wurden, beendet sind.

test.support.threading_helper.catch_threading_exception()

Kontextmanager, der Ausnahmen von threading.Thread mithilfe von threading.excepthook() abfängt.

Attribute, die bei Erfassung einer Ausnahme gesetzt werden

  • exc_type

  • exc_value

  • exc_traceback

  • thread

Siehe Dokumentation zu threading.excepthook().

Diese Attribute werden beim Beenden 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)

Hinzugefügt in Version 3.8.

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

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

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

Das Modul test.support.os_helper bietet Unterstützung für os-Tests.

Hinzugefügt in Version 3.10.

test.support.os_helper.FS_NONASCII

Ein Nicht-ASCII-Zeichen, das von os.fsencode() kodiert werden kann.

test.support.os_helper.SAVEDCWD

Auf os.getcwd() gesetzt.

test.support.os_helper.TESTFN

Auf einen Namen gesetzt, der sicher als Name einer temporären Datei verwendet werden kann. Jede erstellte temporäre Datei sollte geschlossen und entlinkt (gelöscht) werden.

test.support.os_helper.TESTFN_NONASCII

Auf einen Dateinamen gesetzt, der das Zeichen FS_NONASCII enthält, falls vorhanden. Dies garantiert, dass der Dateiname, wenn er existiert, mit der Standard-Dateisystemkodierung kodiert und dekodiert werden kann. Dies ermöglicht das einfache Überspringen von Tests, die einen Nicht-ASCII-Dateinamen erfordern, auf Plattformen, auf denen sie nicht funktionieren.

test.support.os_helper.TESTFN_UNENCODABLE

Auf einen Dateinamen (Typ str) gesetzt, der im strikten Modus nicht von der Dateisystemkodierung kodiert werden kann. Dies kann None sein, wenn ein solcher Dateiname nicht generiert werden kann.

test.support.os_helper.TESTFN_UNDECODABLE

Auf einen Dateinamen (Typ bytes) gesetzt, der im strikten Modus nicht von der Dateisystemkodierung dekodiert werden kann. Dies kann None sein, wenn ein solcher Dateiname nicht generiert werden kann.

test.support.os_helper.TESTFN_UNICODE

Auf einen Nicht-ASCII-Namen für eine temporäre Datei gesetzt.

class test.support.os_helper.EnvironmentVarGuard

Klasse zum vorübergehenden Setzen oder Aufheben von Umgebungsvariablen. Instanzen können als Kontextmanager verwendet werden und verfügen über eine vollständige Wörterbuchschnittstelle zum Abfragen/Ändern des zugrunde liegenden os.environ. Nach dem Verlassen des Kontextmanagers werden alle Änderungen an Umgebungsvariablen, die über diese Instanz vorgenommen wurden, rückgängig gemacht.

Geändert in Version 3.1: Wörterbuchschnittstelle hinzugefügt.

class test.support.os_helper.FakePath(path)

Einfaches pfadähnliches Objekt. Es implementiert die Methode __fspath__(), die einfach das Argument path zurückgibt. Wenn path eine Ausnahme ist, wird diese in __fspath__() ausgelöst.

EnvironmentVarGuard.set(envvar, value)

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

EnvironmentVarGuard.unset(envvar, *others)

Hebt vorübergehend eine oder mehrere Umgebungsvariablen auf.

Geändert in Version 3.14: Mehrere Umgebungsvariablen können aufgehoben werden.

Gibt True zurück, wenn das Betriebssystem symbolische Links unterstützt, andernfalls False.

test.support.os_helper.can_xattr()

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

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

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

Wenn quiet False ist, löst der Kontextmanager bei einem Fehler eine Ausnahme aus. Andernfalls gibt er nur eine Warnung aus und behält das aktuelle Arbeitsverzeichnis bei.

test.support.os_helper.create_empty_file(filename)

Erstellt eine leere Datei mit filename. Wenn sie bereits existiert, wird sie gekürzt.

test.support.os_helper.fd_count()

Zählt die Anzahl der offenen Dateideskriptoren.

test.support.os_helper.fs_is_case_insensitive(directory)

Gibt True zurück, wenn das Dateisystem für directory nicht zwischen Groß- und Kleinschreibung unterscheidet.

test.support.os_helper.make_bad_fd()

Erstellt einen ungültigen Dateideskriptor, indem eine temporäre Datei geöffnet und geschlossen wird, und gibt deren Deskriptor zurück.

test.support.os_helper.rmdir(filename)

Ruft os.rmdir() für filename auf. Auf Windows-Plattformen wird dies mit einer Warteschleife umschlossen, die die Existenz der Datei prüft, was aufgrund von Antivirenprogrammen erforderlich ist, die Dateien offen halten und die Löschung verhindern können.

test.support.os_helper.rmtree(path)

Ruft shutil.rmtree() für path auf oder ruft os.lstat() und os.rmdir() auf, um einen Pfad und dessen Inhalt zu entfernen. Wie bei rmdir() wird auf Windows-Plattformen dies mit einer Warteschleife umschlossen, die die Existenz der Dateien prüft.

Ein Dekorator zum Ausführen von Tests, die Unterstützung für symbolische Links erfordern.

@test.support.os_helper.skip_unless_xattr

Ein Dekorator zum Ausführen von Tests, die Unterstützung für xattr erfordern.

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

Ein Kontextmanager, der vorübergehend ein neues Verzeichnis erstellt und das aktuelle Arbeitsverzeichnis (CWD) ändert.

Der Kontextmanager erstellt vor dem vorübergehenden Ändern des aktuellen Arbeitsverzeichnisses ein temporäres Verzeichnis im aktuellen Verzeichnis mit dem Namen name. Wenn name None ist, wird das temporäre Verzeichnis mithilfe von tempfile.mkdtemp() erstellt.

Wenn quiet False ist und es nicht möglich ist, das CWD zu erstellen oder zu ändern, wird ein Fehler ausgelöst. Andernfalls wird nur eine Warnung ausgegeben und das ursprüngliche CWD wird verwendet.

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

Ein Kontextmanager, der ein temporäres Verzeichnis an path erstellt und das Verzeichnis liefert.

Wenn path None ist, wird das temporäre Verzeichnis mithilfe von tempfile.mkdtemp() erstellt. Wenn quiet False ist, löst der Kontextmanager bei einem Fehler eine Ausnahme aus. Andernfalls wird, wenn path angegeben ist und nicht erstellt werden kann, nur eine Warnung ausgegeben.

test.support.os_helper.temp_umask(umask)

Ein Kontextmanager, der vorübergehend die Prozess-Umask setzt.

Ruft os.unlink() für filename auf. Wie bei rmdir() wird auf Windows-Plattformen dies mit einer Warteschleife umschlossen, die die Existenz der Datei prüft.

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

Das Modul test.support.import_helper bietet Unterstützung für Import-Tests.

Hinzugefügt in Version 3.10.

test.support.import_helper.forget(module_name)

Entfernt das Modul mit dem Namen module_name aus sys.modules und löscht alle Bytecode-kompilierten Dateien des Moduls.

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

Diese Funktion importiert und gibt eine frische Kopie des benannten Python-Moduls zurück, indem das benannte Modul vor dem Import aus sys.modules entfernt wird. Beachten Sie, dass im Gegensatz zu reload() das ursprüngliche Modul von dieser Operation nicht betroffen ist.

fresh ist ein iterierbares Objekt mit zusätzlichen Modulnamen, die ebenfalls aus dem Cache sys.modules entfernt werden, bevor der Import durchgeführt wird.

blocked ist ein iterierbares Objekt mit Modulnamen, die während des Imports durch None im Modul-Cache ersetzt werden, um sicherzustellen, dass Versuche, sie zu importieren, einen ImportError auslösen.

Das benannte Modul und alle in den Parametern fresh und blocked benannten Module werden vor Beginn des Imports gespeichert und nach Abschluss des frischen Imports wieder in sys.modules eingefügt.

Modul- und Paket-Deprecation-Meldungen werden während dieses Imports unterdrückt, wenn deprecated True ist.

Diese Funktion löst einen ImportError aus, wenn das benannte Modul nicht importiert werden kann.

Beispiel für die Verwendung

# 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'])

Hinzugefügt in Version 3.1.

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

Diese Funktion importiert und gibt das benannte Modul zurück. Im Gegensatz zu einem normalen Import löst diese Funktion unittest.SkipTest aus, wenn das Modul nicht importiert werden kann.

Modul- und Paket-Deprecation-Meldungen werden während dieses Imports unterdrückt, wenn deprecated True ist. Wenn ein Modul auf einer Plattform erforderlich, für andere aber optional ist, setzen Sie required_on auf ein iterierbares Objekt mit Plattformpräfixen, die mit sys.platform verglichen werden.

Hinzugefügt in Version 3.1.

test.support.import_helper.modules_setup()

Gibt eine Kopie von sys.modules zurück.

test.support.import_helper.modules_cleanup(oldmodules)

Entfernt Module mit Ausnahme von oldmodules und encodings, um den internen Cache zu erhalten.

test.support.import_helper.unload(name)

Löscht name aus sys.modules.

test.support.import_helper.make_legacy_pyc(source)

Verschiebt eine PEP 3147/PEP 488 pyc-Datei an ihren Legacy-pyc-Speicherort und gibt den Dateisystempfad zur Legacy-pyc-Datei zurück. Der Wert source ist der Dateisystempfad zur Quelldatei. Sie muss nicht existieren, aber die PEP 3147/488 pyc-Datei muss existieren.

class test.support.import_helper.CleanImport(*module_names)

Ein Kontextmanager, um den Import zu erzwingen, eine neue Modulreferenz zurückzugeben. Dies ist nützlich zum Testen von Modul-Level-Verhaltensweisen, wie z. B. das Ausgeben einer DeprecationWarning beim Import. Beispielverwendung

with CleanImport('foo'):
    importlib.import_module('foo')  # New reference.
class test.support.import_helper.DirsOnSysPath(*paths)

Ein Kontextmanager zum vorübergehenden Hinzufügen von Verzeichnissen zu sys.path.

Dies erstellt eine Kopie von sys.path, fügt alle als Positionsargumente übergebenen Verzeichnisse hinzu und stellt dann sys.path beim Beenden des Kontexts wieder auf die kopierten Einstellungen zurück.

Beachten Sie, dass *alle* Modifikationen von sys.path im Körper des Kontextmanagers, einschließlich des Ersetzens des Objekts, am Ende des Blocks rückgängig gemacht werden.

test.support.warnings_helper — Hilfsprogramme für Warnungstests

Das Modul test.support.warnings_helper bietet Unterstützung für Warnungstests.

Hinzugefügt in Version 3.10.

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

Unterdrückt Warnungen, die Instanzen von category sind, was Warning oder eine Unterklasse davon sein muss. Ungefähr äquivalent zu warnings.catch_warnings() mit warnings.simplefilter('ignore', category=category). Zum Beispiel

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

Hinzugefügt in Version 3.8.

test.support.warnings_helper.check_no_resource_warning(testcase)

Kontextmanager, um zu prüfen, ob keine ResourceWarning ausgelöst wurde. Sie müssen das Objekt, das möglicherweise ResourceWarning auslöst, vor dem Ende des Kontextmanagers entfernen.

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

Testet auf Syntaxwarnungen in statement, indem versucht wird, statement zu kompilieren. Testet auch, dass die SyntaxWarning nur einmal ausgelöst wird und dass sie in einen SyntaxError umgewandelt wird, wenn sie zu einem Fehler wird. testcase ist die unittest-Instanz für den Test. errtext ist der reguläre Ausdruck, der die Zeichenkettendarstellung der ausgelösten SyntaxWarning und des ausgelösten SyntaxError abgleichen sollte. Wenn lineno nicht None ist, wird mit der Zeile der Warnung und des Fehlers verglichen. Wenn offset nicht None ist, wird mit dem Offset des Fehlers verglichen.

Hinzugefügt in Version 3.8.

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

Eine praktische Wrapper-Funktion für warnings.catch_warnings(), die das Testen, ob eine Warnung korrekt ausgelöst wurde, erleichtert. Sie ist annähernd äquivalent zum Aufrufen von warnings.catch_warnings(record=True) mit warnings.simplefilter() auf always gesetzt und mit der Option, die aufgezeichneten Ergebnisse automatisch zu validieren.

check_warnings akzeptiert 2-Tupel der Form ("message regexp", WarningCategory) als Positionsargumente. Wenn ein oder mehrere filters angegeben sind oder wenn das optionale Schlüsselwortargument quiet False ist, wird geprüft, ob die Warnungen wie erwartet sind: Jeder angegebene Filter muss mindestens eine der von dem eingeschlossenen Code ausgelösten Warnungen abgleichen, sonst schlägt der Test fehl, und wenn Warnungen ausgelöst werden, die nicht mit einem der angegebenen Filter übereinstimmen, schlägt der Test fehl. Um die erste dieser Prüfungen zu deaktivieren, setzen Sie quiet auf True.

Wenn keine Argumente angegeben sind, ist der Standardwert

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

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

Beim Eintritt in den Kontextmanager wird eine Instanz von WarningRecorder zurückgegeben. Die zugrunde liegende Warnungsliste von catch_warnings() ist über das Attribut warnings des Rekorders verfügbar. Als Komfortfunktion können die Attribute des Objekts, das die zuletzt aufgetretene Warnung darstellt, auch direkt über das Rekorderobjekt aufgerufen werden (siehe Beispiel unten). Wenn keine Warnung ausgelöst wurde, geben alle Attribute, die sonst auf einem Objekt erwartet würden, das eine Warnung darstellt, None zurück.

Das Rekorderobjekt hat auch eine Methode reset(), die die Warnungsliste leert.

Der Kontextmanager ist für die Verwendung wie folgt konzipiert

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

In diesem Fall würde check_warnings() einen Fehler auslösen, wenn entweder die Warnung nicht ausgelöst wurde oder eine andere Warnung ausgelöst wurde.

Wenn ein Test tiefer in die Warnungen schauen muss, anstatt nur zu prüfen, ob sie aufgetreten sind oder nicht, kann Code wie dieser verwendet werden

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

Hier werden alle Warnungen abgefangen und der Testcode testet die erfassten Warnungen direkt.

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

class test.support.warnings_helper.WarningsRecorder

Klasse zur Aufzeichnung von Warnungen für Unit-Tests. Weitere Details finden Sie in der Dokumentation von check_warnings() oben.