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)¶
最初に、前のステップの結果をコピーして「pytest」パッケージをインストールします:
$ cd ..; cp -r debugtoolbar unit_testing; cd unit_testing $ $VENV/bin/pip install -e . $ $VENV/bin/pip install pytest
今度は「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)
テストを実行してください:
$ $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)¶
- レスポンスステータスコードが「404」 (not found)をアサートするようにテストを変更します。「py.test」をもう一度実行してください。エラーレポートを読んで、何を伝えているのか解読できるかどうかを見てください。
- もっと現実的な例として、エラーが見つかったときに「tests.py」をもとに戻して、ビューに存在しない変数への参照などのエラーを入れます。テストを実行してブラウザをリロードしてコードに戻るよりも、これがどのように便利であるかを確認してください。
- 最後に、最も現実的なテストでは、Pyramidレスポンスオブジェクトについて読んで、レスポンスコードを変更する方法を見てください。テストを実行してテストがどのようにコードがサポートすると主張している 「コントラクト」を確認します。
- レスポンスボディのHTML値をテストするために、単体テストアサーションをどのように追加できますか?
- なぜ、モジュールの上部ではなく、 「test_hello_world」メソッド内部で「hello_world」ビュー関数をインポートするのですか?
参考
(機械翻訳) ユニット、統合、機能テスト も参照してください