UnittestとPytestを使用したPythonユニットテストのガイド
キーポイント
- 単体テストはソフトウェア開発の重要な部分であり、開発者がプログラムの特定のコンポーネントまたはユニットをテストして、予想どおりに実行できるようにします。 Pythonの一般的な単体テストフレームワークには、UnittestとPytestが含まれます。
- よく設計されたユニットテストは、高速で、独立していて、繰り返し可能で、信頼性が高く、名前が付いている必要があります。 「準備、実行、アサーション(AAA)」モードは、多くの場合、セットアップ、実行、および検証の分離を整理するために使用されます。
- 最小限のフレームワークは、Python標準ライブラリの一部であり、JavaのユニットテストフレームワークであるJunitに触発されています。特別なアサーション方法を使用しており、テストをUnittest.testcaseクラスから継承されたクラスの方法として記述する必要があります。
- Pytest Frameworkにより、コードが少なくなる複雑なテストが可能になり、独立したテストスイートをサポートし、800を超える外部プラグインを提供します。 Unitestとは異なり、Pytestは通常のPythonアサーションメソッドを使用して、よりシンプルで直感的にします。
- 単体テストには多くの利点がありますが、テストは欠陥の存在だけでなく、欠陥の欠如を証明できることを覚えておく必要があります。すべてのテストが合格しても、ソフトウェアシステムにエラーがないことを証明することはできません。
ソフトウェアテストの紹介
ソフトウェアテストは、ソフトウェア製品の動作をチェックして、仕様に準拠していることを評価および検証するプロセスです。ソフトウェア製品には、数千行のコードと、一緒に機能する数百のコンポーネントが含まれる場合があります。コードの行が正しく機能しない場合、エラーが伝播して他のエラーを引き起こす場合があります。したがって、プログラムが予想どおりに実行されるようにするには、テストする必要があります。最新のソフトウェアは非常に複雑になる可能性があるため、正確性のさまざまな側面を評価するための複数のレベルのテストがあります。 ISTQB認定テストの基本レベルシラバスによると、ソフトウェアテストには4つのレベルがあります。
単位テスト:コードの特定の行をテスト
- 統合テスト:複数のユニット間の統合をテスト
- システムテスト:システム全体をテストします
- 受け入れテスト:ビジネス目標を満たしているかどうかを確認してください
- この記事では単体テストについて説明しますが、それに入る前に、ソフトウェアテストに重要な原則を紹介したいと思います。
テストは、欠陥の存在を証明するだけですが、欠陥の欠如を証明することはできません。
-
ISTQB CTFL SYLLABUS 2018 言い換えれば、実行するすべてのテストに障害が表示されない場合でも、ソフトウェアシステムにエラーがないことを証明しないか、別のテストケースがソフトウェアの動作に欠陥がないことを証明しません。ユニットテストとは何ですか?
これは、コンポーネントテストとも呼ばれる最初のテストレベルです。このセクションでは、単一のソフトウェアコンポーネントがテストされています。プログラミング言語に応じて、ソフトウェアユニットはクラス、関数、またはメソッドです。たとえば、複数のメソッドと除算方法を含む算術使用と呼ばれるJavaクラスがある場合、Arithmeticoperationsクラスの単体テストは、マルチプリと除算の正しい動作をテストする必要があります。
単位テストは通常、ソフトウェアテスターによって実行されます。ユニットテストを実行するには、ソフトウェアテスター(または開発者)がソースコードにアクセスする必要があります。ソースコード自体がテストされているオブジェクトであるためです。したがって、ソースコードを直接テストするこのソフトウェアテスト方法は、ホワイトボックステストと呼ばれます。
ソフトウェアテストを心配する必要があるのか、それが価値があるかどうか疑問に思うかもしれません。次のセクションでは、テストソフトウェアシステムの背後にある動機を分析します。
なぜユニットテストを実行する必要があります
ソフトウェアテストの主な利点は、ソフトウェアの品質を向上させることです。特に、ソフトウェアが日常活動であらゆる種類のものを処理する世界では、ソフトウェアの品質が非常に重要です。ソフトウェアの品質を改善することは、依然としてあいまいな目標です。ソフトウェアの品質と呼ばれるものをよりよく説明してみましょう。 ISO/IEC Standard 9126-1 ISO 9126によると、ソフトウェアの品質には次の要因が含まれています。
信頼性
会社を所有している場合は、ビジネスに影響を与えるため、ソフトウェアテストアクティビティを慎重に検討する必要があります。たとえば、2022年5月、テスラは車両のインフォテインメントシステムの問題により130,000台の車を思い出しました。この問題は、「空中に」分散されたソフトウェアアップデートを介して解決されました。これらの失敗は、会社に時間とお金を引き起こし、顧客にしばらく車を使用することができなかったため、顧客に問題を引き起こしました。テストソフトウェアにはお金がかかりますが、企業は何百万もの技術サポートを節約することもできます。- functional
- 効率
- 可用性
- メンテナビリティ
- 送話性
単位テストでは、ソフトウェアが正しく実行されていることを確認することに焦点を当てています。つまり、入力と出力のマッピングが正しく行われていることを確認します。低レベルのテストアクティビティとして、単体テストはエラーを早期に特定するのに役立ち、ソフトウェアシステムのより高いレベルに伝播しません。
単体テストのその他の利点は次のとおりです
統合された統合:すべてのコンポーネントが独立して動作するようにすることで、統合の問題を解決する方が簡単です。
コード回帰を最小化する:多数のテストケースでは、将来のソースコードの変更が問題を引き起こす場合、問題を見つける方が簡単です。
- ドキュメントの提供:入力と出力の間の正しいマッピングをテストすることにより、ユニットテストは、テスト対象のメソッドまたはクラスの使用方法に関するドキュメントを提供します。
- テスト戦略を設計
テスト戦略の設計方法を見てみましょう。
テストスコープの定義テスト戦略の計画を開始する前に、答えるべき重要な質問があります。ソフトウェアシステムのどの部分をテストしますか?
これは重要な問題です。これは、徹底的なテストが不可能であるためです。したがって、可能なすべての入力と出力をテストすることはできませんが、関連するリスクに基づいてテストに優先順位を付ける必要があります。
テストの範囲を定義する際には、多くの要因を考慮する必要があります。
リスク:エラーがこのコンポーネントに影響を与えると、どのようなビジネス結果が発生しますか?
テスト範囲を定義した後(テストするものとテストすべきではないものを指定します)、適切な単位テストに必要な機能について説明できます。- 時間:ソフトウェア製品の準備をどのくらいしたいですか?締め切りはありますか?
- 予算:テスト活動にどのくらいのお金を投資しますか?
単体テストの機能
速い。ユニットテストはほとんど自動的に実行されます。つまり、速くする必要があります。ゆっくりとしたユニットテストは、インスタントフィードバックを提供しないため、開発者がスキップする可能性が高くなります。
Pythonでユニットテストを掘り下げる前に、ステップがありません。テストを整理して、清潔で読みやすくするにはどうすればよいですか?準備、実行、およびアサーション(AAA)と呼ばれるパターンを使用します。- 独立。単体テストは、定義により独立しています。個々のコードユニットをテストし、外部要因(ファイルやネットワークリソースなど)に依存しません。
- 繰り返し可能。ユニットテストは繰り返し実行され、結果は時間の経過とともに一貫している必要があります。
- 信頼できます。ユニットテストは、テスト中のシステムにエラーがある場合にのみ失敗します。環境またはテストが実行される順序は重要ではありません。
- 正しく名前が付けられています。テストの名前は、テスト自体に関する関連情報を提供する必要があります。
aaaモード
準備、実行、およびアサーション(AAA)パターンは、単体テストを作成および整理するための一般的な戦略です。次のように機能します:
準備フェーズでは、テストに必要なすべてのオブジェクトと変数を設定します。
この戦略は、テストのすべての主要部分(セットアップ、実行、および検証)を分離することにより、単体テストを整理するクリーンな方法を提供します。さらに、ユニットテストはすべて同じ構造に従うため、読みやすくなります。- 次に、実行段階で、テストする関数/メソッド/クラスが呼び出されます。
- 最後に、アサーションフェーズでは、テストの結果を検証します。
Pythonでの単位テスト:無部またはpytest?
Pythonの2つの異なる単体テストフレームワークについて説明します。これらの2つのフレームワークは、最小限であり、pytestです。未熟なはじめに
Python Standard Libraryには、最も独立したユニットテストフレームワークが含まれています。このフレームワークは、JavaのユニットテストフレームワークであるJunitに触発されています。
公式文書に記載されているように、Unitestestはこの投稿で言及するいくつかの重要な概念をサポートしています。
テストケース、これはテストの単一単位です
が必要です
- テストスイート、これは一緒に実行されるテストケースのセットです
- テストランナー。これは、すべてのテストケースの実行と結果を処理するコンポーネントである
- Unittestには、テストを作成する独自の方法があります。特に、
- unittest.testcaseクラスから継承するクラスの方法としてテストを書く
- 特別なアサーション方法
を使用しますUnittestはすでにインストールされているため、最初のユニットテストを作成する準備が整いました!
Unittestを使用した単体テストの書き込みBankAccountクラスがあると仮定します:
利用可能な預金量を超えるお金を引き出すことはできません。そのため、ソースコードがこの状況を正しく処理しているかどうかをテストしましょう。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ログイン後にコピーログイン後にコピー同じPythonファイルで、次のコードを追加できます。
Unittest.testcaseのサブクラスであるTestBankoperationsというクラスを作成しています。このようにして、新しいテストケースを作成しています。
このクラスでは、メソッドがテストから始まる単一のテスト関数を定義します。これは、すべてのテスト方法が単語テストから開始する必要があるため重要です。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)ログイン後にコピーログイン後にコピーこのテスト方法はfalseを返すと予想されます。つまり、操作に失敗しました。結果をアサートするために、AssertFalse()と呼ばれる特別なアサーション方法を使用します。
テストを実行する準備ができました。コマンドラインでこのコマンドを実行しましょう:
ここで、example.pyはすべてのソースコードを含むファイルの名前です。出力は次のようになります:
python -m unittest example.pyログイン後にコピーログイン後にコピーとても良い!これは、テストが成功したことを意味します。それでは、障害があるときに出力がどのように見えるか見てみましょう。前のクラスに新しいテストを追加します。負の量を預けようとしましょう。これは確かに不可能です。私たちのコードはこの状況を処理しますか?
これは私たちの新しいテスト方法です:<code>. ---------------------------------------------------------------------- Ran 1 test in 0.001s OK</code>ログイン後にコピーログイン後にコピー
-Vフラグを使用して、このテストを実行するために、Unitestの詳細なモードを使用できます。
出力は今では異なります:def test_negative_deposit(self): # Arrange a = BankAccount(1) # Act outcome = a.deposit(-100) # Assert self.assertFalse(outcome)ログイン後にコピーログイン後にコピー
この場合、詳細なロゴはより多くの情報を提供します。 test_negative_depositが失敗することはわかっています。特に、AssertionErrorは、予想される結果は偽であるはずですが、Trueは偽ではないことを示しています。つまり、メソッドはtrueを返します。python -m unittest -v example.pyログイン後にコピーログイン後にコピー適切なフレームワークは、私たちのニーズに応じてさまざまなアサーション方法を提供します:
<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はデフォルトではインストールされていないため、最初にインストールする必要があります。 PytestにはPython 3.7が必要であることに注意してください。
- pytest
をインストールします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ログイン後にコピーログイン後にコピー次に、すべてが入力して正しくインストールされていることを確認してください:
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)ログイン後にコピーログイン後にコピー出力は次のようになります
とても良い! Pytestを使用して最初のテストを書きましょう。python -m unittest example.pyログイン後にコピーログイン後にコピーpytestを使用した単体テストの書き込み
以前に書いたBankaccountクラスを使用し、以前と同じ方法をテストします。このようにして、これら2つのフレームワークを使用してテストを作成するために必要な努力を比較する方が簡単です。
テストにpytestを使用するには、
が必要です
ディレクトリを作成し、テストファイルを入力します。
したがって、test_bank.pyという名前のファイルを作成し、フォルダーに入れます。これは私たちの最初のテスト関数がどのように見えるかです:- test_または_test.pyで終了するという名前のファイルでテストを作成します。 Pytestは、現在のディレクトリとそのサブディレクトリ内のこれらのファイルを探します。
ご存知のように、最小限のバージョンと比較して唯一の変更はアサートパーツです。ここでは、通常のPythonアサーション法を使用します。<code>. ---------------------------------------------------------------------- Ran 1 test in 0.001s OK</code>ログイン後にコピーログイン後にコピー今、test_bank.pyファイルを見ることができます:
このテストを実行するには、test_bank.pyファイルを含むフォルダーにコマンドプロンプトを開いてみましょう。次に、次のコマンドを実行します
def test_negative_deposit(self): # Arrange a = BankAccount(1) # Act outcome = a.deposit(-100) # Assert self.assertFalse(outcome)ログイン後にコピーログイン後にコピー出力は次のようになります:
この場合、テストを作成して実行するのがどれほど簡単かを確認できます。さらに、UNITSTよりも少ないコードを書くことがわかります。テストの結果も理解しやすいです。python -m unittest -v example.pyログイン後にコピーログイン後にコピー失敗したテストを見てみましょう!
<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メソッドのテスト中にエラーが発生したことがわかります。特に、アサーションを評価するときにエラーが発生します。さらに、レポートは、結果変数の値が真であると述べています。つまり、堆積方法にエラーが含まれていることを意味します。
PytestはデフォルトのPythonアサーションキーワードを使用するため、到達する出力を、期待される結果を保存する別の変数と比較できます。これにはすべて、特別なアサーション方法は必要ありません。pip install -U pytestログイン後にコピー
結論 この記事では、ソフトウェアテストの基本を紹介します。ソフトウェアテストが重要である理由と、誰もがコードをテストする必要がある理由を発見しました。ユニットテストと、Pythonでの簡単な単位テストを設計および実装する方法について説明します。pytest --versionログイン後にコピー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 サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











fiddlereveryversings for the-middleの測定値を使用するときに検出されないようにする方法

10時間以内にコンピューター初心者プログラミングの基本を教える方法は?コンピューター初心者にプログラミングの知識を教えるのに10時間しかない場合、何を教えることを選びますか...

Pythonasyncioについて...

Investing.comの反クラウリング戦略を理解する多くの人々は、Investing.com(https://cn.investing.com/news/latest-news)からのニュースデータをクロールしようとします。

Python 3.6のピクルスファイルの読み込みエラー:modulenotfounderror:nomodulenamed ...

SCAPYクローラーを使用するときにパイプラインファイルを作成できない理由についての議論は、SCAPYクローラーを学習して永続的なデータストレージに使用するときに、パイプラインファイルに遭遇する可能性があります...
