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 拡張機能はフレームワークを有効にすると、テストの検出を試みます。テスト検出は、コマンド パレットから [テスト: テストの更新] コマンドを使用していつでもトリガーできます。
python.testing.autoTestDiscoverOnSaveEnabled
は既定で true
に設定されており、ワークスペース内の Python ファイルを追加、削除、または更新するたびにテスト検出が自動的に行われることを意味します。この機能を無効にするには、値を false
に設定します。これは、VS Code の設定ドキュメントで説明されているように、設定エディターまたは settings.json
ファイルのいずれかで行うことができます。この設定を有効にするには、ウィンドウを再読み込みする必要があります。自動テスト検出に含まれるファイルをより詳細に制御するには、既定で **/*.py
になっている python.testing.autoTestDiscoverOnSavePattern
設定を調整します。
テスト検出は、現在のフレームワークの検出パターンを適用します (これはテスト構成設定を使用してカスタマイズできます)。既定の動作は次のとおりです。
-
python.testing.unittestArgs
: トップレベルのプロジェクト フォルダー内で、名前に "test" を含む任意の Python (.py
) ファイルを探します。すべてのテスト ファイルは、インポート可能なモジュールまたはパッケージである必要があります。-p
構成設定でファイル マッチング パターンをカスタマイズし、-t
設定でフォルダーをカスタマイズできます。 -
python.testing.pytestArgs
: 現在のフォルダーおよびすべてのサブフォルダー内のどこにあっても、名前が "test_" で始まるか "_test" で終わる任意の Python (.py
) ファイルを探します。
サブフォルダーに配置されたテストは、そのようなテスト ファイルがインポートできないために検出されないことがあります。それらをインポート可能にするには、そのフォルダーに __init__.py
という名前の空のファイルを作成します。
テスト検出が成功すると、テスト エクスプローラーにテストが一覧表示されます。
テスト エクスプローラーから直接テスト検出をトリガーする場合、進行中のテスト検出呼び出しをキャンセルすることもできます。検出中に [更新] ボタンの代わりとなる [キャンセル] ボタンを使用します。
検出が失敗した場合 (たとえば、テスト フレームワークがインストールされていない、またはテスト ファイルに構文エラーがある場合)、ログへのリンクを含むエラー メッセージがテスト エクスプローラーに表示されます。[Python] 出力パネルでエラー メッセージ全体を確認できます ([表示] > [出力] メニュー コマンドを使用して [出力] パネルを表示し、右側のドロップダウンから [Python] を選択します)。
テストの実行
次のいずれかのアクションを使用してテストを実行できます。
-
テスト ファイルを開いた状態で、前のセクションで示したように、テスト定義行の横のガターに表示される緑色の実行アイコンを選択します。このコマンドは、その 1 つのメソッドのみを実行します。
-
コマンド パレットから、次のいずれかのコマンドを実行します。
- [テスト: すべてのテストを実行] - 検出されたすべてのテストを実行します。
- [テスト: 現在のファイルのテストを実行] - エディターで開かれているファイル内のすべてのテストを実行します。
- [テスト: カーソル位置のテストを実行] - エディター内のカーソル下のテスト メソッドのみを実行します。
-
テスト エクスプローラーから:
-
検出されたすべてのテストを実行するには、テスト エクスプローラーの上部にある再生ボタンを選択します。
-
特定のテスト グループまたは単一のテストを実行するには、ファイル、クラス、またはテストを選択し、その項目の右側にある再生ボタンを選択します。
-
テスト エクスプローラーを使用して、選択したテストを実行することもできます。そのためには、実行したいテストを Ctrl+Click (macOS では Cmd+Click) し、そのうちの 1 つを右クリックしてから [テストの実行] を選択します。
-
テスト実行後、VS Code は結果をエディター内に直接ガター装飾として表示します。失敗したテストはエディター内でも強調表示され、テスト実行のエラー メッセージとすべてのテスト実行の履歴を表示するピーク ビューが表示されます。Escape を押すとビューを閉じることができます。また、ユーザー設定を開き (コマンド パレットの [基本設定: 設定 (UI) を開く] コマンド)、[Testing: Automatically Open Peek View] 設定の値を never
に変更することで、これを無効にすることができます。
テスト エクスプローラーでは、個々のテストと、それらのテストを含むクラスやファイルの結果が表示されます。フォルダー内のいずれかのテストが合格しなかった場合、フォルダーには失敗アイコンが表示されます。
VS Code は、[テスト結果] パネルにもテスト結果を表示します。
カバレッジ付きでテストを実行
カバレッジを有効にしてテストを実行するには、テスト エクスプローラーのカバレッジ実行アイコン、または通常テスト実行をトリガーする任意のメニューから [カバレッジ付きで実行] オプションを選択します。Python 拡張機能は、pytest を使用している場合は pytest-cov
プラグインを使用してカバレッジを実行し、unittest の場合は coverage.py
を使用してカバレッジを実行します。
カバレッジ付きでテストを実行する前に、プロジェクトに適したテスト カバレッジ パッケージをインストールしてください。ブランチ カバレッジは、coverage バージョン >= 7.7 でのみサポートされています。
カバレッジの実行が完了すると、行レベルのカバレッジについてエディターの行が強調表示されます。テスト カバレッジの結果は、テスト エクスプローラーの「テスト カバレッジ」サブタブとして表示されます。これには、コマンド パレットの [テスト: テスト カバレッジ ビューにフォーカス] (⇧⌘P (Windows, Linux Ctrl+Shift+P)) でも移動できます。このパネルでは、ワークスペース内の各ファイルとフォルダーの行カバレッジ メトリック、および関連する場合はブランチ カバレッジを表示できます。
pytest を使用する場合、カバレッジ実行をより詳細に制御するには、python.testing.pytestArgs
設定を編集して仕様を含めることができます。pytest の引数 --cov
が python.testing.pytestArgs
に存在する場合、Python 拡張機能はカバレッジ引数に追加の編集を行わず、カスタマイズが有効になるようにします。--cov
引数が見つからない場合、拡張機能は実行前に pytest の引数に --cov=.
を追加して、ワークスペース ルートでカバレッジを有効にします。
テスト カバレッジの詳細については、VS Code のテスト カバレッジのドキュメントをご覧ください。
テストのデバッグ
テストをデバッグするには、関数定義の横にあるガター装飾を右クリックして [テストのデバッグ] を選択するか、テスト エクスプローラーでそのテストの横にある [テストのデバッグ] アイコンを選択します。
テストの実行またはデバッグは、テスト ファイルを自動的に保存しません。テストを実行する前に必ず変更を保存してください。そうしないと、結果がファイルの以前のバージョンを反映しているため、混乱する可能性があります。
コマンド パレットから次のコマンドを使用してテストをデバッグできます。
- [テスト: すべてのテストをデバッグ] - ワークスペース内のすべてのテストに対してデバッガーを起動します。
- [テスト: 現在のファイルのテストをデバッグ] - エディターで開いているファイルで定義したテストに対してデバッガーを起動します。
- [テスト: カーソル位置のテストをデバッグ] - エディターでカーソルが置かれているメソッドに対してのみデバッガーを起動します。テスト エクスプローラーの [テストのデバッグ] アイコンを使用して、選択したスコープ内のすべてのテストおよび検出されたすべてのテストに対してデバッガーを起動することもできます。
settings.json
ファイルで testing.defaultGutterClickAction
の設定値を debug
に変更することで、ガター装飾をクリックしたときの既定の動作を実行ではなくデバッグに変更することもできます。
テストのデバッグ設定をカスタマイズするには、ワークスペースの .vscode
フォルダーにある launch.json
または settings.json
ファイルでテスト デバッグ構成を指定できます。これには、構成に "purpose": ["debug-test"]
を追加します。この構成は、[テスト: すべてのテストをデバッグ]、[テスト: 現在のファイルのテストをデバッグ]、[テスト: カーソル位置のテストをデバッグ] コマンドを実行するときに使用されます。
たとえば、以下の 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
ファイルを作成します。 MANAGE_PY_PATH='<path-to-manage.py>'
を.env
ファイルに追加し、<path-to-manage.py>
をアプリケーションのmanage.py
ファイルへのパスに置き換えます。ヒント: エクスプローラー ビューでファイルを右クリックし、[パスのコピー] を選択することでパスをコピーできます。
- プロジェクトのルートに
- 必要に応じて、
settings.json
ファイルの"python.testing.unittestArgs": []
に Django テスト引数を追加し、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
のようなパターンを使用します。
最初の失敗でテスト実行を停止するには、引数配列に fail fast オプション "-f"
を追加します。
利用可能なオプションの完全なセットについては、unittest コマンドライン インターフェイスを参照してください。
pytest 構成設定
pytest 設定 (python.testing.) |
既定値 | 説明 |
---|---|---|
pytestEnabled | false |
pytest がテスト フレームワークとして有効になっているかどうかを指定します。unittest の同等の設定は無効にする必要があります。 |
pytestPath | "pytest" |
pytest へのパス。pytest が現在の環境外にある場合は、完全パスを使用します。 |
pytestArgs | [] |
pytest に渡す引数。スペースで区切られた各要素がリスト内の個別の項目になります。pytest コマンドライン オプションを参照してください。 |
pytest の既定の引数は次のとおりです。
rootdir
は、ワークスペースのpython.testing.cwd
設定の有無に基づいて動的に調整されます。
pytest の構成で説明されているように、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 です。 |