2016-04-15 11 views
0

In Tests muss ich warten (using time.sleep(30)), um erwartete Ergebnisse zu behaupten, aber das Hinzufügen von Schlaf in vielen Tests dauert zu viel Zeit beim Ausführen von Tests. So kam mir die Idee in den Sinn: polling, d. H. Die Ergebnisse für eine bestimmte Zeitüberschreitung prüfen und dann erhöhen oder wir erhalten das erwartete Ergebnis, und der Test wird bestanden. Denn jetzt bin ich mit polling Paket und ich habe eine Funktion mit meiner Behauptung Code erstellen und dann diesen Rückruf an polling passieren und geben Timeout und Wiederholungen usw.Python: Wiederholen Sie einige Codezeilen ohne Verwendung der Funktion

def assert_results(): 
    response = request.get(some_url) 
    assert response.status_code == 200 
    assert len(response.json()['results']) == 10 

polling.poll(assert_results, timeout=30, step=3) 

Auf diese Weise ich viele solcher Funktionen zu erstellen haben für verschiedene Tests, aber ich mag diese Zeilen wiederholen, ohne eine Funktion wie

with some_python_cool_feature(timeout=60, retry_interval=3): 
    response = request.get(some_url) 
    assert response.status_code == 200 
    assert len(response.json()['results']) == 10 

ich dachte, vielleicht können wir solche Dinge mit Kontext-Manager tun, aber ich war nicht in der Lage, das zu tun. Jede Hilfe wird am meisten geschätzt, aber ich möchte keine Lösung, die eine Funktion verwendet, und dann das mit etwas versuchen, fangen fangen.

Antwort

1

Sie können das Wiederholungspaket verwenden: https://pypi.python.org/pypi/retrying. Schmücken Sie einfach Ihren Test mit @retry und wenn es einen Fehler auslöst, wird es erneut versuchen.

@retry(stop_max_attempt_number=7) 
def test_something(): 
    response = request.get(some_url) 
    assert response.status_code == 200 
    assert len(response.json()['results']) == 10 

der @retry Dekorateur erhält viele zusätzliche Argumente für Ihre Wiederholungs Funktionalität zu definieren, so dass Sie eingestellt werden sollte.

Beachten Sie, dass dies in Ihrem Fall speziell bei einer AssertionError-Ausnahme fehlschlägt.

+0

Ich möchte innerhalb des Tests warten und einige Codezeilen wiederholen und den gesamten Test nicht erneut versuchen. –

+0

Warum definieren Sie nicht eine verschachtelte Funktion, die einen Wiederholungsdekorator hat und nur den relevanten Code ausführt, bis Sie die Antwort erhalten, nach der Sie suchen? – nir0s

+0

Wenn ich 100 Tests habe und es gibt 30 eindeutige Typen (Codezeilen), dann muss ich überall verschachtelte Funktionen erstellen. Ich habe alle diese Lösungen durchgemacht. Danke BTW. –

Verwandte Themen