2016-04-15 14 views
0

テストでは、期待される結果をアサートするために(using time.sleep(30))待つ必要がありますが、テストを実行するには多くのテストでスリープを追加するには時間がかかります。だから考えてみると、pollingです。つまり、特定のタイムアウトの結果を確認してから、引き上げるか、期待した結果が得られ、テストに合格します。今の私は、私はこのような機能の多くを作成する必要があり、この方法をなどPython:関数を使用せずにコードの一部を再試行する

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) 

タイムアウトと再試行を自分のアサーションコードで関数を作成し、その後pollingにこのコールバックを渡して指定する必要がpollingパッケージを使用しています異なるテストが、私は、私は思っ

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 

のように機能せずにこれらの行を再試行したいが、多分私達は、コンテキスト管理者と、そのようなことを行うことができますが、私はそれを行うことができませんでした。どんな助けでも大歓迎ですが、私はいくつかの関数を使った解決法を望んでおらず、いくつかのtry catchでそれを呼び出す必要はありません。

答えて

1

再試行パッケージhttps://pypi.python.org/pypi/retryingを使用することができます。 あなたのテストを@retryで飾り、エラーが発生した場合は再試行します。

@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 

@retryデコレータはあなたが設定する必要がありますので、あなたのリトライ機能を定義するための多くの追加の引数を受け取ります。

あなたのケースでは、これは特にAssertionError例外で失敗することに注意してください。

+0

私はテストの中で待っていて、いくつかのコード行をやり直して、もう一度全体的なテストをやり直したくないです。 –

+0

ネストされた関数を定義しておかないと、リトライデコレータがあり、探しているレスポンスを得るまで関連するコードだけを実行します。 – nir0s

+0

もし私が100のテストをして30のユニークな型(コード行)があるなら、どこでもネストされた関数を作成しなければなりません。私はそのようなすべての解決策を完了しました。ありがとうBTW。 –

関連する問題