Python コードの単体テストの設定

適用対象:yesVisual Studio noVisual Studio for Mac noVisual Studio Code

単体テストは、アプリケーションの他のコード単位 (通常は分離された関数、クラスなど) をテストするコードの断片です。 アプリケーションがそのすべての単体テストに合格すると、少なくとも低レベルの機能が正しいことを信頼できます。

Python は、プログラムの設計時にシナリオを検証するために単体テストを幅広く使用します。 Visual Studio の Python サポートには、別々にテストを実行する必要のない、開発プロセスのコンテキスト内での単体テストの検出、実行、デバッグのサポートが含まれています。

この記事では、Python での Visual Studio の単体テスト機能の概要を説明します。 一般的な単体テストについて詳しくは、「コードの単体テスト」をご覧ください。

Python プロジェクトのテスト フレームワークを選択する

Visual Studio では、Python 用に unittest および pytest の 2 つのテスト フレームワークがサポートされています (Visual Studio 2019 バージョン 16.3 以降で利用可能)。 既定では、Python プロジェクトを作成するときにフレームワークは選択されません。 フレームワークを指定するには、ソリューション エクスプローラーでプロジェクト名を右クリックし、[プロパティ] オプションを選択します。 プロジェクト デザイナーが開き、[テスト] タブでテストを構成できます。このタブでは、プロジェクトに使用するテスト フレームワークを選択できます。

  • unittest フレームワークでは、プロジェクトのルート ディレクトリがテスト検出に使用されます。 この場所と、テストを識別するためのテキスト パターンは、[テスト] タブで、ユーザーが指定した値に変更できます。
  • pytest フレームワークでは、テストの場所やファイル名のパターンなどのテスト オプションは、標準の pytest .ini 構成ファイルを使用して指定します。 詳細については、pytest のリファレンス ドキュメントをご覧ください。

フレームワークの選択と設定を保存すると、テスト エクスプローラーでテスト検出が開始されます。 [テスト エクスプローラー] ウィンドウがまだ開いていない場合は、ツール バーに移動して、[テスト]>[テスト エクスプローラー] を選択します。

プロジェクトを使用せずに Python のテストを構成する

Visual Studio では、Python コードがある フォルダーを開くと、プロジェクトを使用せずに既存の Python コードを実行してテストすることができます。 このような場合は、PythonSettings.json ファイルを使用して、テストを構成する必要があります。

  1. [ローカル フォルダーを開く] オプションを使用して、既存の Python コードを開きます。

    The Visual Studio startup screen

  2. [ソリューション エクスプローラー] ウィンドウで、[すべてのファイルを表示] アイコンをクリックして、現在のフォルダー内のすべてのファイルを表示します。

    Show all files button

  3. ローカル設定フォルダー内の PythonSettings.json ファイルに移動します。 このファイルが ローカル設定フォルダーに表示されない場合は、手動で作成します。

  4. フィールド TestFramework を設定ファイルに追加し、使用するテスト フレームワークに応じて、pytest または unittest に設定します。

    {
      "TestFramework": "unittest",
      "UnitTestRootDirectory": "testing",
      "UnitTestPattern": "test_*.py"
    }
    

    Note

    unittest フレームワークの場合、フィールド UnitTestRootDirectory および UnitTestPattern が PythonSettings.json ファイルに指定されていないと、これらのフィールドは追加され、それぞれ既定値の "." と "test*.py" が割り当てられます。

  5. テストが含まれるフォルダーとは別の src ディレクトリがフォルダーに含まれる場合は、PythonSettings.json ファイルの SearchPaths フィールドを使用して src フォルダーへのパスを指定します。

    {
      "TestFramework": "unittest",
      "UnitTestRootDirectory": "testing",
      "UnitTestPattern": "test_*.py",
      "SearchPaths": [".\\src"]
    }
    
  6. 変更内容を PythonSettings.json ファイルに保存して、指定されたフレームワークのテスト検出を開始します。

    Note

    [テスト エクスプローラー] ウィンドウが既に開いている場合は、Ctrl + R、A でも検出がトリガーされます。

テストを探索して表示する

