Wikipedia およびさまざまな articles によると、テストをユニットテスト(最初に実行)と統合テスト(2番目に実行)に分割することがベストプラクティスです。 CI環境のすべてのビルドで実行する必要がありますが、統合テストの実行には時間がかかり、毎日実行する必要があります。
これらをpytestで分割する方法はありますか?ほとんどのプロジェクトには複数のテストフォルダーがないようです。状況に応じてユニット、インテグレーション、またはその両方のみを実行する方法はありますか(CIと日次ビルド)。テストカバレッジを計算するとき、両方を実行する必要があると思います。
テストをこれらのカテゴリに分割しようとする場合、これは正しい方法ですか?これを行ったプロジェクトのどこかに良い例はありますか?
はい、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 を参照してください。
ユニットテストと統合テストを特定のディレクトリに物理的に分離することもできます。これは、Aのサンプルファイル構造です。Shawの articleGetting Started with Testing in Python:
構造的アプローチで:
@pytest.mark
を手動でマークする必要はありませんproject/
ディレクトリから:標準ライブラリのunittest
を使用:
> python -m unittest discover -s tests/integration
nose
の場合:
> nose tests/integration
pytest
の場合:
> pytest tests/integration
多くのテストランナーには、サブディレクトリ内のテストを見つけることができる自動テスト検出メカニズムがあります。
> cd <root_dir>
> pytest project/