PyUnit チュートリアル: Python ユニットテストフレームワーク(例付き)

⚡ スマートサマリー

Python ユニットテストは、コードの小さな単位を個別にチェックすることで、バグを早期に発見します。ここでは、ユニットテストの手法、PyUnit(unittest)フレームワーク、その主要クラス、テストケースの設計方法、そして動作例について学びます。

  • 🧪 それは何ですか: 単体テストは、コードの小さく独立した単位を検証することで、バグを早期に発見する。
  • 🔬 テクニック: TDD、スタブ、モックはコードを分離し、ユニットテストを独立して行えるようにします。
  • 🐍 ピユニット: Pythonの組み込みユニットテストモジュール(PyUnit)は、 JUnit.
  • 🧱 主なクラス: TestCase、TestSuite、TestLoader、TextTestRunner、およびTestResults。
  • 🤖 AIによる支援: CopilotのようなAIツールは、単体テストのテストケースを瞬時に生成します。

Python 単体テスト

単体テストとは何ですか?

単体テスト in Python バグの再発性が低く、修正コストが低いアプリケーションの開発段階の早い段階でバグを特定するために行われます。

ユニットテストは、スクリプト化されたコードレベルのテストで、 Python 機能の小さな「ユニット」を検証します。ユニット テストは、テスト フィクスチャに基づいたオブジェクト指向フレームワークです。

Python 単体テストの手法

Python ユニット テストでは、主に、依存コードにアクセスせずに特定のモジュールをテストします。開発者は、スタブやモックなどの手法を使用してコードを「ユニット」に分割し、個々の部分に対してユニット レベルのテストを実行できます。

  • テスト駆動開発 TDD: ユニットテストは、 Pythonそのために開発者はテスト駆動開発手法を使用します。TDD手法では、まず設計を行い、 Python ユニットテストを実行してから、この機能を実装するコードの作成を続行します。
  • スタブとモック: これらは、テストされている偽のメソッドをシミュレートする XNUMX つの主な手法です。 あ スタブ 単体テストを正しく実行するために必要な依存関係を埋めるために使用されます。 あ モック 一方、アサートを入れたテストを実行する偽のオブジェクトです。

    両方のメソッドの目的は同じで、クラスまたは関数のすべての依存関係のテストを省略します。

Python ユニットテストフレームワーク

ユニットテストのプロセスを容易にし、プロジェクトの品質を向上させるために、 Python ユニットテストフレームワーク。ユニットテストフレームワークには以下が含まれます。

Python 単体テストの手法

  • ピユニット: PyUnit は、コードの自動テストのためのフィクスチャ、テスト ケース、テスト スイート、およびテスト ランナーをサポートしています。 PyUnit では、テスト ケースを同じフィクスチャを持つスイートに編成できます。
  • 鼻: Noseの組み込みプラグインは、出力キャプチャ、コードカバレッジ、doctestsなどに役立ちます。Noseの構文は非常にシンプルで、テストを書く際の障壁を減らします。 Python テストを簡単にするための unittest。
  • ドクターテスト: doctest テスト スクリプトは、ファイルの最後に小さな関数を含む docstring に記述されます。 Doctest を使用すると、ドキュメントに含まれているサンプルを実行し、期待した結果が返されることを確認することでコードをテストできます。 doctest の使用例はあまり詳細ではなく、特殊なケースを捉えていません。 これらは、モジュールとそのコンポーネントの主な使用例を表現するドキュメントとして役立ちます。

PyUnit を使用した単体テスト

Pyunitは Python の JUnit。 Pyunit の一部として、unittest モジュールには 5 つの主要なクラスがあります。

PyUnit を使用した単体テスト

  • テストケースクラス: TestCase クラスはテスト ルーチンを保持し、各ルーチンの作成とその後のクリーンアップのためのフックを提供します。
  • TestSuiteクラス: コレクション コンテナとして機能し、複数のテストケース オブジェクトと複数のテストスイート オブジェクトを所有できます。
  • TestLoaderクラス: このクラスは、ローカルまたは外部ファイルから定義されたテスト ケースとスイートを読み込みます。 これらのスイートとケースを所有するテストスイート オブジェクトを生成します。
  • TextTestRunner クラス: テストを実行するための標準プラットフォームに対応します。
  • TestResults クラス: テスト結果用の標準コンテナを提供します。

