VS Codeのエージェントモードを拡張するには、を試してください!

Visual Studio Code での Python のテスト

Python 拡張機能は、VS Code の組み込みテスト機能を基盤としており、Python の組み込み unittest フレームワークと pytest のためのテスト検出、テスト カバレッジ、テストの実行とデバッグを提供します。

テストの構成

Python 拡張機能がインストールされ、Python ファイルがエディター内で開かれると、VS Code のアクティビティ バーにテスト ビーカー アイコンが表示され、テスト エクスプローラー ビューを表します。テスト エクスプローラーを開くと、テスト フレームワークが有効になっていない場合に [Python テストの構成] ボタンが表示されます。[Python テストの構成] を選択すると、テスト フレームワークとテストを含むフォルダーを選択するように求められます。unittest を使用する場合は、テスト ファイルを識別するために使用されるファイル グロブ パターンも選択します。

ファイル グロブ パターンは、ワイルドカードに基づいてファイル名またはフォルダー名に一致させ、ファイルを含めるか含めないかを決める定義済みの文字列パターンです。

Configure Python Tests button displayed in the Test Explorer when tests haven't been configured.

テストは、コマンド パレットから [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 という名前の空のファイルを作成します。

テスト検出が成功すると、テスト エクスプローラーにテストが一覧表示されます。

The VS Code Test Explorer for Python tests

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

Cancel test discovery button in the Test Explorer.

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

Discovery failure error messaged displayed in the Test Explorer

テストの実行

次のいずれかのアクションを使用してテストを実行できます。

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

    Run test icon displayed on the gutter when the test file is open in the editor

  • コマンド パレットから、次のいずれかのコマンドを実行します。

    • [テスト: すべてのテストを実行] - 検出されたすべてのテストを実行します。
    • [テスト: 現在のファイルのテストを実行] - エディターで開かれているファイル内のすべてのテストを実行します。
    • [テスト: カーソル位置のテストを実行] - エディター内のカーソル下のテスト メソッドのみを実行します。
  • テスト エクスプローラーから:

    • 検出されたすべてのテストを実行するには、テスト エクスプローラーの上部にある再生ボタンを選択します。

      Running all tests through Test Explorer

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

      Running tests at specific scopes through Test Explorer

    • テスト エクスプローラーを使用して、選択したテストを実行することもできます。そのためには、実行したいテストを Ctrl+Click (macOS では Cmd+Click) し、そのうちの 1 つを右クリックしてから [テストの実行] を選択します。

テスト実行後、VS Code は結果をエディター内に直接ガター装飾として表示します。失敗したテストはエディター内でも強調表示され、テスト実行のエラー メッセージとすべてのテスト実行の履歴を表示するピーク ビューが表示されます。Escape を押すとビューを閉じることができます。また、ユーザー設定を開き (コマンド パレット[基本設定: 設定 (UI) を開く] コマンド)、[Testing: Automatically Open Peek View] 設定の値を never に変更することで、これを無効にすることができます。

テスト エクスプローラーでは、個々のテストと、それらのテストを含むクラスやファイルの結果が表示されます。フォルダー内のいずれかのテストが合格しなかった場合、フォルダーには失敗アイコンが表示されます。

Test results on a unittest class and in Test Explorer

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

Test results in the Test Results panel

カバレッジ付きでテストを実行

カバレッジを有効にしてテストを実行するには、テスト エクスプローラーのカバレッジ実行アイコン、または通常テスト実行をトリガーする任意のメニューから [カバレッジ付きで実行] オプションを選択します。Python 拡張機能は、pytest を使用している場合は pytest-cov プラグインを使用してカバレッジを実行し、unittest の場合は coverage.py を使用してカバレッジを実行します。

カバレッジ付きでテストを実行する前に、プロジェクトに適したテスト カバレッジ パッケージをインストールしてください。ブランチ カバレッジは、coverage バージョン >= 7.7 でのみサポートされています。

カバレッジの実行が完了すると、行レベルのカバレッジについてエディターの行が強調表示されます。テスト カバレッジの結果は、テスト エクスプローラーの「テスト カバレッジ」サブタブとして表示されます。これには、コマンド パレットの [テスト: テスト カバレッジ ビューにフォーカス] (⇧⌘P (Windows, Linux Ctrl+Shift+P)) でも移動できます。このパネルでは、ワークスペース内の各ファイルとフォルダーの行カバレッジ メトリック、および関連する場合はブランチ カバレッジを表示できます。

Gif showing running Python tests with coverage.

pytest を使用する場合、カバレッジ実行をより詳細に制御するには、python.testing.pytestArgs 設定を編集して仕様を含めることができます。pytest の引数 --covpython.testing.pytestArgs に存在する場合、Python 拡張機能はカバレッジ引数に追加の編集を行わず、カスタマイズが有効になるようにします。--cov 引数が見つからない場合、拡張機能は実行前に pytest の引数に --cov=. を追加して、ワークスペース ルートでカバレッジを有効にします。

テスト カバレッジの詳細については、VS Code のテスト カバレッジのドキュメントをご覧ください。

テストのデバッグ

テストをデバッグするには、関数定義の横にあるガター装飾を右クリックして [テストのデバッグ] を選択するか、テスト エクスプローラーでそのテストの横にある [テストのデバッグ] アイコンを選択します。

Debug Test icon in the Test Explorer

テストの実行またはデバッグは、テスト ファイルを自動的に保存しません。テストを実行する前に必ず変更を保存してください。そうしないと、結果がファイルの以前のバージョンを反映しているため、混乱する可能性があります。

コマンド パレットから次のコマンドを使用してテストをデバッグできます。

  • [テスト: すべてのテストをデバッグ] - ワークスペース内のすべてのテストに対してデバッガーを起動します。
  • [テスト: 現在のファイルのテストをデバッグ] - エディターで開いているファイルで定義したテストに対してデバッガーを起動します。
  • [テスト: カーソル位置のテストをデバッグ] - エディターでカーソルが置かれているメソッドに対してのみデバッガーを起動します。テスト エクスプローラーの [テストのデバッグ] アイコンを使用して、選択したスコープ内のすべてのテストおよび検出されたすべてのテストに対してデバッガーを起動することもできます。

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 テストを検出させることができます。

  1. settings.json ファイル"python.testing.unittestEnabled": true, を設定します。
  2. 環境変数として MANAGE_PY_PATH を追加します。
    1. プロジェクトのルートに .env ファイルを作成します。
    2. MANAGE_PY_PATH='<path-to-manage.py>'.env ファイルに追加し、<path-to-manage.py> をアプリケーションの manage.py ファイルへのパスに置き換えます。

      ヒント: エクスプローラー ビューでファイルを右クリックし、[パスのコピー] を選択することでパスをコピーできます。

  3. 必要に応じて、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 autoTestDiscoverOnSaveEnabledtrue の場合に、どのファイルの変更が自動テスト検出をトリガーするかを決定するグロブ パターンを指定します。
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 です。

関連項目

  • Python 環境 - 編集およびデバッグに使用する Python インタープリターを制御します。
  • 設定リファレンス - VS CodeのPython関連設定の全範囲を探索します。