バックグラウンド
インターフェイスのケースを作成するときに、次のような問題が発生することがよくあります。
テスト環境が不安定で、インターフェイスがタイムアウトすることがあり(サービスとは関係がなく、純粋に環境問題です)、インターフェイスケースの実行が失敗することがあります。たとえば、同じインターフェイスケースが5回実行され、そのうち2回は失敗し、他の3回は成功しました。このような時折発生する環境問題では、手動で再実行する必要があります(必ずしも合格できるとは限りません)。ケースがテストに合格するために最善を尽くすことができることを保証するためのより良いメカニズムはありますか?
ここでは、pytestの失敗再実行プラグインを紹介します:pytest-rerunfailures
前書き
pytest-rerunfailuresは、再実行メカニズムを通じて不安定な障害を排除するpytestプラグインです。
プロジェクトアドレス:https://github.com/pytest-dev/pytest-rerunfailures
インストール
インストールと操作の要件:
- Python 3.6〜3.9、またはPyPy3
- pytest 5.0+
プラグインをインストールする
sudo pip(pip3)install pytest-rerunfailures
pytest-rerunfailuresを使用する
使用する方法は2つあります。
- コマンドラインパラメータ
- デコレータウェイ
コマンドラインパラメータモード
ケース例:test_demo.py
#!/ usr / bin / env python3#!coding:utf-8import pytestimport randomdef test_simple_assume():# 実行される各ケースの値は1または2で、ランダム性は r = random.randint(1,2)assert r = = 1
pytest test_demo.pyを直接実行すると、各実行の結果には一定のランダム性があります(成功する場合と失敗する場合があります)。
pytest-rerunfailuresを使用して複数の実行を指定する場合、十分な実行がある限り、結果に遭遇する可能性が高くなります。
例1
失敗した再実行の最大数を10として指定します。pytest--reruns10
次の図では、合計2回実行され、最初の実行は失敗に終わったため、2番目に再実行すると、最終結果はRマークになります。(一度実行すると、結果は ' 。'になります)
例2
失敗の最大数を指定する10及び再実行するように再放送を1秒などの間隔:pytest --reruns 10 --reruns遅延1
次の図に示すように、合計2回の再実行、2回の再実行の実行時間は2.1秒、上の図は0.07秒しかかかりません。ここでの追加の2秒は、-reruns-delayで指定された再実行間隔のためです。 1秒です。
例3:式で失敗の再実行を指定する
test_demo.pyの説明:
test_assert_errorはランダムにAssertionErrorをスローします
test_value_errorはランダムにValueErrorをスローします
#!/ usr / bin / env python3#!coding:utf-8import pytestimport randomdef test_assert_error(): r = random.randint(1,2)with pytest.raises(AssertionError):#ここでpytestを使用しない場合。明示的にAssertionError例外をスローすると、pytest-rerunfailuresはassert r == 1をキャッチできません。これは、プラグインのバグであるはずです。 アサートr == 1def test_value_error(): r = random.randint(1,2)if r == 1: s = int( 'www')
执行:pytest --reruns 10 --only-rerun AssertionError --only-rerun ValueError test_demo.py -v
複数の再実行のみの関係はまたは
FIGが検出されたため、AssertionErrorおよびValueErrorケースが再実行されました
デコレータモード
test_demo.py
test_assert_errorはAssertionErrorをランダムにスローし、失敗した場合は最大5回再実行します
test_value_errorはランダムにValueErrorをスローし、失敗すると最大5回再実行され、失敗した再実行の間隔は2秒です。
test_value_error_condition、失敗時に最大5回再実行し、システムがwin32の場合にのみ再実行します。
#!/ usr / bin / env python3#!coding:utf-8import pytestimport randomimport sys#これは最大5回再実行に失敗します@ pytest.mark.flaky(reruns = 5)def test_assert_error(): r = random.randint( 1,2)#raise AssertionError( "ERR") with pytest.raises(AssertionError):assert r == 1#これは最大5回の再実行に失敗します@ pytest.mark.flaky(reruns = 5、reruns_delay = 2)def test_value_error():r = random.randint(1,2) if r == 1: s = int( 'nick')# 公式ウェブサイトのこの例には問題があります。Mac またはLinuxマシンを実行している場合は、再試行があります(win32プラットフォームが再実行メカニズムをトリガーするという条件で指定されます)@ pytest.mark.flaky(reruns = 5、condition = not sys.platform.startswith( "win32"))def test_value_error_condition():r = random.randint(1,2) if r == 1: s = int( 'nick')
执行:pytest -v
ここでは、最初の2つのテストケースが失敗して再実行されましたが、3番目のテストケースも再実行されました(作成者の当初の意図は、条件がFalseの場合に条件が再実行されないことです)。ここにバグがあります。、つまり、条件が無効です。
プロジェクトのソースコードを確認したところ、ここに問題があることがわかりました。再実行されない関数が使用されているか、最後のnot条件が再実行されない条件の1つにすぎません。前のnotrerunが満たされた場合、条件パラメーターは無視できます。ドロップ。
互換性
- クラス、モジュール、およびパッケージレベルのフィクスチャデコレータでは使用できません:@ pytest.fixture()
- プラグインはpytest-xdistの--looponfailフラグと互換性がありません
- pdbを使用してデバッグする場合、プラグインには非互換性があります
結論として、このプラグインはまだ使用されていますが、まだ多くの落とし穴があります。主に、失敗した再試行回数と再試行間隔の関数を使用することをお勧めします。
ブロガー:お金を稼ぐためのテスト
モットー:テストと自動化に焦点を当て、R&D効率の向上に努めます。テストと勤勉さを通じて、元の蓄積を完了し、読書と財務管理から財務の自由までを行います。
csdn:https://blog.csdn.net/ccgshigao
ブログパーク:https://www.cnblogs.com/qa-freeroad/
51cto:https://blog.51cto.com/14900374