Visual Studio のテスト エクスプローラーを使用して Python の単体テストを書く

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

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

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

前提条件

Visual Studio for Mac はサポートされていません。 詳細については、「Visual Studio for Mac の現状」を参照してください。Windows、Mac、および Linux での Visual Studio Code は、利用可能な拡張機能を使用して Python コードを問題なく操作できます

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

Visual Studio では、Python 用に unittest および pytest の 2 つのテスト フレームワークがサポートされています (Visual Studio 2019 バージョン 16.3 以降で利用可能)。 既定では、Python プロジェクトを作成するときにフレームワークは選択されません。

Python プロジェクトでどちらのテスト フレームワークを選択するかは、次の手順に従って決定します。

  1. ソリューション エクスプローラーでプロジェクト名を右クリックし、[プロパティ] を選択します。

  2. プロジェクトの [プロパティ] ウィンドウで [テスト] タブを選択し、テスト フレームワークの種類を選択します。

    • unittest フレームワークでは、Visual Studio によってプロジェクトのルート ディレクトリがテスト検出に使用されます。 既定値は . ですが、プロジェクト設定を構成するときに別の場所を指定できます。 テスト ファイル名のパターンに、1 つ以上の文字列 (test*.py, test_*.py など) を指定することもできます。

    • pytest フレームワークでは、テストの場所やファイル名のパターンなどのテスト オプションは、標準の pytest .ini 構成ファイルを使用して指定します。 既定では、ワークスペースまたはプロジェクト フォルダーが場所として使用されます。 既定のファイル名のパターンは、*_test.pytest_*py などです。 詳しくは、pytest リファレンスドキュメント をご覧ください。

    Note

    ファイル名のパターンを定義するときは、アンダースコア (_) のような特殊文字が、ワイルドカード (*) で一致しない点に注意してください。 ファイル名に特殊文字を使用する場合は、その文字をパターン定義で test_*.py のように指定します。

  3. フレームワークの選択と設定を保存するには、Ctrl+S キーボード ショートカットを使用します。

フレームワークを構成すると、Visual Studio がテスト検出を開始し、テスト エクスプローラーを開きます。

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

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

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

    Visual Studio 2022 の起動時に [ローカル フォルダーを開く] オプションを選択するための方法を示しているスクリーンショット。

    Visual Studio の起動時に [ローカル フォルダーを開く] オプションを選択するための方法を示しているスクリーンショット。

  2. Python フォルダーを開くと、Visual Studio により、プログラムに関連する設定を管理するために、いくつかの隠しフォルダーが作成されます。 これらのフォルダー (および、.git フォルダーなどの他の非表示ファイルや隠しフォルダー) をソリューション エクスプローラーで表示するには、[すべてのファイルを表示] オプションを選択します。

    Visual Studio 2022 のソリューション エクスプローラー内で非表示フォルダーとファイルを表示するための方法を示しているスクリーンショット。

    Visual Studio のソリューション エクスプローラー内で非表示フォルダーとファイルを表示するための方法を示しているスクリーンショット。

  3. ソリューション エクスプローラー[ローカル 設定] フォルダーを展開し、PythonSettings.json ファイルをダブルクリックしてエディターでファイルを開きます。

    Note

    ほとんどの構成には、PythonSettings.jsonProjectSettings.json の 2 つの設定ファイルが表示されます。 この演習では、PythonSettings.json ファイルを変更する必要があります。

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

    1. ローカル設定フォルダーを右クリックし、[追加]>[新しいファイル] の順に選択します。

    2. ファイルに PythonSettings.json という名前を付け、Enter キーを押して変更を保存します。

    エディターで新しいファイルが自動的に開きます。

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

    {
      "TestFramework": "unittest",
      "UnitTestRootDirectory": "testing",
      "UnitTestPattern": "test_*.py"
    }
    
    • unittest フレームワークの場合、PythonSettings.json ファイルで、UnitTestRootDirectoryUnitTestPattern の設定に特定の値を定義しないと、Visual Studio によってこれらのフィールドに既定値 (それぞれ .test*.py) が自動的に追加されます。

    • pytest フレームワークの場合、構成オプションは Visual Studio の設定ではなく、常に pytest .ini 構成ファイルで指定されます。

  5. Python プログラムに、テストを含むフォルダーとは別の src フォルダーが含まれている場合は、src フォルダーへのパスを PythonSettings.json ファイルの SearchPaths 設定で指定します。

      "SearchPaths": [".\\src"]
    
  6. PythonSettings.json ファイルへの変更を保存します。

フレームワークを構成すると、指定したフレームワークのテストの検出が Visual Studio によって開始されます。 テストにはテスト エクスプローラーでアクセスできます。

テストを追加して検出する

