05: ユニットテストとpytest(05: Unit Tests and pytest )

Pythonコードのプロジェクトに単体テストを提供します。

背景

マントラは言いました「テストされていないコードは壊れたコードです。」Pythonコミュニティには、テストスクリプトを記述するための長いカルチャーがあります。これにより、コードを記述した後の未来もコードが正しく機能するように維持されます。Pyramidはプレリリースからテストカバレッジ100%で、テストに深く関わってきました。

Pythonには、標準ライブラリに unit testing framework が含まれています。長年に渡って、pytest などの多くのPythonプロジェクトでは利便性と機能性を高める代替テストランナーを使用してこのフレームワークを拡張しました。チュートリアルでは「pytest」を使用します。

心配しないでください。このチュートリアルでは、「テスト駆動型開発」(TDD)について杓子定規ではありません。各ステップでコードを大幅に壊さないようにするだけで十分です。コードを書いているときは、ブラウザを常に変更してリロードをクリックするよりも便利です。

別のセクションで pytest-cov の議論があります。

目標(Objectives)

  • コードの品質を保証する単体テストを書く。
  • 私たちのテストに役立つPythonパッケージ (pytest) をインストールしてください

手順(Steps)

  1. 最初に、前のステップの結果をコピーして「pytest」パッケージをインストールします:

    $ cd ..; cp -r debugtoolbar unit_testing; cd unit_testing
    $ $VENV/bin/pip install -e .
    $ $VENV/bin/pip install pytest
    
  2. 今度は「unit_testing/tutorial/tests.py」に簡単な単体テストを書く:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    import unittest
    
    from pyramid import testing
    
    
    class TutorialViewTests(unittest.TestCase):
        def setUp(self):
            self.config = testing.setUp()
    
        def tearDown(self):
            testing.tearDown()
    
        def test_hello_world(self):
            from tutorial import hello_world
    
            request = testing.DummyRequest()
            response = hello_world(request)
            self.assertEqual(response.status_code, 200)
    
  3. テストを実行してください:

    $ $VENV/bin/py.test tutorial/tests.py -q
    .
    1 passed in 0.14 seconds
    

分析(Analysis)

「tests.py」はPythonの標準ユニットテストフレームワークをインポートします。Pyramid的なテストをより便利に書くために、Pyramidは「pyramid.testing」でテストのセットアップとティアダウンで使用するヘルパーを提供しています。1つのテストはビューをインポートし、ダミーリクエストを行い、ビューが期待どおりの結果を返すかどうかを確認します

「tests.TutorialViewTests.test_hello_world」テストは単体テストの小規模な例です。まず各テスト内でビューをインポートします。普通のPythonコードのように一番でインポートしないのはなぜですか? インポートはテストを中断させる影響を引き起こす可能性があるためです。テストしたいユニット、同名のユニットテスト。それぞれのテストは、適切な程度に自分自身を分離する必要があります

テストでは、偽のWebリクエストを作成してPyramidビューを呼び出します。レスポンスにHTTPステータスコードをテストして、期待通りの状態になっていることを確認します。

「pyramid.testing.setUp()」と「pyramid.testing.tearDown()」の使用に注意してください。 実際には必要ありません。テストで「config(Configurator)」オブジェクトを使用する必要がある場合にのみ、ビューを呼び出す前に、構成に要素を追加する必要があります。

エクストラクレジット(Extra credit)

  1. レスポンスステータスコードが「404」 (not found)をアサートするようにテストを変更します。「py.test」をもう一度実行してください。エラーレポートを読んで、何を伝えているのか解読できるかどうかを見てください。
  2. もっと現実的な例として、エラーが見つかったときに「tests.py」をもとに戻して、ビューに存在しない変数への参照などのエラーを入れます。テストを実行してブラウザをリロードしてコードに戻るよりも、これがどのように便利であるかを確認してください。
  3. 最後に、最も現実的なテストでは、Pyramidレスポンスオブジェクトについて読んで、レスポンスコードを変更する方法を見てください。テストを実行してテストがどのようにコードがサポートすると主張している 「コントラクト」を確認します。
  4. レスポンスボディのHTML値をテストするために、単体テストアサーションをどのように追加できますか?
  5. なぜ、モジュールの上部ではなく、 「test_hello_world」メソッド内部で「hello_world」ビュー関数をインポートするのですか?

参考

(機械翻訳) ユニット、統合、機能テスト も参照してください