ホームページ >バックエンド開発 >Python チュートリアル >UnittestとPytestを使用したPythonユニットテストのガイド

UnittestとPytestを使用したPythonユニットテストのガイド

William Shakespeare
William Shakespeareオリジナル
2025-02-19 08:57:13830ブラウズ

A Guide to Python Unit Testing with unittest and pytest

この記事では、ソフトウェアテストの重要性と、なぜ注意を払う必要があるのか​​を調査します。ユニットテストの設計方法と、Python単体テストの作成方法を学びます。特に、Pythonで最も一般的に使用される単位テストフレームワークの2つであるUnittestとPytestを探索します。

キーポイント

    単体テストはソフトウェア開発の重要な部分であり、開発者がプロ​​グラムの特定のコンポーネントまたはユニットをテストして、予想どおりに実行できるようにします。 Pythonの一般的な単体テストフレームワークには、UnittestとPytestが含まれます。
  • よく設計されたユニットテストは、高速で、独立していて、繰り返し可能で、信頼性が高く、名前が付いている必要があります。 「準備、実行、アサーション(AAA)」モードは、多くの場合、セットアップ、実行、および検証の分離を整理するために使用されます。
  • 最小限のフレームワークは、Python標準ライブラリの一部であり、JavaのユニットテストフレームワークであるJunitに触発されています。特別なアサーション方法を使用しており、テストをUnittest.testcaseクラスから継承されたクラスの方法として記述する必要があります。
  • Pytest Frameworkにより、コードが少なくなる複雑なテストが可能になり、独立したテストスイートをサポートし、800を超える外部プラグインを提供します。 Unitestとは異なり、Pytestは通常のPythonアサーションメソッドを使用して、よりシンプルで直感的にします。
  • 単体テストには多くの利点がありますが、テストは欠陥の存在だけでなく、欠陥の欠如を証明できることを覚えておく必要があります。すべてのテストが合格しても、ソフトウェアシステムにエラーがないことを証明することはできません。

ソフトウェアテストの紹介

ソフトウェアテストは、ソフトウェア製品の動作をチェックして、仕様に準拠していることを評価および検証するプロセスです。ソフトウェア製品には、数千行のコードと、一緒に機能する数百のコンポーネントが含まれる場合があります。コードの行が正しく機能しない場合、エラーが伝播して他のエラーを引き起こす場合があります。したがって、プログラムが予想どおりに実行されるようにするには、テストする必要があります。

最新のソフトウェアは非常に複雑になる可能性があるため、正確性のさまざまな側面を評価するための複数のレベルのテストがあります。 ISTQB認定テストの基本レベルシラバスによると、ソフトウェアテストには4つのレベルがあります。

単位テスト:コードの特定の行をテスト
  1. 統合テスト:複数のユニット間の統合をテスト
  2. システムテスト:システム全体をテストします
  3. 受け入れテスト:ビジネス目標を満たしているかどうかを確認してください
  4. この記事では単体テストについて説明しますが、それに入る前に、ソフトウェアテストに重要な原則を紹介したいと思います。

テストは、欠陥の存在を証明するだけですが、欠陥の欠如を証明することはできません。

-

ISTQB CTFL SYLLABUS 2018 言い換えれば、実行するすべてのテストに障害が表示されない場合でも、ソフトウェアシステムにエラーがないことを証明しないか、別のテストケースがソフトウェアの動作に欠陥がないことを証明しません。

ユニットテストとは何ですか?

これは、コンポーネントテストとも呼ばれる最初のテストレベルです。このセクションでは、単一のソフトウェアコンポーネントがテストされています。プログラミング言語に応じて、ソフトウェアユニットはクラス、関数、またはメソッドです。たとえば、複数のメソッドと除算方法を含む算術使用と呼ばれるJavaクラスがある場合、Arithmeticoperationsクラスの単体テストは、マルチプリと除算の正しい動作をテストする必要があります。

単位テストは通常​​、ソフトウェアテスターに​​よって実行されます。ユニットテストを実行するには、ソフトウェアテスター(または開発者)がソースコードにアクセスする必要があります。ソースコード自体がテストされているオブジェクトであるためです。したがって、ソースコードを直接テストするこのソフトウェアテスト方法は、ホワイトボックステストと呼ばれます。

