Visual Studio Code での Python テスト
Python 拡張機能は、VS Code に組み込まれているテスト機能に基づいており、Python に組み込まれているunittestフレームワークとpytestのテスト検出、テストカバレッジ、テストの実行、テストのデバッグを提供します。
テストを構成する
Python 拡張機能がインストールされ、エディターで Python ファイルが開かれている場合、VS Code のアクティビティ バーにテストビーカーアイコンが表示され、これは**テストエクスプローラー**ビューを表します。テストエクスプローラーを開くと、テストフレームワークが有効になっていない場合に**Python テストの構成**ボタンが表示されます。**Python テストの構成**を選択すると、テストフレームワークとテストを含むフォルダーを選択するよう求められます。unittest を使用する場合は、テストファイルを識別するために使用するファイルグロブパターンも選択します。
ファイルグロブパターンとは、ワイルドカードに基づいてファイルまたはフォルダー名を照合し、ファイルを含めるか含めないかを定義する文字列パターンです。
テストは、コマンドパレットから**Python: Configure Tests**コマンドを使用するか、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
に設定します。この設定を有効にするには、ウィンドウをリロードする必要があります。自動テスト検出に含まれるファイルをより詳細に制御するには、既定で**/*.py
に設定されているpython.testing.autoTestDiscoverOnSavePattern
設定を調整します。
テスト検出は、現在のフレームワークの検出パターンを適用します (テスト構成設定を使用してカスタマイズできます)。既定の動作は次のとおりです。
-
python.testing.unittestArgs
: トップレベルのプロジェクトフォルダー内の名前に「test」を含む任意の Python (.py
) ファイルを探します。すべてのテストファイルは、インポート可能なモジュールまたはパッケージである必要があります。ファイルの照合パターンは-p
構成設定で、フォルダーは-t
設定でカスタマイズできます。 -
python.testing.pytestArgs
: 現在のフォルダーおよびすべてのサブフォルダー内のどこでも、「test_」で始まるか「_test」で終わる名前の Python (.py
) ファイルを探します。
サブフォルダーに配置されたテストは、テストファイルがインポートできないために検出されない場合があります。これらをインポート可能にするには、そのフォルダーに__init__.py
という名前の空のファイルを作成します。
テストの検出が成功すると、テストエクスプローラーにテストが一覧表示されます。
テストエクスプローラーから直接テスト検出をトリガーする場合、進行中のテスト検出呼び出しをキャンセルすることもできます。検出中に**更新**ボタンの代わりに表示される**キャンセル**ボタンを使用します。
検出が失敗した場合 (たとえば、テストフレームワークがインストールされていない、またはテストファイルに構文エラーがある場合)、テストエクスプローラーにログへのリンクを含むエラーメッセージが表示されます。完全なエラーメッセージは、**Python**出力パネルで確認できます (**表示** > **出力**メニューコマンドを使用して**出力**パネルを表示し、右側のドロップダウンから**Python**を選択します)。
テストを実行する
次のいずれかのアクションを使用してテストを実行できます。
-
テストファイルを開いた状態で、前のセクションで示したように、テスト定義行の横のガターに表示される緑色の実行アイコンを選択します。このコマンドは、そのメソッドのみを実行します。
-
コマンドパレットから、次のいずれかのコマンドを実行します。
- **Test: Run All Tests** - 検出されたすべてのテストを実行します。
- **Test: Run Tests in Current File** - エディターで開かれているファイル内のすべてのテストを実行します。
- **Test: Run Test at Cursor** - エディターでカーソルの下にあるテストメソッドのみを実行します。
-
**テストエクスプローラー**から
-
検出されたすべてのテストを実行するには、**テストエクスプローラー**の上部にある再生ボタンを選択します。
-
特定のテストグループ、または単一のテストを実行するには、ファイル、クラス、またはテストを選択し、その項目の右にある再生ボタンを選択します。
-
テストエクスプローラーを介して、選択したテストを実行することもできます。そのためには、実行したいテストをCtrl+クリック (macOS ではCmd+クリック) し、そのいずれかを右クリックして**Run Test**を選択します。
-
テスト実行後、VS Code は結果をガター装飾としてエディターに直接表示します。失敗したテストもエディターで強調表示され、テスト実行エラーメッセージとすべてのテスト実行の履歴を表示する Peek View が表示されます。Escapeを押してビューを閉じることもできますし、ユーザー設定を開いて (**コマンドパレット**の**基本設定: 設定を開く (UI)**コマンド) **Testing: Automatically Open Peek View**設定の値をnever
に変更することで無効にすることもできます。
**テストエクスプローラー**では、個々のテスト、およびそれらのテストを含むクラスとファイルのテスト結果が表示されます。そのフォルダー内のいずれかのテストが合格しなかった場合、フォルダーには失敗アイコンが表示されます。
VS Code は、**テスト結果**パネルにもテスト結果を表示します。
カバレッジ付きでテストを実行する
カバレッジを有効にしてテストを実行するには、テストエクスプローラーでカバレッジ実行アイコンを選択するか、通常テスト実行をトリガーする任意のメニューから**カバレッジ付きで実行**オプションを選択します。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
設定を編集して、独自の仕様を含めることができます。python.testing.pytestArgs
に pytest 引数--cov
が存在する場合、Python 拡張機能はカバレッジ引数に追加の変更を加えず、カスタマイズが有効になるようにします。--cov
引数が見つからない場合、拡張機能は実行前に pytest 引数に--cov=.
を追加して、ワークスペースルートでのカバレッジを有効にします。
テストカバレッジの詳細については、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='<path-to-manage.py>'
を追加し、<path-to-manage.py>
をアプリケーションのmanage.py
ファイルへのパスに置き換えます。ヒント: エクスプローラービューでファイルを右クリックし、**パスのコピー**を選択することでパスをコピーできます。
- プロジェクトのルートに
- 必要に応じて、Django テスト引数を
settings.json
ファイルの"python.testing.unittestArgs": []
に追加し、Django と互換性のない引数は削除します。
既定では、Python 拡張機能はプロジェクトルートにある.env
ファイルを検索して読み込みます。.env
ファイルがプロジェクトルートにない場合、またはVS Code の変数置換を使用している場合は、settings.json
ファイルに"python.envFile": "${workspaceFolder}/<path-to-.env>"
を追加します。これにより、Python 拡張機能はテストの実行および検出時にこのファイルから環境変数を読み込むことができるようになります。Python 環境変数に関する詳細情報を入手してください。
テストビューに移動し、**テストを更新**ボタンを選択すると、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 拡張機能で使用するテストフレームワークを構成します。 |
テスト: すべての結果をクリア | UI がセッション間でテスト結果を保持するため、すべてのテストステータスをクリアします。 |
テスト: すべてのテストをデバッグ | 検出されたすべてのテストをデバッグします。2021.9より前のバージョンでは**Python: Debug All Tests**と同等です。 |
テスト: 失敗したテストをデバッグ | 最新のテスト実行で失敗したテストをデバッグします。 |
テスト: 最終実行をデバッグ | 最新のテスト実行で実行されたテストをデバッグします。 |
テスト: カーソル位置のテストをデバッグ | エディターでカーソルがフォーカスされているテストメソッドをデバッグします。2021.9より前のバージョンでは**Python: Debug Test Method...**に似ています。 |
テスト: 現在のファイル内のテストをデバッグ | エディターで現在フォーカスされているファイル内のテストをデバッグします。 |
テスト: 次のテスト失敗に移動 | エラーピークビューが開いている場合、エクスプローラー内で失敗した次のテストのピークビューを開いて移動します。 |
テスト: 前のテスト失敗に移動 | エラーピークビューが開いている場合、エクスプローラー内で失敗した前のテストのピークビューを開いて移動します。 |
テスト: 出力をピーク表示 | 失敗したテストメソッドのエラーピークビューを開きます。 |
テスト: テストを更新 | テストの検出を実行し、テストエクスプローラーを更新して、テストの変更、追加、または削除を反映させます。2021.9より前のバージョンでは**Python: Discover Tests**に似ています。 |
テスト: 失敗したテストを再実行 | 最新のテスト実行で失敗したテストを実行します。2021.9より前のバージョンでは**Python: Run Failed Tests**に似ています。 |
テスト: 最終実行を再実行 | 最新のテスト実行で実行されたテストをデバッグします。 |
テスト: すべてのテストを実行 | 検出されたすべてのテストを実行します。2021.9より前のバージョンでは**Python: Run All Tests**と同等です。 |
テスト: カバレッジ付きですべてのテストを実行 | 検出されたすべてのテストを実行し、コードがテストによってどれだけカバーされているかを計算します。 |
テスト: カーソル位置のテストを実行 | エディターでカーソルがフォーカスされているテストメソッドを実行します。2021.9より前のバージョンでは**Python: Run Test Method...**に似ています。 |
テスト: 現在のファイル内のテストを実行 | エディターで現在フォーカスされているファイル内のテストを実行します。2021.9より前のバージョンでは**Python: Run Current Test File**と同等です。 |
テスト: 出力を表示 | すべてのテスト実行の詳細を含む出力を開きます。2021.9より前のバージョンでは**Python: Show Test Output**に似ています。 |
テスト: テストエクスプローラービューにフォーカス | テストエクスプローラービューを開きます。2021.9より前のバージョンでは**Testing: Focus on Python View**に似ています。 |
テスト: テストの更新を停止 | テスト検出をキャンセルします。 |
テスト構成設定
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 ドキュメントのデバッガーと PyCharmを参照してください)。
IntelliSense 設定
IntelliSense 設定 (python.analysis.) |
既定値 | 説明 |
---|---|---|
inlayHints.pytestParameters | false | pytest フィクスチャ引数型のインレイヒントを表示するかどうか。許容される値はtrue またはfalse です。 |