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
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.TestCaseerben, als Tests ausgeführt werden. Die KlasseTestFuncAcceptsSequencesMixinim Beispiel oben hat keine Daten und lässt sich daher nicht für sich allein ausführen. Deshalb erbt sie nicht vonunittest.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 vonunittest.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 Funktionrequires().
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 vontest.regrtestgesetzt.
- test.support.is_jython¶
True, wenn der laufende Interpreter Jython ist.
- test.support.is_android¶
True, wennsys.platformandroidist.
- test.support.is_emscripten¶
True, wennsys.platformemscriptenist.
- test.support.is_wasi¶
True, wennsys.platformwasiist.
- test.support.is_apple_mobile¶
True, wennsys.platformios,tvosoderwatchosist.
- test.support.is_apple¶
True, wennsys.platformdarwinist oderis_apple_mobileTrueist.
- 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.1lauscht.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()undsend()vonsocket.socketlang 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_TIMEOUTsollte einen Test normalerweise nicht als gescheitert markieren, sondern ihn überspringen. Siehetransient_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
--timeoutvon regrtest ab.Scheitert ein Test mit
SHORT_TIMEOUTauf langsamen Buildbots zufällig, verwende stattdessenLONG_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
--timeoutvon regrtest ab.Der voreingestellte Wert beträgt 5 Minuten.
Siehe auch
LOOPBACK_TIMEOUT,INTERNET_TIMEOUTundSHORT_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 MakroPy_DEBUGgebaut 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.supportliegt.
- test.support.TEST_HOME_DIR¶
Enthält das oberste Verzeichnis des Testpakets.
- test.support.TEST_DATA_DIR¶
Enthält das Verzeichnis
datainnerhalb des Testpakets.
- test.support.MAX_Py_ssize_t¶
Für Tests mit großem Speicherbedarf auf
sys.maxsizegesetzt.
- test.support.max_memuse¶
Von
set_memlimit()als Speichergrenze für Tests mit großem Speicherbedarf gesetzt. Begrenzt durchMAX_Py_ssize_t.
- test.support.real_max_memuse¶
Von
set_memlimit()als Speichergrenze für Tests mit großem Speicherbedarf gesetzt. Nicht begrenzt durchMAX_Py_ssize_t.
- test.support.MISSING_C_DOCSTRINGS¶
True, wenn Python ohne Docstrings gebaut ist, das MakroWITH_DOC_STRINGSalso nicht definiert ist. Siehe die Optionconfigure --without-doc-strings.Siehe auch die Variable
HAVE_DOCSTRINGS.
- test.support.HAVE_DOCSTRINGS¶
True, wenn Docstrings von Funktionen zur Verfügung stehen. Siehe die Optionpython -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
breakdie Schleife beendet.Löst nach timeout Sekunden einen
AssertionErroraus, 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
breakdie 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
Truezurück, wenn resource eingeschaltet und verfügbar ist. Die Liste der verfügbaren Ressourcen wird nur gesetzt, wenntest.regrtestdie Tests ausführt.
- test.support.get_resource_value(resource)¶
Gibt den für resource angegebenen Wert zurück (als
-u resource=value). GibtNonezurück, wenn resource abgeschaltet ist oder kein Wert angegeben wurde.
- test.support.python_is_optimized()¶
Gibt
Truezurück, wenn Python nicht mit-O0oder-Oggebaut wurde.
- test.support.with_pymalloc()¶
Gibt
Truezurück, wenn Python mit pymalloc eingeschaltet gebaut wurde und kein Build mit freien Threads ist.
- test.support.requires(resource, msg=None)¶
Löst
ResourceDeniedaus, wenn resource nicht zur Verfügung steht. msg ist das Argument fürResourceDenied, falls sie ausgelöst wird. Gibt immerTruezurück, wenn der Aufruf aus einer Funktion kommt, deren__name__'__main__'ist. Wird verwendet, wenntest.regrtestdie 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
TrueoderFalsezurü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_memuseundreal_max_memusefü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, odersys.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.flagsundsys.warnoptionsnachbilden.
- test.support.optim_args_from_interpreter_flags()¶
Gibt eine Liste von Befehlszeilenargumenten zurück, die die aktuellen Optimierungseinstellungen in
sys.flagsnachbilden.
- 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
faulthandlervorü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.attrfür die Dauer deswith-Blocks auf 5 und stellt am Ende des Blocks den alten Wert wieder her. Gibt esattranobjnicht, 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 deswith-Blocks auf 5 und stellt am Ende des Blocks den alten Wert wieder her. Gibt esitemanobjnicht, 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()aufsys.stdoutund dann aufsys.stderrauf. 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 alsf"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
AssertionErroraus, wenn der Beendigungscode des Prozesses nicht exitcode ist.Läuft der Prozess länger als timeout Sekunden (voreingestellt
SHORT_TIMEOUT), wird er abgebrochen und einAssertionErrorausgelöst. Die Zeitgrenze steht unter Windows nicht zur Verfügung.Added in version 3.9.
- test.support.calcobjsize(fmt)¶
Gibt die Größe des
PyObjectzurü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
PyVarObjectzurü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.getsizeoffür o plus die Größe des GC-Kopfes gleich size ist.
- @test.support.anticipate_failure(condition)¶
Ein Dekorator, der Tests bedingt mit
@unittest.expectedFailuremarkiert. 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_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_DOCSTRINGSausfü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 dasFalsezurü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_runFalse, bedeutet das, dass der Test keine Probeläufe unterstützt, wenn-Mnicht angegeben ist.
- @test.support.bigaddrspacetest¶
Dekorator für Tests, die den Adressraum füllen.
- test.support.linked_to_musl()¶
Gibt
Falsezurück, wenn nichts darauf hindeutet, dass der Interpreter mitmuslkompiliert wurde, sonst ein Versionstripel:(0, 0, 0), wenn die Version unbekannt ist, andernfalls die tatsächliche Version. Gedacht für die Verwendung inskip-Dekoratoren. Beiemscriptenundwasiwird angenommen, dass sie mitmuslkompiliert sind, sonst wirdplatform.libc_vergeprü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östenSyntaxErrorpassen soll. Ist lineno nichtNone, wird mit der Zeile der Ausnahme verglichen. Ist offset nichtNone, wird mit dem Offset der Ausnahme verglichen.
- test.support.open_urlresource(url, *args, **kw)¶
Öffnet url. Schlägt das Öffnen fehl, wird
TestFailedausgelöst.
- test.support.reap_children()¶
Rufe das aus
setUp(),tearDown()odertearDownModule()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.SkipTestaus, wenn einAttributeErrorauftritt.
- 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 vonunittestfür die Verwendung in Testpaketen. pkg_dir ist das Wurzelverzeichnis des Pakets; loader, standard_tests und pattern sind die Argumente, dieload_testserwartet. In einfachen Fällen kann die__init__.pydes 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.SkipTestaus, wenntracemalloceingeschaltet 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. EinzelneSubtests, 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()undsetUpModule()/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()undtearDown()laufen je einmal im Subprozess und werden im Elternprozess übersprungen. Scheitert oder überspringtsetUpClass()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 mitrunningInSubprocess.Der Subprozess erbt die eingeschalteten Ressourcen (
-u), die Speichergrenze (-M) und die Ausführlichkeit (-v) des Eltern-Testlaufs, sodassrequires_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
Nonein env hebt die Variable auf. Beachte, dass-Eund-Iden Subprozess diePYTHON*-Umgebungsvariablen übergehen lassen, auchPYTHONPATH.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, denrunInSubprocess()erzeugt hat, sonstFalse– auch im Elternprozess und in einem gewöhnlichen, nicht isolierten Testlauf. Fixtures wiesetUp(),tearDown(),setUpClass(),tearDownClass(),setUpModule()undtearDownModule()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
csvund 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.synchronizefehlt, keine Umsetzung von Semaphoren zur Verfügung steht oder das Erzeugen eines Locks einenOSErrorauslö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 vonresource.RLIMIT_COREauf 0 gesetzt, damit keine Coredump-Datei entsteht.Auf beiden Plattformen stellt
__exit__()den alten Wert wieder her.
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, sonstFalse.
- 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
sockerzeugt (voreingestelltAF_INET,SOCK_STREAM) und mit Port 0 an die angegebene Hostadresse gebunden (voreingestellt0.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-acceptfür den s_server-Modus von openssl. Gib wo möglich immerbind_port()den Vorzug vorfind_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.familyAF_INETundsock.typeSOCK_STREAMist und am SocketSO_REUSEADDRoderSO_REUSEPORTgesetzt 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_EXCLUSIVEADDRUSEzur 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.SkipTestaus, wenn einPermissionErrorauftritt.
- @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
ResourceDeniedauslö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
Truezurück, wennsys.executable interpreterUmgebungsvariablen braucht, um überhaupt laufen zu können.Gedacht für die Verwendung mit
@unittest.skipIf(), um Tests zu kennzeichnen, die eineassert_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.
PYTHONHOMEzu setzen ist ein Weg, in dieser Lage den größten Teil der Testsuite zum Laufen zu bringen.PYTHONPATHundPYTHONNOUSERSITEsind 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,__cwdundTERMgehö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 aufFalsegesetzt.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 einsubprocess.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.pyan 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 compiledTrue, 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
AssertionErrorausgelöst.
- BytecodeTestCase.assertNotInBytecode(x, opname, argval=_UNSPECIFIED)¶
Löst
AssertionErroraus, 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
AssertionErroraus, 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 versuchtstart_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.Threadmitthreading.excepthook()abfängt.Attribute, die beim Abfangen einer Ausnahme gesetzt werden:
exc_typeexc_valueexc_tracebackthread
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
Nonesein, 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
Nonesein, 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.environabzufragen 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
envvarvorübergehend auf den Wert vonvalue.
- 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.
- test.support.os_helper.can_symlink()¶
Gibt
Truezurück, wenn das Betriebssystem symbolische Verknüpfungen unterstützt, sonstFalse.
- test.support.os_helper.can_xattr()¶
Gibt
Truezurück, wenn das Betriebssystem xattr unterstützt, sonstFalse.
- 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
Truezurü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 oderos.lstat()undos.rmdir(), um einen Pfad und seinen Inhalt zu entfernen. Wie beirmdir()ist das unter Windows in eine Warteschleife gehüllt, die prüft, ob die Dateien noch vorhanden sind.
- @test.support.os_helper.skip_unless_symlink¶
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 mittempfile.mkdtemp()erzeugt.Ist quiet
Falseund 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 mittempfile.mkdtemp()erzeugt. Ist quietFalse, 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.
- test.support.os_helper.unlink(filename)¶
Ruft
os.unlink()für filename auf. Wie beirmdir()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_EPOCHauf epoch gesetzt ausführt.
- @test.support.os_helper.without_source_date_epoch¶
Ein Dekorator, der Tests mit aufgehobener Umgebungsvariable
SOURCE_DATE_EPOCHausfü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 inwithout_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 toimportlib.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.modulesand 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
encodingsfromsys.modulesin order to preserve the internal cache.
- test.support.import_helper.isolated_modules()¶
A context manager that makes a copy of
sys.moduleson 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
DeprecationWarningon import.When created, this makes a copy of
sys.modulesand 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.SkipTestaus, wenn sich das Modul nicht importieren lässt.Meldungen über veraltete Module und Pakete werden während dieses Imports unterdrückt, wenn deprecated
Trueist. Ist ein Modul auf einer Plattform erforderlich, auf anderen aber optional, setze required_on auf ein Iterable von Plattformpräfixen, die mitsys.platformverglichen 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.modulesbefore doing the import. Note that unlikereload, the original module is not affected by this operation.fresh is an iterable of additional module names that are also removed from the
sys.modulescache before doing the import.blocked ist ein Iterable von Modulnamen, die im Modul-Zwischenspeicher während des Imports durch
Noneersetzt werden, damit Versuche, sie zu importieren, einenImportErrorauslö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.moduleswhen the fresh import is complete.Meldungen über veraltete Module und Pakete werden während dieses Imports unterdrückt, wenn deprecated
Trueist.If usefrozen is False (the default) then the frozen importer is disabled (except for essential modules like
importlib._bootstrap).Diese Funktion löst
ImportErroraus, 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 anyNonevalues that would block the import.
Manipulating sys.path¶
- class test.support.import_helper.DirsOnSysPath(*paths)¶
Ein Kontextmanager, um
sys.pathvorübergehend Verzeichnisse hinzuzufügen.Er legt eine Kopie von
sys.pathan, hängt alle als positionsbezogene Argumente übergebenen Verzeichnisse an und setztsys.patham Ende des Kontexts auf die kopierten Einstellungen zurück.Beachte, dass alle Änderungen an
sys.pathim 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.moduleson 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
Truethis 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
Truefrozen 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_extensionssetting.
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
Warningoder eine Unterklasse davon sein. Entspricht in etwawarnings.catch_warnings()mitwarnings.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
ResourceWarningausgelöst wurde. Du musst das Objekt, das eineResourceWarningausgeben 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
SyntaxWarningnur einmal ausgegeben und in einenSyntaxErrorumgewandelt wird, wenn aus ihr ein Fehler gemacht wird. testcase ist dieunittest-Instanz des Tests. errtext ist der reguläre Ausdruck, der auf die Zeichenkettendarstellung der ausgegebenenSyntaxWarningund des ausgelöstenSyntaxErrorpassen soll. Ist lineno nichtNone, wird mit der Zeile von Warnung und Ausnahme verglichen. Ist offset nichtNone, 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 Aufrufwarnings.catch_warnings(record=True)mitwarnings.simplefilter()aufalways, mit der Möglichkeit, die aufgezeichneten Ergebnisse selbsttätig zu prüfen.check_warningsnimmt als positionsbezogene Argumente Zweiertupel der Form("message regexp", WarningCategory)an. Werden ein oder mehrere filters angegeben oder ist das optionale Schlüsselwortargument quietFalse, 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 aufTrue.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 Attributwarningszur Verfügung, und ihre Methodereset()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
Nonezurü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.