ソフトウェアテストを心配する必要があるのか​​、それが価値があるかどうか疑問に思うかもしれません。次のセクションでは、テストソフトウェアシステムの背後にある動機を分析します。

なぜユニットテストを実行する必要があります

ソフトウェアテストの主な利点は、ソフトウェアの品質を向上させることです。特に、ソフトウェアが日常活動であらゆる種類のものを処理する世界では、ソフトウェアの品質が非常に重要です。ソフトウェアの品質を改善することは、依然としてあいまいな目標です。ソフトウェアの品質と呼ばれるものをよりよく説明してみましょう。 ISO/IEC Standard 9126-1 ISO 9126によると、ソフトウェアの品質には次の要因が含まれています。

    信頼性
  • functional
  • 効率
  • 可用性
  • メンテナビリティ
  • 送話性
会社を所有している場合は、ビジネスに影響を与えるため、ソフトウェアテストアクティビティを慎重に検討する必要があります。たとえば、2022年5月、テスラは車両のインフォテインメントシステムの問題により130,000台の車を思い出しました。この問題は、「空中に」分散されたソフトウェアアップデートを介して解決されました。これらの失敗は、会社に時間とお金を引き起こし、顧客にしばらく車を使用することができなかったため、顧客に問題を引き起こしました。テストソフトウェアにはお金がかかりますが、企業は何百万もの技術サポートを節約することもできます。

単位テストでは、ソフトウェアが正しく実行されていることを確認することに焦点を当てています。つまり、入力と出力のマッピングが正しく行われていることを確認します。低レベルのテストアクティビティとして、単体テストはエラーを早期に特定するのに役立ち、ソフトウェアシステムのより高いレベルに伝播しません。

単体テストのその他の利点は次のとおりです

統合された統合:すべてのコンポーネントが独立して動作するようにすることで、統合の問題を解決する方が簡単です。
    コード回帰を最小化する:多数のテストケースでは、将来のソースコードの変更が問題を引き起こす場合、問題を見つける方が簡単です。
  • ドキュメントの提供:入力と出力の間の正しいマッピングをテストすることにより、ユニットテストは、テスト対象のメソッドまたはクラスの使用方法に関するドキュメントを提供します。
  • テスト戦略を設計

テスト戦略の設計方法を見てみましょう。

テストスコープの定義

テスト戦略の計画を開始する前に、答えるべき重要な質問があります。ソフトウェアシステムのどの部分をテストしますか?

これは重要な問題です。これは、徹底的なテストが不可能であるためです。したがって、可能なすべての入力と出力をテストすることはできませんが、関連するリスクに基づいてテストに優先順位を付ける必要があります。

テストの範囲を定義する際には、多くの要因を考慮する必要があります。

    リスク:エラーがこのコンポーネントに影響を与えると、どのようなビジネス結果が発生しますか?
  • 時間:ソフトウェア製品の準備をどのくらいしたいですか?締め切りはありますか?
  • 予算:テスト活動にどのくらいのお金を投資しますか?
テスト範囲を定義した後(テストするものとテストすべきではないものを指定します)、適切な単位テストに必要な機能について説明できます。

単体テストの機能

    速い。ユニットテストはほとんど自動的に実行されます。つまり、速くする必要があります。ゆっくりとしたユニットテストは、インスタントフィードバックを提供しないため、開発者がスキップする可能性が高くなります。
  • 独立。単体テストは、定義により独立しています。個々のコードユニットをテストし、外部要因(ファイルやネットワークリソースなど)に依存しません。
  • 繰り返し可能。ユニットテストは繰り返し実行され、結果は時間の経過とともに一貫している必要があります。
  • 信頼できます。ユニットテストは、テスト中のシステムにエラーがある場合にのみ失敗します。環境またはテストが実行される順序は重要ではありません。
  • 正しく名前が付けられています。テストの名前は、テスト自体に関する関連情報を提供する必要があります。
Pythonでユニットテストを掘り下げる前に、ステップがありません。テストを整理して、清潔で読みやすくするにはどうすればよいですか?準備、実行、およびアサーション(AAA)と呼ばれるパターンを使用します。

aaaモード