既定では、Visual Studio では、unittest および pytest テストが、名前が test で始まるメソッドとして識別されます。

Visual Studio がテスト検出をどのように開始するかを確認するには、次の手順に従います。

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

  2. Python プロジェクトのテスト フレームワークを選択する」の説明に従って、プロジェクトのテスト フレームワークのプロパティを設定します。

  3. ソリューション エクスプローラーで、プロジェクトを右クリックして [追加]>[新しい項目] の順に選択します。

    1. [新しい項目の追加] ダイアログで、Python 単体テスト ファイルの種類を選択します。

    2. プロジェクトのプロパティで指定したパターン定義を満たすファイル名を入力します。

    3. [追加] を選択します。

  4. Visual Studio によって、既定のコードを使用したテスト ファイルが作成されます。

    import unittest
    
    class Test_test1(unittest.TestCase):
        def test_A(self):
            self.fail("Not implemented")
    
    if __name__ == '__main__':
        unittest.main()
    

    このコードにより標準の unittest モジュールがインポートされ、unittest.TestCase メソッドからテスト クラスが得られます。 スクリプトを直接実行すると、このコードによって unittest.main() 関数も呼び出されます。

新しいテスト ファイルを追加すると、Visual Studio のテスト エクスプローラーで使用できるようになります。

テスト エクスプローラーを使用してテストを表示する

テスト フレームワークとテスト ファイルを構成すると、Visual Studio はテストを検索し、テスト エクスプローラーに表示します。

以下は、テスト エクスプローラーの使用方法の一部です。

  • [テスト]> [テスト エクスプローラー] の順に選択して、テスト エクスプローラー ウィンドウを開きます。

  • [テスト エクスプローラー] ウィンドウが開いたら、キーボード ショートカット CTRL+RCTRL+A を使用してテスト検出をトリガーします。

  • テスト エクスプローラーでテストをダブルクリックして、対応するソース ファイルをエディターで開きます。

    Visual Studio 2022 のテスト エクスプローラーでテストのデフォルト ビューを示すスクリーンショット。

    テスト エクスプローラーでテストのデフォルト ビューを示すスクリーンショット。

  • ツール バーの [グループ化] オプションを使用して、テストのビューを整理します。

    Visual Studio 2022 の [グループ化] オプションを使用して、テスト エクスプローラーでテストのビューを整理する方法を示すスクリーンショット。

    [グループ化] オプションを使用して、テスト エクスプローラーでテストのビューを整理する方法を示すスクリーンショット。

  • [検索]フィールドにテキストを入力して、テストを名前でフィルター処理します。

    [検索] フィールドを使用して、テスト エクスプローラーでテストのビューをフィルター処理する方法を示すスクリーンショット。

    [検索] フィールドを使用して、テスト エクスプローラーでテストのビューをフィルター処理する方法を示すスクリーンショット。

  • 次のセクションで説明するように、テスト を実行してテストの実行の状態を表示します。

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

テスト エクスプローラーを使用してテストを実行する

テスト エクスプローラーでは、いくつかの方法でテストを実行できます。

  • フィルター設定に基づいて現在のビューに表示されているテストをすべて実行するには、[すべて実行] (ビュー内のテスト) を選択します。
  • [実行] メニューのコマンドを使用して、失敗、合格、または未実行のテストをグループとして実行します。
  • 1 つ以上のテストを選択し、右クリックして [選択したテストの実行] オプションを選択します。

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

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

    合格したテストの状態を示す、Visual Studio 2022 のテスト エクスプローラーのスクリーンショット。

    合格したテストの状態を示すテスト エクスプローラーのスクリーンショット。

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

    失敗したテストの状態と理由の詳細を示す、Visual Studio 2022 のテスト エクスプローラーのスクリーンショット。

    失敗したテストの状態を示すテスト エクスプローラーのスクリーンショット。

    テスト失敗の理由を示すテスト エクスプローラーのスクリーンショット。

デバッガーを使用してテストを確認する

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

Visual Studio のデバッガーを使用したテストのチェックに関して、以下の点を確認します。

  • 既定では、テスト デバッグには Visual Studio 2019 バージョン 16.5 以降の debugpy デバッガーが使用されます。 それ以前の一部のバージョンの Visual Studio では ptvsd 4 デバッガーを使用しています。 以前のバージョンの Visual Studio を使用していて、ptvsd 3 デバッガーを使用する場合は、[ツール]>[オプション]>[Python]> [デバッグ] の順に選択して、[レガシ デバッガーを使用] オプションを選択します。

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

    Visual Studio 2022 のデバッガーを使用して単体テストをデバッグする方法を示すスクリーンショット。

    Visual Studio のデバッガーを使用して単体テストをデバッグする方法を示すスクリーンショット。

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