Ich bin neu zu Pytest. Wann wird @ pytest.hookimpl ausgeführt? Und was ist die vollständige Nutzung davon? Ich habe es mit Baumstämmen versucht. Für (hookwrapper = true), es ist Drucken, 3 Sätze von nach und vor Ertrag für einen einzelnen Test.Wann ist @ Pytest.hookimpl führt
Antwort
pytest verwendet @pytest.hookimpl
nur zum Beschriften von Hook-Methoden. (So @pytest.hookimpl
ausgeführt wird, wenn pytest der Hook-Methode sammelt.)
Wenn Sie den Quellcode pytest lesen, können Sie diese Codes finden:
def normalize_hookimpl_opts(opts):
opts.setdefault("tryfirst", False)
opts.setdefault("trylast", False)
opts.setdefault("hookwrapper", False)
opts.setdefault("optionalhook", False)
Es bedeutet pytest die Hook-Methode mit @pytest.hookimpl(tryfirst=False, trylast=False, hookwrapper=False, optionalhook=False)
beschriften wird Standard. Pytest behandelt diese Hook-Methoden auf unterschiedliche Weise entsprechend dieser Bezeichnung (Decorator), wenn sie ausgeführt werden.
Nehmen Sie zum Beispiel den Parameter hookwrapper
. Wenn die Hook-Methode als hookwrapper=True
gekennzeichnet ist, wird pytest den Teil zuerst vor yield
ausführen und dann andere Hook-Methoden des gleichen Typs ausführen. Nachdem diese Methoden ausgeführt wurden, wird der Teil nach yield
ausgeführt. (Diese Funktion ist wie pytest Fixtures.)
Eine Verwendung von @pytest.hookimpl(hookwrapper=True)
ist, dass Sie die Gesamtkosten Zeit einiger Hook-Methoden berechnen können. (Hier wird der Beispielcode die Tests berechnen sammeln Zeit.)
@pytest.hookimpl(hookwrapper=True)
def pytest_collection(session):
collect_timeout = 5
collect_begin_time = time.time()
yield
collect_end_time = time.time()
c_time = collect_end_time - collect_begin_time
if c_time > collect_timeout:
raise Exception('Collection timeout.')
Eine weitere sehr gute Informationsquelle für Haken für pluggy ist, das Plugin-Modul, das Basis für pytest ist: http: //pluggy.readthedocs. io/de/letzte / – SuperGeo