準備、実行、およびアサーション(AAA)パターンは、単体テストを作成および整理するための一般的な戦略です。次のように機能します:

    準備フェーズでは、テストに必要なすべてのオブジェクトと変数を設定します。
  • 次に、実行段階で、テストする関数/メソッド/クラスが呼び出されます。
  • 最後に、アサーションフェーズでは、テストの結果を検証します。
この戦略は、テストのすべての主要部分(セットアップ、実行、および検証)を分離することにより、単体テストを整理するクリーンな方法を提供します。さらに、ユニットテストはすべて同じ構造に従うため、読みやすくなります。

Pythonでの単位テスト:無部またはpytest?

Pythonの2つの異なる単体テストフレームワークについて説明します。これらの2つのフレームワークは、最小限であり、pytestです。

未熟なはじめに

Python Standard Libraryには、最も独立したユニットテストフレームワークが含まれています。このフレームワークは、JavaのユニットテストフレームワークであるJunitに触発されています。

公式文書に記載されているように、Unitestestはこの投稿で言及するいくつかの重要な概念をサポートしています。

テストケース、これはテストの単一単位です
  • テストスイート、これは一緒に実行されるテストケースのセットです
  • テストランナー。これは、すべてのテストケースの実行と結果を処理するコンポーネントである
  • Unittestには、テストを作成する独自の方法があります。特に、
が必要です
  1. unittest.testcaseクラスから継承するクラスの方法としてテストを書く
  2. 特別なアサーション方法
  3. を使用します

Unittestはすでにインストールされているため、最初のユニットテストを作成する準備が整いました!

Unittestを使用した単体テストの書き込み

BankAccountクラスがあると仮定します:

<code class="language-python">import unittest

class BankAccount:
  def __init__(self, id):
    self.id = id
    self.balance = 0

  def withdraw(self, amount):
    if self.balance >= amount:
      self.balance -= amount
      return True
    return False

  def deposit(self, amount):
    self.balance += amount
    return True</code>
利用可能な預金量を超えるお金を引き出すことはできません。そのため、ソースコードがこの状況を正しく処理しているかどうかをテストしましょう。

同じPythonファイルで、次のコードを追加できます。

Unittest.testcaseのサブクラスであるTestBankoperationsというクラスを作成しています。このようにして、新しいテストケースを作成しています。
<code class="language-python">class TestBankOperations(unittest.TestCase):
    def test_insufficient_deposit(self):
      # Arrange
      a = BankAccount(1)
      a.deposit(100)
      # Act
      outcome = a.withdraw(200)
      # Assert
      self.assertFalse(outcome)</code>
このクラスでは、メソッドがテストから始まる単一のテスト関数を定義します。これは、すべてのテスト方法が単語テストから開始する必要があるため重要です。

このテスト方法はfalseを返すと予想されます。つまり、操作に失敗しました。結果をアサートするために、AssertFalse()と呼ばれる特別なアサーション方法を使用します。

テストを実行する準備ができました。コマンドラインでこのコマンドを実行しましょう:

ここで、example.pyはすべてのソースコードを含むファイルの名前です。出力は次のようになります:

<code class="language-bash">python -m unittest example.py</code>

とても良い!これは、テストが成功したことを意味します。それでは、障害があるときに出力がどのように見えるか見てみましょう。前のクラスに新しいテストを追加します。負の量を預けようとしましょう。これは確かに不可能です。私たちのコードはこの状況を処理しますか?

<code>.
----------------------------------------------------------------------
Ran 1 test in 0.001s

OK</code>
これは私たちの新しいテスト方法です:

-Vフラグを使用して、このテストを実行するために、Unitestの詳細なモードを使用できます。

<code class="language-python">  def test_negative_deposit(self):
    # Arrange
    a = BankAccount(1)
    # Act
    outcome = a.deposit(-100)
    # Assert
    self.assertFalse(outcome)</code>
出力は今では異なります:

<code class="language-bash">python -m unittest -v example.py</code>
この場合、詳細なロゴはより多くの情報を提供します。 test_negative_depositが失敗することはわかっています。特に、AssertionErrorは、予想される結果は偽であるはずですが、Trueは偽ではないことを示しています。つまり、メソッドはtrueを返します。

