2016-03-28 6 views
2

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

0

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.') 
+0

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