テストケースの設計 Python PyUnit を使用したテスト

単体テストは、新しいテスト ケースの作成に使用できる基本クラスであるテスト ケースを提供します。 テスト ケースの設計には、次の XNUMX つの方法セットが使用されます。

テストケースの設計 Python

ユニットテスト.テストケース

setUp()
teardown()

skipTest(aMesg:string)
fail(aMesg:string)

id():string
shortDescription():string

最初のセットには、事前テストと事後テストのフックがあります。 setup() メソッドは各テスト ルーチンの前に始まり、teardown() メソッドはルーチンの後に始まります。

XNUMX 番目のメソッド セットはテストの実行を制御します。 どちらのメソッドもメッセージ文字列を入力として受け取り、進行中のテストをキャンセルします。 ただし、skiptest() メソッドは現在のテストを中止し、fail() メソッドは完全に失敗します。

最後の3番目のメソッドはテストの決定に役立ちます。メソッドid()はテストケースオブジェクトとテストルーチンの名前からなる文字列を返します。そしてメソッドshortDescription() は、各テスト ルーチンの開始時に docstr コメントを返します。

Python 単体テストの例

以下の例では、unittestモジュールを使用して単純なadd()関数をテストします。test_という接頭辞が付いたメソッドはすべて自動的に実行され、assertEqual関数が結果を期待値と比較します。

import unittest

def add(a, b):
    return a + b

class TestAdd(unittest.TestCase):
    def test_add_positive(self):
        self.assertEqual(add(2, 3), 5)

    def test_add_negative(self):
        self.assertEqual(add(-1, -1), -2)

if __name__ == "__main__":
    unittest.main()

コードを保存し、`python filename.py` で実行してください。ユニットテストランナーが、合格または失敗したテストの数を報告します。

使用のメリット Python 単体テスト

  • 開発サイクルの早い段階でバグを検出するのに役立ちます
  • より良いプログラムを書くのに役立ちます
  • 他のテスト方法やツールと簡単に同期できます
  • バグがかなり減るだろう
  • 将来の変更が容易になり、影響が非常に少なくなります

よくあるご質問

単体テストは、関数などの小さなコード単位を単独で検証するものです。開発の初期段階でバグを発見できるため、修正コストと手間を抑えることができます。

PyUnitは Pythonの組み込みユニットテストフレームワークで、unittestモジュールとして利用可能です。これは、 JUnit また、フィクスチャ、テストケース、テストスイート、およびテストランナーをサポートします。

unittest.TestCase をサブクラス化し、test_ で始まるメソッドを作成し、その中で assertEqual などのアサーションを使用してください。すべてのテストを実行するには、unittest.main() でファイルを実行します。

setUp() は各テストメソッドの実行前に実行され、フィクスチャを準備します。一方、tearDown() は各テストの実行後に実行され、後処理を行います。これら2つの関数により、テストの独立性と再現性が維持されます。

スタブはテストが依存する固定データを提供し、モックは検証対象となる偽のオブジェクトです。どちらも実際の依存関係を置き換えることで、ユニットを単独でテストできるようにします。

GitHub CopilotのようなAIアシスタントは、関数から単体テストケースを生成し、エッジケースやアサーションを提案し、コードを記述する際に依存関係のモックを作成します。

はい。AIを活用したツールを使えば、テストスイートの生成を自動化したり、期待される出力に対するアサーションを生成したり、テストされていないブランチにテストを提案することでコードカバレッジを向上させることができます。

単体テストは Pythonはクラスとassertメソッドを使用する組み込みフレームワークですが、pytestはよりシンプルなassert文と強力なフィクスチャを備えたサードパーティライブラリです。どちらも単体テストを実行します。