適切なフレームワークは、私たちのニーズに応じてさまざまなアサーション方法を提供します:
<code>test_insufficient_deposit (example.TestBankOperations) ... ok
test_negative_deposit (example.TestBankOperations) ... FAIL

======================================================================
FAIL: test_negative_deposit (example.TestBankOperations)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "example.py", line 35, in test_negative_deposit
    self.assertFalse(outcome)
AssertionError: True is not false

----------------------------------------------------------------------
Ran 2 tests in 0.002s

FAILED (failures=1)</code>

Assertequal(x、y)、x == yがtrue

であるかどうかをテストします

assertraises(Exception_type)、特定の例外が提起されたかどうかを確認します
  • assertisnone(x)、xがnone
  • かどうかをテストします
  • assertin(x、y)、xがy
  • であるかどうかをテストします
  • 今度は、Unittest Frameworkを使用して単体テストを作成する方法を基本的に理解しているので、Pytestと呼ばれる別のPythonフレームワークを見てみましょう。
  • pytestの紹介

pytestフレームワークは、いくつかの関連する機能を備えたPythonユニットテストフレームワークです。

コードを少なくする複雑なテストを可能にします

は、最も適したテストスイートをサポートしています

    800を超える外部プラグインを提供しています
  • Pytestはデフォルトではインストールされていないため、最初にインストールする必要があります。 PytestにはPython 3.7が必要であることに注意してください。
  • pytest
  • をインストールします
Pytestのインストールは非常に簡単です。次のコマンドを実行する必要があります:

<code class="language-python">import unittest

class BankAccount:
  def __init__(self, id):
    self.id = id
    self.balance = 0

  def withdraw(self, amount):
    if self.balance >= amount:
      self.balance -= amount
      return True
    return False

  def deposit(self, amount):
    self.balance += amount
    return True</code>

次に、すべてが入力して正しくインストールされていることを確認してください:

<code class="language-python">class TestBankOperations(unittest.TestCase):
    def test_insufficient_deposit(self):
      # Arrange
      a = BankAccount(1)
      a.deposit(100)
      # Act
      outcome = a.withdraw(200)
      # Assert
      self.assertFalse(outcome)</code>

出力は次のようになります

<code class="language-bash">python -m unittest example.py</code>
とても良い! Pytestを使用して最初のテストを書きましょう。

pytestを使用した単体テストの書き込み

以前に書いたBankaccountクラスを使用し、以前と同じ方法をテストします。このようにして、これら2つのフレームワークを使用してテストを作成するために必要な努力を比較する方が簡単です。

テストにpytestを使用するには、

が必要です

    ディレクトリを作成し、テストファイルを入力します。
  • test_または_test.pyで終了するという名前のファイルでテストを作成します。 Pytestは、現在のディレクトリとそのサブディレクトリ内のこれらのファイルを探します。
したがって、test_bank.pyという名前のファイルを作成し、フォルダーに入れます。これは私たちの最初のテスト関数がどのように見えるかです:

<code>.
----------------------------------------------------------------------
Ran 1 test in 0.001s

OK</code>
ご存知のように、最小限のバージョンと比較して唯一の変更はアサートパーツです。ここでは、通常のPythonアサーション法を使用します。

今、test_bank.pyファイルを見ることができます:

このテストを実行するには、test_bank.pyファイルを含むフォルダーにコマンドプロンプトを開いてみましょう。次に、次のコマンドを実行します
<code class="language-python">  def test_negative_deposit(self):
    # Arrange
    a = BankAccount(1)
    # Act
    outcome = a.deposit(-100)
    # Assert
    self.assertFalse(outcome)</code>

出力は次のようになります:

<code class="language-bash">python -m unittest -v example.py</code>
この場合、テストを作成して実行するのがどれほど簡単かを確認できます。さらに、UNITSTよりも少ないコードを書くことがわかります。テストの結果も理解しやすいです。

失敗したテストを見てみましょう!
<code>test_insufficient_deposit (example.TestBankOperations) ... ok
test_negative_deposit (example.TestBankOperations) ... FAIL

======================================================================
FAIL: test_negative_deposit (example.TestBankOperations)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "example.py", line 35, in test_negative_deposit
    self.assertFalse(outcome)
