web-dev-qa-db-ja.com

ユニットテストと統合テストをpytestで分離する方法

Wikipedia およびさまざまな articles によると、テストをユニットテスト(最初に実行)と統合テスト(2番目に実行)に分割することがベストプラクティスです。 CI環境のすべてのビルドで実行する必要がありますが、統合テストの実行には時間がかかり、毎日実行する必要があります。

これらをpytestで分割する方法はありますか?ほとんどのプロジェクトには複数のテストフォルダーがないようです。状況に応じてユニット、インテグレーション、またはその両方のみを実行する方法はありますか(CIと日次ビルド)。テストカバレッジを計算するとき、両方を実行する必要があると思います。

テストをこれらのカテゴリに分割しようとする場合、これは正しい方法ですか?これを行ったプロジェクトのどこかに良い例はありますか?

10
Harlekuin

はい、pytest.markデコレータでテストをマークできます。

例:

def unit_test_1():
    # assert here

def unit_test_2():
    # assert here

@pytest.mark.integtest
def integration_test():
    # assert here

これで、コマンドラインから、単体テストのみの場合はpytest -m "not integtest"、統合テストのみの場合はpytest -m integtest、すべての場合は通常のpytestを実行できます。

(必要に応じて、ユニットテストをpytest.mark.unitで装飾することもできますが、少し面倒/冗長であることがわかります)

詳細は documentation を参照してください。

15
gmds

ユニットテストと統合テストを特定のディレクトリに物理的に分離することもできます。これは、Aのサンプルファイル構造です。Shawの articleGetting Started with Testing in Python

enter image description here

構造的アプローチで:

  1. さまざまなテストに属性または@pytest.markを手動でマークする必要はありません
  2. 特定のテストランナーに限定されません。例、project/ディレクトリから:

標準ライブラリのunittestを使用:

> python -m unittest discover -s tests/integration

noseの場合:

> nose tests/integration

pytest の場合:

> pytest tests/integration

多くのテストランナーには、サブディレクトリ内のテストを見つけることができる自動テスト検出メカニズムがあります。

> cd <root_dir>
> pytest project/
7
pylang