Python コードの単体テストの設定Setting Up Unit Testing for Python Code

単体テストは、アプリケーションの他のコード単位 (通常は分離された関数、クラスなど) をテストするコードの断片です。Unit tests are pieces of code that test other code units in an application, typically isolated functions, classes, and so on. アプリケーションがそのすべての単体テストに合格すると、少なくとも低レベルの機能が正しいことを信頼できます。When an application passes all its unit tests, you can at least trust that its low-level functionality is correct.

Python は、プログラムの設計時にシナリオを検証するために単体テストを幅広く使用します。Python uses unit tests extensively to validate scenarios while designing a program. Visual Studio の Python サポートには、別々にテストを実行する必要のない、開発プロセスのコンテキスト内での単体テストの検出、実行、デバッグのサポートが含まれています。Python support in Visual Studio includes discovering, executing, and debugging unit tests within the context of your development process, without needing to run tests separately.

このトピックでは、Python での Visual Studio の単体テスト機能の概要を説明します。This topic provides a brief outline of unit testing capabilities in Visual Studio with Python. 一般的な単体テストについて詳しくは、「コードの単体テスト」をご覧ください。For more on unit testing in general, see Unit Test Your Code. Testing Python」 (Python をテストする) (Microsoft Virtual Academy、2 分 31 秒) の動画も参照してください。Also see the video Testing Python (Microsoft Virtual Academy, 2m31s).

テストの検出と表示Discovering and viewing tests

規則により、Visual Studio はテストをその名前が test で始まるメソッドとして識別します。By convention, Visual Studio identifies tests are as methods whose names start with test. この動作を確認するには、次の操作を行います。To see this behavior, do the following:

  1. Visual Studio に読み込まれた Python プロジェクトを開き、プロジェクトを右クリックして [追加] > [新しい項目...] を選択し、[Python Unit Test (Python 単体テスト)] に続けて [追加] を選択します。Open a Python project loaded in Visual Studio, right-click your project, select Add > New Item..., then select Python Unit Test followed by Add.

  2. この操作で、標準 unittest モジュールをインポートし、unittest.TestCase からテスト クラスを派生させ、スクリプトを直接実行する場合に unittest.main() を起動するコードを含む test1.py ファイルが作成されます。This action creates a test1.py file with code that imports the standard unittest module, derives a test class from unittest.TestCase, and invokes unittest.main() if you run the script directly:

    import unittest
    
    class Test_test1(unittest.TestCase):
       def test_A(self):
           self.fail("Not implemented")
    
    if __name__ == '__main__':
       unittest.main()
    
  3. 必要に応じてファイルを保存し、[テスト] > [Windows] > [テスト エクスプローラー] メニュー コマンドでテスト エクスプローラーを開きます。Save the file if necessary, then open Test Explorer with the Test > Windows > Test Explorer menu command.

  4. テスト エクスプローラーは、テストするプロジェクトを検索し、それらを次のように表示します。Test Explorer searches your project for tests and displays them as shown below. テストをダブルクリックすると、そのソース ファイルが開きます。Double-clicking a test opens its source file.

    既定の test_A を表示しているテスト エクスプローラー

  5. 他のテストをプロジェクトに追加すると、ツール バーのグループ化メニューを使用してテスト エクスプローラーのビューを整理できます。As you add more tests to your project, you can organize the view in Test Explorer using the group by menu on the toolbar:

    テスト エクスプローラーのグループ化ツール バー メニュー

  6. 検索フィールドにテキストを入力してテストを名前でフィルター処理することもできます。You can also enter text in the search field to filter tests by name.

unittest モジュールとテストの記述について詳しくは、Python 2.7 ドキュメントまたは Python 3.4 ドキュメント (python.org) をご覧ください。For more information on the unittest module and writing tests, see the Python 2.7 documentation or the Python 3.4 documentation (python.org).

テストの実行Running tests

テスト エクスプローラーでは、さまざまな方法でテストを実行できます。In Test Explorer you can run tests in a variety of ways:

  • [Run All (すべて実行)] は、表示されているすべてのテスト (フィルターの対象) を明確に実行します。Run All clearly runs all shown tests (subject to filters).
  • [実行...] メニューには、失敗、合格、または未実行のテストをグループとして実行するコマンドが用意されています。The Run... menu gives you commands to run failed, passed, or not run tests as a group.
  • 1 つ以上のテストを選んで右クリックし、[選択したテストの実行] を選択します。You can select one or more tests, right-click, and select Run Selected Tests.

テストはバックグラウンドで実行され、完了するとテスト エクスプローラーが各テストの状態を更新します。Tests run in the background and Test Explorer updates each test's status as it completes:

  • 合格したテストには、緑のチェックマークとテストの実行にかかった時間が表示されます。Passing tests show a green rick and the time taken to run the test:

    test_A の合格状態

  • 失敗したテストには、コンソール出力とテストの実行からの unittest 出力を示す [出力] リンクとともに赤い × 印が表示されます。Failed tests show a red cross with an Output link that shows console output and unittest output from the test run:

    test_A の失敗状態

    test_A の失敗とその理由

テストのデバッグDebugging tests

単体テストはコードの断片であるため、他のコードと同様にバグが発生することがあり、デバッガーでの実行が必要になることがあります。Because unit tests are pieces of code, they are subject to bugs just like any other code and occasionally need to be run in a debugger. デバッガーでは、ブレークポイントを設定し、変数を確認し、コードをステップ実行することができます。In the debugger you can set breakpoints, examine variables, and step through code. Visual Studio には単体テストのための診断ツールも用意されています。Visual Studio also provides diagnostic tools for unit tests.

デバッグを開始するには、コードに最初のブレークポイントを設定し、テスト エクスプローラーでテスト (または選択範囲) を右クリックし、[選択したテストのデバッグ] を選択します。To start debugging, set an initial breakpoint in your code, then right-click the test (or a selection) in Test Explorer and select Debug Selected Tests. アプリケーション コードの場合と同様に、Visual Studio が Python デバッガーを起動します。Visual Studio starts the Python debugger as it would for application code.

テストのデバッグ

Visual Studio のバージョンに応じて、[選択されたテストのコード カバレッジの分析] コマンドと [テストのプロファイル] コマンドを使用することもできます (機能のマトリックスのページをご覧ください)。You can also use the Analyze Code Coverage for Selected Tests and Profile Test commands, depending on your version of Visual Studio (see the Features matrix).

既知の問題Known Issues

  • デバッグを開始するときに、Visual Studio がデバッグを起動して停止してからもう一度開始するように見えます。When starting debugging, Visual Studio appears to start and stop debugging, and then start again. この動作は想定内です。This behavior is expected.
  • 複数のテストをデバッグするときに、それぞれが個別に実行され、デバッグ セッションが中断されます。When debugging multiple tests, each one is run independently, which interrupts the debugging session.
  • Visual Studio で、デバッグ時にテストの開始が断続的に失敗します。Visual Studio intermittently fails to start a test when debugging. 通常は、もう一度テストをデバッグしようとすると成功します。Normally, attempting to debug the test again succeeds.
  • デバッグ時に、テストを unittest 実装にステップ アウトできます。When debugging, it is possible to step out of a test into the unittest implementation. 通常は、次のステップはプログラムの最後まで実行されてデバッグを停止します。Normally, the next step runs to the end of the program and stop debugging.