AssertionError: True is not false

----------------------------------------------------------------------
Ran 2 tests in 0.002s

FAILED (failures=1)</code>

以前に書いた2番目の方法を使用します。これはtest_negative_depositと呼ばれます。アサートパーツを参照し、結果は次のとおりです。

以前のようにテストを実行しますが、これは出力です。

出力を解析することにより、収集された2つのアイテムを読み取ることができます。つまり、2つのテストが実行されました。下にスクロールすると、test_negative_depositメソッドのテスト中にエラーが発生したことがわかります。特に、アサーションを評価するときにエラーが発生します。さらに、レポートは、結果変数の値が真であると述べています。つまり、堆積方法にエラーが含まれていることを意味します。

<code class="language-bash">pip install -U pytest</code>
PytestはデフォルトのPythonアサーションキーワードを使用するため、到達する出力を、期待される結果を保存する別の変数と比較できます。これにはすべて、特別なアサーション方法は必要ありません。

<code class="language-bash">pytest --version</code>
結論

この記事では、ソフトウェアテストの基本を紹介します。ソフトウェアテストが重要である理由と、誰もがコードをテストする必要がある理由を発見しました。ユニットテストと、Pythonでの簡単な単位テストを設計および実装する方法について説明します。

UnittestとPytestと呼ばれる2つのPythonフレームワークを使用します。どちらも有用な機能を備えており、Pythonユニットテストで最も一般的に使用されるフレームワークの2つです。

最後に、準備、実行、およびアサーションパターンでテストを作成する方法についてのアイデアを提供する2つの基本的なテストケースが表示されます。

ソフトウェアテストの重要性をあなたに納得させてくれることを願っています。 UnitestやPytestなどのフレームワークを選択し、テストを開始します。追加の努力は価値があるからです。

この記事が気に入っている場合は、次のものも有用であることがあります。

    サイプレステスト:Webアプリケーションの実行ガイド
  • jest
  • で反応成分をテストする方法
  • 操り人形師でエンドツーエンドのテストを学びます
  • ハンズフリーを継続的にテストする3つの方法
  • 再導入ジェンキンス:自動テストにパイプを使用
  • Python単体テストに関するFAQ

Pythonのユニットテストは何ですか? Pythonでのユニットテストは、プログラムの単一のユニットまたはコンポーネントが分離され、各ユニットが期待どおりに機能するように分離されたソフトウェアテスト手法です。 なぜPython開発においてユニットテストが重要なのですか?ユニットテストは、Pythonプログラム内の個々のコンポーネントの正確性を確保するのに役立ちます。エラーを早期に検出し、コードの変更に安全なネットを提供し、コードの保守性をサポートするのに役立ちます。

Pythonでユニットテストを書く方法は? Pythonのユニットテストは、多くの場合、組み込みのUnitestモジュールを使用して記述されます。これらのクラスでunittest.testcaseから継承されたテストクラスを作成し、テスト方法を作成します。テスト方法は通常、「テスト」から始まります。

最新のもの以外に、Pythonユニットテストに他のどのフレームワークを使用できますか?はい、UnitStestに加えて、PytestやNose2などの他の一般的なPythonテストフレームワークがあります。これらのフレームワークは、さまざまな機能と構文を提供するため、開発者はニーズに最適な機能を選択できます。

Pythonユニットテストにおけるフィクスチャの役割は何ですか?フィクスチャは、Pythonで前提条件を設定し、テスト後にクリーンアップする方法です。テストが独立しており、独立して実行できることを確認します。

テストカバレッジとは何ですか?なぜそれが重要なのですか?テストカバレッジは、テストが実行されるコードベースの割合を測定します。テストされていないコードを識別するのに役立ち、テストが包括的であることを保証し、エラーが発見される可能性を減らします。

Pythonで効果的なユニットテストを作成するためのベストプラクティスは何ですか?はい、いくつかのベストプラクティスには、独立した孤立したテストの作成、記述テスト方法名の使用、境界の状況のテストが含まれます。さらに、優れたテストカバレッジを取得し、頻繁にテストを実行してみてください。

以上がUnittestとPytestを使用したPythonユニットテストのガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。