Visual Studio Code での Python のテスト
Python 拡張機能は、VS Code に組み込まれているテスト機能に基づいて、Python に組み込まれているunittestフレームワークとpytestのテスト検出、テストカバレッジ、テストの実行とデバッグを提供します。
テストの構成
Python 拡張機能がインストールされ、エディターで Python ファイルが開かれている場合、VS Code のアクティビティバーに、テストエクスプローラービューを表すテストビーカーアイコンが表示されます。テストエクスプローラーを開くと、テストフレームワークが有効になっていない場合にPython テストの構成ボタンが表示されます。Python テストの構成を選択すると、テストフレームワークとテストを含むフォルダーを選択するように求められます。unittest を使用する場合は、テストファイルを識別するために使用するファイルグロブパターンも選択します。
ファイルグロブパターンは、ワイルドカードに基づいてファイルまたはフォルダー名と一致させ、ファイルを含めるか含めないかを定義する文字列パターンです。

テストは、コマンドパレットからPython: テストの構成コマンドを使用するか、VS Code の設定ドキュメントで説明されているように、設定エディターまたはsettings.jsonファイルでpython.testing.unittestEnabledまたはpython.testing.pytestEnabledを設定することで、いつでも構成できます。各フレームワークには、フォルダーとパターンに関するテスト構成設定で説明されている特定の構成設定もあります。
pytest を有効にして、アクティブな環境に現在インストールされていない場合、Python 拡張機能はバックグラウンドでインストールを試みます。さらに、両方のフレームワークが有効になっている場合、Python 拡張機能はpytestのみを実行します。
Python 拡張機能でサポートされている pytest の最小バージョンは 7.0.0 です。
テスト検出
既定では、フレームワークを有効にすると、Python 拡張機能はテストの検出を試みます。コマンドパレットからTest: Refresh Testsコマンドを使用して、いつでもテスト検出をトリガーできます。
python.testing.autoTestDiscoverOnSaveEnabledは既定でtrueに設定されており、これはワークスペース内の任意の Python ファイルを追加、削除、または更新するたびにテスト検出が自動的に行われることを意味します。この機能を無効にするには、VS Code の設定ドキュメントで説明されているように、設定エディターまたはsettings.jsonファイルで値をfalseに設定します。この設定を有効にするには、ウィンドウをリロードする必要があります。自動テスト検出に含まれるファイルをより細かく制御するには、python.testing.autoTestDiscoverOnSavePattern設定を調整します。これは既定で**/*.pyです。
テスト検出は、現在のフレームワークの検出パターン (これはテスト構成設定を使用してカスタマイズできます) を適用します。既定の動作は次のとおりです
-
python.testing.unittestArgs: 最上位のプロジェクトフォルダー内で名前に「test」が含まれるすべての Python (.py) ファイルを探します。すべてのテストファイルはインポート可能なモジュールまたはパッケージである必要があります。ファイル一致パターンは-p構成設定でカスタマイズでき、フォルダーは-t設定でカスタマイズできます。 -
python.testing.pytestArgs: 現在のフォルダーとそのすべてのサブフォルダー内のどこでも、名前が「test_」で始まるか「_test」で終わるすべての Python (.py) ファイルを探します。
サブフォルダーに配置されたテストは、インポートできないため検出されないことがあります。インポート可能にするには、そのフォルダーに__init__.pyという名前の空のファイルを作成します。
テスト検出が成功すると、テストエクスプローラーにテストが表示されます

テストエクスプローラーから直接テスト検出をトリガーする場合、進行中のテスト検出呼び出しをキャンセルすることもできます。検出中にRefreshボタンに置き換わるCancelボタンを使用します。

検出に失敗した場合 (たとえば、テストフレームワークがインストールされていない、またはテストファイルに構文エラーがある場合)、テストエクスプローラーにエラーメッセージが表示され、ログへのリンクが含まれます。Python出力パネルでエラーメッセージ全体を確認できます (View > Outputメニューコマンドを使用してOutputパネルを表示し、右側のドロップダウンからPythonを選択します)。

テストの実行
次のいずれかの操作を使用してテストを実行できます
-
テストファイルを開いている状態で、前のセクションで示したように、テスト定義行の横のガターに表示される緑色の実行アイコンを選択します。このコマンドは、そのメソッドのみを実行します。

-
コマンドパレットから、次のいずれかのコマンドを実行します
- Test: Run All Tests - 検出されたすべてのテストを実行します。
- Test: Run Tests in Current File - エディターで開かれているファイル内のすべてのテストを実行します。
- Test: Run Test at Cursor - エディターでカーソルの下にあるテストメソッドのみを実行します。
-
テストエクスプローラーから
-
検出されたすべてのテストを実行するには、テストエクスプローラーの上部にある再生ボタンを選択します

-
特定のテストグループまたは単一のテストを実行するには、ファイル、クラス、またはテストを選択し、その項目の右にある再生ボタンを選択します

-
テストエクスプローラーを通じてテストを選択して実行することもできます。そのためには、実行したいテストをCtrl+クリック (macOS ではCmd+クリック) し、それらのいずれかを右クリックしてRun Testを選択します。
-
テスト実行後、VS Code は結果をガターデコレーションとしてエディターに直接表示します。失敗したテストもエディターで強調表示され、テスト実行エラーメッセージとすべてのテスト実行履歴を表示するピークビューが表示されます。Escapeを押すとビューを閉じることができ、ユーザー設定を開いて (Command PaletteのPreferences: Open Settings (UI)コマンド) Testing: Automatically Open Peek View設定の値をneverに変更することで無効にできます。
テストエクスプローラーでは、個々のテストと、それらのテストを含むすべてのクラスとファイルの結果が表示されます。フォルダー内のテストのいずれかが合格しなかった場合、フォルダーには失敗アイコンが表示されます。

VS Code はTest Resultsパネルにもテスト結果を表示します。

カバレッジ付きでテストを実行
カバレッジを有効にしてテストを実行するには、テストエクスプローラーでカバレッジ実行アイコンを選択するか、通常テスト実行をトリガーする任意のメニューからRun with coverageオプションを選択します。pytest を使用している場合は Python 拡張機能がpytest-covプラグインを使用してカバレッジを実行し、unittest の場合はcoverage.pyを使用します。
カバレッジ付きでテストを実行する前に、プロジェクトに正しいテストカバレッジパッケージがインストールされていることを確認してください。ブランチカバレッジは、カバレッジバージョン >= 7.7 でのみサポートされています。
カバレッジ実行が完了すると、行レベルのカバレッジについてエディターで線が強調表示されます。テストカバレッジ結果は、テストエクスプローラーの「Test Coverage」サブタブとして表示されます。これは、コマンドパレットのTesting: Focus on Test Coverage View (⇧⌘P (Windows、Linux Ctrl+Shift+P)) でも移動できます。このパネルでは、ワークスペース内の各ファイルとフォルダーの行カバレッジメトリクスと、関連する場合はブランチカバレッジを表示できます。

pytest を使用する際のカバレッジ実行をより細かく制御するには、python.testing.pytestArgs設定を編集して仕様を含めることができます。pytest.testing.pytestArgsに pytest 引数--covが存在する場合、Python 拡張機能はカバレッジ引数に追加の編集を行わず、カスタマイズが有効になるようにします。--cov引数が見つからない場合、拡張機能はワークスペースのルートでカバレッジを有効にするために、実行前に--cov=.を pytest 引数に追加します。
テストカバレッジの詳細については、VS Code のテストカバレッジドキュメントをご覧ください。
テストのデバッグ
テストをデバッグするには、関数定義の横のガターデコレーションを右クリックしてDebug Testを選択するか、テストエクスプローラーでそのテストの横にあるDebug Testアイコンを選択します。

テストを実行またはデバッグしても、テストファイルは自動的に保存されません。テストを実行する前に必ず変更を保存してください。そうしないと、結果がファイルの以前のバージョンを反映しているため、混乱する可能性があります!
コマンドパレットから次のコマンドを使用してテストをデバッグできます
- Test: Debug All Tests - ワークスペース内のすべてのテストのデバッガーを起動します。
- Test: Debug Tests in Current File - エディターで開かれているファイルで定義したテストのデバッガーを起動します。
- Test: Debug Test at Cursor - エディターでカーソルがフォーカスされているメソッドのみのデバッガーを起動します。テストエクスプローラーのDebug Testアイコンを使用して、選択したスコープ内のすべてのテストと検出されたすべてのテストのデバッガーを起動することもできます。
ガターデコレーションをクリックしたときの既定の動作を、実行の代わりにテストをデバッグするように変更することもできます。そのためには、settings.jsonファイルでtesting.defaultGutterClickAction設定の値をdebugに変更します。
デバッガーは、ブレークポイント、変数検査などを含め、他の Python コードと同様にテストでも機能します。テストのデバッグ設定をカスタマイズするには、ワークスペースの.vscodeフォルダーにあるlaunch.jsonまたはsettings.jsonファイルで、構成に"purpose": ["debug-test"]を追加することでテストデバッグ構成を指定できます。この構成は、Test: Debug All Tests、Test: Debug Tests in Current File、およびTest: Debug Test at Cursorコマンドを実行するときに使用されます。
たとえば、launch.jsonファイルの以下の構成は、テストのデバッグ時にjustMyCode設定を無効にします
{
"name": "Python: Debug Tests",
"type": "debugpy",
"request": "launch",
"program": "${file}",
"purpose": ["debug-test"],
"console": "integratedTerminal",
"justMyCode": false
}
"purpose": ["debug-test"]を持つ構成エントリが複数ある場合、この要求タイプに対して複数の定義を現在サポートしていないため、最初の定義が使用されます。
デバッグの詳細、またはVS Codeでの動作を理解するには、Python デバッグ構成と一般的なVS Codeのデバッグ記事を参照してください。
並行してテストを実行
pytest を使用した並行テスト実行のサポートは、pytest-xdistパッケージを通じて利用できます。pytest-xdistの使用方法の詳細については、ドキュメントを参照してください。
xdistが有効で引数でワーカー数が指定されていない場合、ワーカー数はテストエクスプローラーで選択されたテスト数に基づいて Python 拡張機能によって自動的に最適化されます。
Django 単体テスト
Python 拡張機能は、Django 単体テストの検出と実行もサポートしています。いくつかの追加のセットアップ手順だけで Django テストを検出できます
settings.jsonファイルで"python.testing.unittestEnabled": true,を設定します。MANAGE_PY_PATHを環境変数として追加します- プロジェクトのルートに
.envファイルを作成します。 .envファイルにMANAGE_PY_PATH='を追加し、' をアプリケーションのmanage.pyファイルのパスに置き換えます。ヒント: エクスプローラービューでファイルを右クリックし、Copy Pathを選択すると、パスをコピーできます。
- プロジェクトのルートに
- 必要に応じて、
settings.jsonファイルの"python.testing.unittestArgs": []に Django テスト引数を追加し、Django と互換性のない引数を削除します。
既定では、Python 拡張機能はプロジェクトルートで.envファイルを検索してロードします。.envファイルがプロジェクトルートにない場合、またはVS Code 変数置換を使用している場合は、settings.jsonファイルに"python.envFile": "${workspaceFolder}/を追加します。これにより、Python 拡張機能はテストの実行および検出時にこのファイルから環境変数をロードできます。Python 環境変数の詳細については、こちらをご覧ください。
テストビューに移動し、Refresh Testsボタンを選択して Django テストを表示します。
トラブルシューティング
Django 単体テストがテストビューに表示されない場合は、次のトラブルシューティング手順を試してください
- Python出力パネルでエラーメッセージを検索します。テストが検出されない理由のヒントが得られるかもしれません。
- ターミナルでDjango テストを実行してみてください。次に、同じコマンドを VS Code の設定に「変換」します。たとえば、ターミナルで
python manage.py test --argを実行する場合、.envファイルにMANAGE_PY_PATH='./manage.py'を追加し、VS Code の設定で"python.testing.unittestArgs": [--arg]を設定します。または、Python出力パネルで Python 拡張機能によって実行されるコマンドを見つけることもできます。 - 最初に相対パスを使用した場合は、
MANAGE_PY_PATH環境変数を設定するときにmanage.pyファイルへの絶対パスを使用してください。
テストコマンド
以下は、VS Code の Python 拡張機能を使用したテストでサポートされているすべてのコマンドです。これらはすべてコマンドパレットから見つけることができます
| コマンド名 | 説明 |
|---|---|
| Python: テストを構成 | Python 拡張機能で使用するテストフレームワークを構成します。 |
| Test: すべての結果をクリア | UI がセッション間でテスト結果を保持するため、すべてのテストステータスをクリアします。 |
| Test: すべてのテストをデバッグ | 検出されたすべてのテストをデバッグします。2021.9 より前のバージョンではPython: Debug All Testsと同等です。 |
| Test: 失敗したテストをデバッグ | 最新のテスト実行で失敗したテストをデバッグします。 |
| Test: 最後の実行をデバッグ | 最新のテスト実行で実行されたテストをデバッグします。 |
| Test: カーソル位置のテストをデバッグ | エディターでカーソルがフォーカスされているテストメソッドをデバッグします。2021.9 より前のバージョンではPython: Debug Test Method...に似ています。 |
| Test: 現在のファイル内のテストをデバッグ | 現在エディターでフォーカスされているファイル内のテストをデバッグします。 |
| Test: 次のテスト失敗に移動 | エラーピークビューが開いている場合、エクスプローラーで失敗した次のテストのピークビューを開いて移動します。 |
| Test: 前のテスト失敗に移動 | エラーピークビューが開いている場合、エクスプローラーで失敗した前のテストのピークビューを開いて移動します。 |
| Test: 出力をピーク | 失敗したテストメソッドのエラーピークビューを開きます。 |
| Test: テストを更新 | テスト検出を実行し、テストエクスプローラーを更新してテストの変更、追加、または削除を反映します。2021.9 より前のバージョンではPython: Discover Testsに似ています。 |
| Test: 失敗したテストを再実行 | 最新のテスト実行で失敗したテストを実行します。2021.9 より前のバージョンではPython: Run Failed Testsに似ています。 |
| Test: 最後の実行を再実行 | 最新のテスト実行で実行されたテストをデバッグします。 |
| Test: すべてのテストを実行 | 検出されたすべてのテストを実行します。2021.9 より前のバージョンではPython: Run All Testsと同等です。 |
| Test: カバレッジ付きで全テストを実行 | 検出されたすべてのテストを実行し、テストによってコードがどの程度カバーされているかを計算します。 |
| Test: カーソル位置のテストを実行 | エディターでカーソルがフォーカスされているテストメソッドを実行します。2021.9 より前のバージョンではPython: Run Test Method...に似ています。 |
| Test: 現在のファイル内のテストを実行 | 現在エディターでフォーカスされているファイル内のテストを実行します。2021.9 より前のバージョンではPython: Run Current Test Fileと同等です。 |
| Test: 出力を表示 | すべてのテスト実行の詳細を含む出力を開きます。2021.9 より前のバージョンではPython: Show Test Outputに似ています。 |
| Testing: テストエクスプローラービューにフォーカス | テストエクスプローラービューを開きます。2021.9 より前のバージョンではTesting: Focus on Python Viewに似ています。 |
| Test: テストの更新を停止 | テスト検出をキャンセルします。 |
テスト構成設定
Python を使用したテストの動作は、VS Code によって提供される一般的な UI 設定と、Python および有効にしたフレームワークに固有の設定によって決定されます。
一般的な UI 設定
テスト機能の UI に影響する設定は VS Code 自体によって提供されており、「Testing」で検索するとVS Code 設定エディターで見つけることができます。
一般的な Python 設定
| 設定 (python.testing.) |
既定値 | 説明 |
|---|---|---|
| autoTestDiscoverOnSaveEnabled | true |
テストファイルの保存時に自動テスト検出を有効または無効にするかどうかを指定します。この設定を変更した後、適用するためにウィンドウを再読み込みする必要がある場合があります。 |
| cwd | null | テストのオプションの作業ディレクトリを指定します。この設定の存在は、pytest の--rootdir引数を動的に調整します。 |
| autoTestDiscoverOnSavePattern | **/*.py |
autoTestDiscoverOnSaveEnabledがtrueの場合に、自動テスト検出をトリガーするファイル変更を決定するグロブパターンを指定します。 |
| debugPort | 3000 |
unittest テストのデバッグに使用されるポート番号。 |
| promptToConfigure | true |
潜在的なテストが検出された場合に、VS Code がテストフレームワークの構成を促すかどうかを指定します。 |
unittest 構成設定
| Unittest 設定 (python.testing.) |
既定値 | 説明 |
|---|---|---|
| unittestEnabled | false |
unittest がテストフレームワークとして有効になっているかどうかを指定します。pytest の同等の設定は無効にする必要があります。 |
| unittestArgs | ["-v", "-s", ".", "-p", "*test*.py"] |
unittest に渡す引数。スペースで区切られた各要素はリスト内の個別の項目です。既定値の説明については以下を参照してください。 |
unittest の既定の引数は次のとおりです
-vは既定の詳細度を設定します。よりシンプルな出力にするには、この引数を削除します。-s .はテストを検出するための開始ディレクトリを指定します。「test」フォルダーにテストがある場合、引数を-s testに変更します (つまり、引数配列では"-s", "test")。-p *test*.pyはテストを検索するために使用される検出パターンです。この場合、「test」という単語を含むすべての.pyファイルです。テストファイルに異なる名前を付けている場合 (たとえば、すべてのファイル名の末尾に「_test」を追加するなど)、配列の適切な引数に*_test.pyのようなパターンを使用します。
最初の失敗でテスト実行を停止するには、失敗高速オプション"-f"を引数配列に追加します。
利用可能なオプションの完全なセットについては、unittest コマンドラインインターフェイスを参照してください。
pytest 構成設定
| pytest 設定 (python.testing.) |
既定値 | 説明 |
|---|---|---|
| pytestEnabled | false |
pytest がテストフレームワークとして有効になっているかどうかを指定します。unittest の同等の設定は無効にする必要があります。 |
| pytestPath | "pytest" |
pytest へのパス。pytest が現在の環境外にある場合は、完全なパスを使用します。 |
| pytestArgs | [] |
pytest に渡す引数。スペースで区切られた各要素はリスト内の個別の項目です。pytest コマンドラインオプションを参照してください。 |
pytest の既定の引数は次のとおりです
rootdirは、ワークスペース内のpython.testing.cwd設定の有無に基づいて動的に調整されます。
pytest Configurationで説明されているように、pytest.iniファイルを使用して pytest を構成することもできます。
pytest-cov カバレッジモジュールがインストールされている場合、pytest-cov は実行中のソースコードにアクセスするために同じ手法を使用しているため、VS Code はデバッグ中にブレークポイントで停止しません。この動作を防ぐには、テストをデバッグするときにpytestArgsに--no-covを含めます (たとえば、デバッグ構成に"env": {"PYTEST_ADDOPTS": "--no-cov"}を追加します)。(その起動構成の設定方法については、上記のテストのデバッグを参照してください)。(詳細については、pytest-cov ドキュメントのDebuggers and PyCharmを参照してください)。
IntelliSense 設定
| IntelliSense 設定 (python.analysis.) |
既定値 | 説明 |
|---|---|---|
| inlayHints.pytestParameters | false | pytest fixture 引数型のインレイヒントを表示するかどうか。trueまたはfalseが許容されます。 |