Django `test.runner.DiscoverRunner` の代替方法とは?


django.test.runner.DiscoverRunner は、Django テストフレームワークのデフォルトのテストランナーです。これは、テストモジュールを自動的に検出して実行し、テスト結果を報告する責任を負います。

主な機能

  • テスト実行: 検出されたテストクラスの各テストメソッドを個別に実行します。
  • テストモジュールの自動検出: DiscoverRunner は、プロジェクトディレクトリ構造を再帰的にスキャンし、test*.py という名前のファイルに含まれるテストクラスを検出します。

カスタマイズ

DiscoverRunner は、テスト実行のさまざまな側面をカスタマイズするためにいくつかのオプションを提供しています。

  • failfast オプション: 最初の失敗したテストでテスト実行を停止できます。
  • verbosity オプション: テスト実行の詳細レベルを制御できます。
  • TEST_DISCOVER_PATTERN 設定: テストモジュールの検索に使用されるファイル名パターンを変更できます。

from django.test.runner import DiscoverRunner

runner = DiscoverRunner()
test_results = runner.run_tests(['myapp.tests'])

print(test_results)

この例では、myapp アプリケーションのすべてのテストを実行し、結果を test_results 変数に格納します。

django.test.runner.DiscoverRunner について詳しくは、 を参照してください。

  • DiscoverRunner は、テスト駆動開発 (TDD) のワークフローに適しています。


基本的なテスト実行

from django.test.runner import DiscoverRunner

runner = DiscoverRunner()
test_results = runner.run_tests(['myapp.tests'])

print(test_results)

テストパターンを指定する

from django.test.runner import DiscoverRunner

runner = DiscoverRunner(pattern='myapp/tests/functional/*.py')
test_results = runner.run_tests()

print(test_results)

このコードは、myapp/tests/functional ディレクトリ内のすべてのテストモジュールを実行します。

冗長出力レベルを設定する

from django.test.runner import DiscoverRunner

runner = DiscoverRunner(verbosity=2)
test_results = runner.run_tests()

print(test_results)

このコードは、テスト実行の詳細な出力を表示します。

from django.test.runner import DiscoverRunner

runner = DiscoverRunner(failfast=True)
test_results = runner.run_tests()

print(test_results)

このコードは、最初の失敗したテストでテスト実行を停止します。

  • これらの例は、DiscoverRunner の基本的な使用方法を示しています。


そこで、DiscoverRunner の代替となるいくつかのオプションを紹介します。

カスタムテストランナー

独自のテストランナーを作成することで、テスト実行のあらゆる側面を完全に制御できます。 これは、複雑なテストスイートや独自のレポート要件を持つ場合に役立ちます。

カスタムテストランナーを作成するには、以下の手順に従います。

  1. django.test.runner.BaseRunner を継承するクラスを作成します。
  2. run_tests メソッドをオーバーライドして、テスト実行のロジックを実装します。
  3. TEST_RUNNER 設定でカスタムランナーのクラス名を指定します。

from django.test.runner import BaseRunner

class MyTestRunner(BaseRunner):
    def run_tests(self, test_labels):
        # テスト実行ロジックを実装
        pass

TEST_RUNNER = 'myapp.tests.MyTestRunner'

サードパーティ製テストランナー

Django コミュニティには、DiscoverRunner に代わる機能を提供するサードパーティ製テストランナーが多数あります。 これらのランナーは、さまざまな機能と利点を提供しており、特定のニーズに合ったものを見つけることができます。

代表的なサードパーティ製テストランナー

  • nose2: unittest フレームワークと互換性のあるテストランナーです。 さまざまなテスト形式とプラグインをサポートしています。
  • tox: テスト実行を自動化するためのツールです。 さまざまな環境でテストを実行するために使用できます。
  • pytest-django: Pytest フレームワークと Django テストフレームワークを統合するランナーです。

テスト管理ツール

TestRail や Zephyr などのテスト管理ツールは、テストケースの管理、実行、レポート機能を提供します。

これらのツールは、大規模なテストスイートを管理し、テスト結果を追跡する場合に役立ちます。

テスト管理ツールの例

  • Xray: Xray for Jira と統合されたテスト管理ツールです。
  • Zephyr: Jira と統合されたテスト管理ツールです。
  • TestRail: クラウドベースのテスト管理ツールです。

最適な代替方法の選択

最適な代替方法は、プロジェクトの要件とニーズによって異なります。

  • 大規模なテストスイートを管理し、テスト結果を追跡する必要がある場合は、テスト管理ツールが役立ちます。
  • より高度な機能やカスタマイズオプションが必要な場合は、カスタムテストランナーまたはサードパーティ製テストランナーを検討してください。
  • シンプルで使いやすいツールが必要な場合は、DiscoverRunner で十分かもしれません。