7つの時間節約で効率的なpytest機能とプラグイン

このチュートリアルでは pytest 、開発プロセスをスピードアップし、時間を節約し、効率を向上させることができるいくつかの非常に実用的な機能とプラグインを学びます。それらは非常にシンプルで、すぐに始めることができます。

コンテンツ

  1. テストケースの実行に初めて失敗したときにテストプロセスを停止する方法

  2. 前回の実行に失敗したテストケースのみを実行するようにテストフローを再実行する方法

  3. 以前に失敗したテストケースの実行からテストフロー全体を再実行する方法

  4. 失敗したテストケースのローカル変数情報を表示する方法

  5. テストフロー全体を実行するときに、テストフローの一部のみを実行する方法

  6. テストプロセスを並行して実行する方法

  7. 「不安定な結果」でテストケースを再実行する方法、およびこの「断続的な失敗」を排除する方法

  8. まとめ

1.テストケースが初めて実行に失敗したときにテストプロセスを停止する方法

大規模なプロジェクトのテストスイートを完全に実行するには、長い時間がかかる場合があります。また、ローカルで実行されている場合でもCIサーバーで実行されている場合でも、実行が失敗するのを辛抱強く待つのは常に苛立たしいことです。場合によっては、問題のあるテストケースをすぐに修正するために、最初に実行エラーが発生したときにテストプロセスを中止することができます。幸い、これにはpytest 非常に便利なコマンドラインオプションがあります:-x または --exitfirst

$ pytest -x tests/

2.テストプロセスを再実行するときに、最後の実行で失敗したテストケースのみを実行する方法

ローカルで開発する場合は、コードをリポジトリにプッシュする前に、すべてのテストケースを実行することをお勧めします。作業中のプロジェクトがテストケースの数が少ない小さなプロジェクトの場合、これはまったく問題ありませんが、プロジェクトのテストケースを一度に実行するのに数分かかる場合は、各実行のみを実行することをお勧めします。これらのテストケースそれは最後の実行に失敗しました。 または  コマンドラインオプションpytest を介してそのような操作を実行できます。このようにして、貴重な時間を節約し、プロジェクトをより速く反復することができます!--lf--last-failed

$ pytest --lf tests/

3.最後に失敗したテストケースからテストフロー全体を再実行する方法

前のコマンドと同様に、すべてのテストケースを再実行すると、テストに役立つ場合があります。 ここでの違いは、失敗したテストケースの最後の実行からテストフロー全体を再実行する場合は、コマンドラインの--ff または オプションを使用して再実行できることです 。--failed-first

$ pytest --ff tests/

4.失敗したテストケースのローカル変数情報を表示する方法

これまでのところ、高速イテレーションの重要性と、それが貴重な時間をどのように節約できるかを見てきました。同様に、失敗したテストケースをデバッグするのに役立つ重要なヒントを取得することが重要です。 コマンドラインで --showlocals or オプションを使用すると、  でローカル変数に関する情報を確認できます。-ltraceback

$ 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 ================

5.テストプロセス全体を実行するときに、テストフローの一部のみを実行する方法

完全なテストフローの一部のみを実行する必要がある場合があります。これを行う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 ==============================

6.テストプロセスを並行して実行する方法

プロジェクトのテストケースが多いほど、テストの実行に時間がかかります。当たり前のように聞こえますが、無視されることがよくあります。テストケースを次々に実行することは時間の無駄です。物事をスピードアップする最良の方法は、テストケースを並行して実行し、複数のCPUを利用することです。

しかし残念ながら、pytest 当面は同様の機能がないため、プラグインに頼らざるを得ません。この機能ポイントの場合、最適な pytest プラグインはpytest-xdistです。

テストケースを複数のCPUに送信して実行するには、  -n or--numprocesses オプションを直接使用できます。

$ pytest -n NUMCPUS

使用可能なCPUの数がわからない場合は、 auto パラメーターを 使用して、pytets-xdist 使用可能なすべてのCPUで直接実行するようにテストを指示できます。

$ pytest -n auto

7.「不安定な結果」でテストケースを再実行する方法、およびこの「断続的な失敗」を排除する方法

最も苛立たしい状況の1つは、すべてのテストケースがローカルで正常に実行されたが、CIサーバーで失敗した場合です。このような失敗には多くの理由が考えられますが、ほとんどの場合、それは「不安定性」が原因です。「不安定な」テストとは、実行中にテストが不確定な方法で「間接的に」失敗するテストです。通常、それらを1回再実行するだけです。ただし、問題は、テストプロセスに時間がかかる場合は、CIステップを再トリガーして、数分間待つ必要があることです。これには非常に時間がかかりますが、幸いなことに回避できます。

これを改善するために、理想的には、これらの「不安定な」テストを再実行できます。このようにして、実行される可能性を高め、CIのステップの完全なビルド失敗を回避できます。

上記の目標を達成するために使用するのに最適なプラグイン pytest は、pytest-rerunfailuresです。必要に応じてテストを再実行できるため、「断続的な障害」を排除できます。

プラグインを使用する最も簡単な方法は --reruns 、オプションを使用してテストプロセスを再実行する最大回数を設定することです。

$ pytest --reruns 5

どの個々のテストケースが問題になるかを事前に知っている場合は、次の方法で「再実行する必要がある」とマークすることもできます。

@pytest.mark.flaky(reruns=5)
def test_flaky():
    assert get_resut() is True

まとめ

大規模なテストスイートは、プロジェクトの品質を保証できますが、同時にコストが増加します。テストプロセスを長時間実行すると、開発に多くの時間がかかり、反復速度が遅くなります。機能とプラグインエコシステムを賢く使用することで pytest 、開発プロセスを大幅にスピードアップできます。このチュートリアルでは、テストプロセスの実行時に浪費される時間を削減しながら、開発エクスペリエンスを向上させるために使用できる7つのヒントを確認しました。


最後に、私の記事を注意深く読んでくださった皆様に感謝申し上げます。ファンの注目を集める中、常に礼儀正しい交流が必要です。あまり価値のあるものではありませんが、ご利用いただければ幸いです。あなたはそれを直接取ることができます。

これらの資料は、[ソフトウェアテスト]を行う友人にとって最も包括的で完全な準備倉庫である必要があります。この倉庫は、最も困難な旅にも同行しました。これもお役に立てば幸いです。特にテクノロジー業界では、すべてをできるだけ早く行う必要があり、技術基盤を改善する必要があります。お役に立てば幸いです……。

おすすめ

転載: blog.csdn.net/jiangjunsss/article/details/124260764