既定では、Visual Studio では、unittest および pytest テストが、名前が test で始まるメソッドとして識別されます。 テスト検出を表示するには、次の手順を行います。

  1. Python プロジェクトを開きます。

  2. プロジェクトが Visual Studio に読み込まれたら、[ソリューション エクスプローラー] でプロジェクトを右クリックし、プロパティ [テスト] タブで unittest または pytest フレームワークを選択します。

    Note

    pytest フレームワークを使用する場合、標準の pytest .ini 構成ファイルを使用して、テストの場所とファイル名のパターンを指定できます。 既定では、ワークスペース/プロジェクト フォルダーが使用され、パターンは test_*py および *_test.py です。 詳細については、pytest のリファレンス ドキュメントをご覧ください。

  3. フレームワークを選択したら、プロジェクトをもう一度右クリックし、[追加]>[新しい項目] を選択してから、[Python 単体テスト] に続けて [追加] を選択します。

  4. このアクションにより、標準 unittest モジュールをインポートし、unittest.TestCase からテスト クラスを派生させ、スクリプトを直接実行する場合に unittest.main() を起動するコードを含む test_1.py ファイルが作成されます。

    import unittest
    
    class Test_test1(unittest.TestCase):
        def test_A(self):
            self.fail("Not implemented")
    
    if __name__ == '__main__':
        unittest.main()
    
  5. 必要に応じてファイルを保存し、[テスト]>[テスト エクスプローラー] メニュー コマンドでテスト エクスプローラーを開きます。

  6. テスト エクスプローラーは、テストするプロジェクトを検索し、それらを次のように表示します。 テストをダブルクリックすると、そのソース ファイルが開きます。

    Test Explorer showing default test_A

  7. 他のテストをプロジェクトに追加すると、ツール バーの[グループ化] メニューを使用してテスト エクスプローラーのビューを整理できます。

    Tests Explorer Group By toolbar menu

  8. 検索フィールドにテキストを入力してテストを名前でフィルター処理することもできます。

unittest モジュールとテストの書き方についての詳細については、Python 3.10 のドキュメントを参照してください。

テストの実行

テスト エクスプローラーでは、さまざまな方法でテストを実行できます。

  • [Run All (すべて実行)] は、表示されているすべてのテスト (フィルターの対象) を明確に実行します。
  • [実行] メニューには、失敗、合格、または未実行のテストをグループとして実行するコマンドが用意されています。
  • 1 つ以上のテストを選んで右クリックし、[選択したテストの実行] を選択します。

テストはバックグラウンドで実行され、完了するとテスト エクスプローラーが各テストの状態を更新します。

  • 合格したテストには、緑のチェックマークとテストの実行にかかった時間が表示されます。

    test_A passed status

  • 失敗したテストには、コンソール出力とテストの実行からの unittest 出力を示す [出力] リンクとともに赤い × 印が表示されます。

    test_A failed status

    test_A failed with reason

テストのデバッグ

単体テストはコードの断片であるため、他のコードと同様にバグが発生することがあり、デバッガーでの実行が必要になることがあります。 デバッガーでは、ブレークポイントを設定し、変数を確認し、コードをステップ実行することができます。 Visual Studio には単体テストのための診断ツールも用意されています。

Note

既定では、テスト デバッグでは、Visual Studio 2017 (バージョン 15.8 以降) 用の ptvsd 4 デバッガーと Visual Studio 2019 (バージョン 16.5 以降) 用の debugpy が使用されます。 ptvsd 3 を代わりに使用する場合は、[ツール]>[オプション]>[Python]>[デバッグ] で、[レガシ デバッガーを使用] オプションを選択できます。

デバッグを開始するには、コードに最初のブレークポイントを設定し、テスト エクスプローラーでテスト (または選択範囲) を右クリックし、[選択したテストのデバッグ] を選択します。 アプリケーション コードの場合と同様に、Visual Studio が Python デバッガーを起動します。

Debugging a test

[選択されたテストのコード カバレッジの分析] を使用することもできます。 詳細については、「コード カバレッジを使用した、テストされるコード割合の確認」を参照してください。