7 pyTest機能とプラグインは、時間のトンを保存します


このチュートリアルでは、我々はベストを学びますpytest 機能とプラグインを開発プロセスをスピードアップします.彼らは非常に簡単ですし、すぐに使用を開始することができます.

目次
  • How to Stop a Test Session on the First Failure
  • How to Re-Run Only the Last Failed Tests
  • How to Re-Run the Whole Test Session Starting With Last Failed Tests First
  • How to Display the Local Variables of a Failed Test
  • How to Run Only a Subset of Tests
  • How to Run Tests in Parallel
  • How to Re-Run Flaky Tests and Eliminate Intermittent Failures
  • Conclusion

  • 最初の失敗のテストセッションを止める方法
    大きなプロジェクトの完全なテストスイートを実行するのは、長い時間がかかるかもしれません.あなたがローカルまたはCIサーバー上で実行している場合は関係なく、それは常にテストが辛抱強く待って失敗して表示するイライラです.場合によっては、最初に失敗した後にセッション全体を中止することを望みます.幸運にもpytest そのための非常に便利なCLIオプションが付属しています-x / --exitfirst .
    $ pytest -x tests/
    

    最後の失敗したテストだけを再実行する方法
    ローカルに開発するときは、あなたのrepoにプッシュする前にすべてのテストを実行することを好むかもしれません.あなたがほんの少しのテストで小さなプロジェクトに取り組んでいるならば、それを再実行するのはOKです.しかし、完全なテストスイートが実行する分がかかる場合、失敗したものだけを実行します.pytest を介して--lf or --last-failed オプション.貴重な時間を節約することができますし、非常に迅速に繰り返すこの方法!
    $ pytest --lf tests/
    

    最後に失敗したテストから始まるテストセッション全体を再実行する方法
    前のコマンドと同様に、すべてを再実行するのに役立つかもしれません.唯一の違いは、最初に失敗したテストから始めたいということです.そしてそれを達成するために--ff or --failed-first フラグ.
    $ pytest --ff tests/
    

    失敗したテストのローカル変数を表示する方法
    私たちはどのようにそれを高速化を繰り返して、どのように貴重な時間を節約することが重要であることを学んだ.同じやり方で、我々は失敗したテストをデバッグするのを助ける重要なヒントを拾うことが非常に重要です.を使用して--showlocals フラグまたは単に-l , トレースバックにおけるすべてのローカル変数の値を見ることができます.
    $ pytest tests/test_variables.py -l               
    ================ test session starts ================
    ...                                                                                                                                                
    tests/test_variables.py FF                                                                                                                                                     [100%]
    
    ================ FAILURES ================
    _____________________________________________________________________________ test_local_variables[name] _____________________________________________________________________________
    
    key = 'name'
    
        @pytest.mark.parametrize("key", ["name", "age"])
        def test_local_variables(key):
            result = person_info()
    >       assert key in result
    E       AssertionError: assert 'name' in {'height': 180}
    
    key        = 'name'
    result     = {'height': 180}
    
    tests/test_variables.py:11: AssertionError
    _____________________________________________________________________________ test_local_variables[age] ______________________________________________________________________________
    
    key = 'age'
    
        @pytest.mark.parametrize("key", ["name", "age"])
        def test_local_variables(key):
            result = person_info()
    >       assert key in result
    E       AssertionError: assert 'age' in {'height': 180}
    
    key        = 'age'
    result     = {'height': 180}
    
    tests/test_variables.py:11: AssertionError
    ================ short test summary info ================
    FAILED tests/test_variables.py::test_local_variables[name] - AssertionError: assert 'name' in {'height': 180}
    FAILED tests/test_variables.py::test_local_variables[age] - AssertionError: assert 'age' in {'height': 180}
    ================ 2 failed in 0.05s ================
    

    テストの部分集合だけを走らせる方法
    場合によっては、テストのサブセットを実行する必要があります.その1つの方法は、個々のファイルのすべてのテストケースを実行しています.例えば、あなたはpytest test_functions.py . これはすべてを実行するよりも優れていますが、我々はまだそれを改善することができます.を使用して-k オプションとして、pytest 実行するテストを選択するために使用します.
    # tests/test_variables.py
    def test_asdict():
        ...
    
    def test_astuple():
        ...
    
    def test_aslist():
        ...
    
    最初の2つのテストを実行する必要があると言うと、or :
    $ pytest -k "asdict or astuple" tests/test_variables.py
    
    出力:
    $ pytest -k "asdict or astuple" tests/test_variables.py
    ==================================== test session starts ====================================
    ...                                          
    
    tests/test_variables.py ..                                                            [100%]
    
    ============================== 2 passed, 1 deselected in 0.02s ==============================
    

    並列テストの実行方法
    プロジェクトが持っているより多くのテストは、すべてのそれらのすべてを実行するためにかかる.これは議論の余地のない話ですが、一般的に見落とされています.もう一つのテストの後の1つのテストを広範囲にわたるテストを走らせることは、時間の驚くべき無駄です.実行を高速化する最良の方法は、並列化し、複数のCPUを利用することです.
    悲しいことにpytest 同様の機能を持っていないので、プラグインに戻る必要があります.ベストpytest そのためのプラグインはpytest-xdist .
    テストを複数のCPUに送るには、n or --numprocesses オプション.
    $ pytest -n NUMCPUS
    
    あなたはどのように多くのCPUを使用できない知っている場合はpytest-xdist すべての利用可能なCPU上でテストを実行するにはauto 値.
    $ pytest -n auto
    

    Flakyテストを再実行して、断続的な失敗を除く方法
    最もゆがめられた状況の1つは、すべてのテストが局所的にCIサーバで失敗するだけであるのを見ることです.いくつかの理由はこれらのような失敗を引き起こすことができます、しかし、大部分は彼らが「Flaky」テストの結果です.「Flaky」テストは断続的に失敗するものです.通常、それらを再実行すると、それらを通過するのに十分です.問題は、あなたが長いランニングテストスイートを持っているならば、あなたはCIステップを再トリガーして、数分待つ必要があります.これは素晴らしい時間のシンクであり、幸いに回避することができます.
    だから、それを改善するためには、我々は再“フレーク”テストを再実行することが理想的です.そうすることによって、我々はそれを通過する機会を増やすことができます.そして、CIステップの完全な失敗を避けます.
    ベストpytest そのためのプラグインは.このプラグインはテストを再実行します.
    それを使う最も簡単な方法は--reruns あなたが実行するテストをしたい時間の最大数を持つオプション.
    $ pytest --reruns 5
    
    場合は、時間の前に個々のテストをフレーク知っている場合は、単に再実行するようにマークすることができます.
    @pytest.mark.flaky(reruns=5)
    def test_flaky():
        assert get_resut() is True
    

    結論
    大きなテストスイートは、プロジェクトに多くの保証をもたらすことができますが、それもコストが付属しています.長い実行テストセッションは、多くの開発時間を食べて、反復を遅くすることができます.活用することによってpytest 機能、およびプラグインの生態系、劇的に開発プロセスをスピードアップすることが可能です.このチュートリアルでは、私たちは私たちの生活を改善し、無駄な時間のテストを実行するために採用できる7つのヒントを見た.

    If you liked this post, consider sharing it with your friends! Also, feel free to follow me https://miguendes.me.


    7 pytest Features and Plugins That Will Save You Tons of Time 初登場miguendes's blog .