単体テストでは、小さなコード (関数やクラスなど) をチェックして、それらが正しく動作することを確認します。で パイソン これは、標準ライブラリに組み込まれ、xUnit スタイルに従っているunittest フレームワークを使用して行われます。 Unittest モジュールは、次の理由から広く使用されています。
- セットアップは必要ありません: Python がプリインストールされています。
- 構造化: テスト ケース フィクスチャ アサーションとテスト スイートをサポートします。
- 自動化: プロジェクト全体でテストを検出して実行できます。
- 安定性と多用途性: 他のツールに簡単に統合できるため、あらゆる規模のプロジェクトに信頼性があります。
このため、unittest は、Python で体系的な自動テストを作成するための信頼できる選択肢になります。
キャットティンプ
Unittest フレームワークの Assert メソッド
単体テスト には、値の型と変数の存在をアサートするメソッドが多数あります。 アサーションを記述するために一般的に使用されるメソッドの一部を以下に示します。
方法 | 説明 |
|---|---|
.assertEqual(a b) | 式 a == b と同様に、a が b に等しいかどうかを確認します。 |
.assertTrue(x) | x のブール値が True であることを、bool(x) が True であることと同等であることをアサートします。 |
.assertIsInstance(a b) | 式 isinstance(a b) と同様に、a がクラス b のインスタンスであることをアサートします。 ゴヴィンダ |
.assertIsNone(x) | 式「x は None」と同様に、x が None であることを確認します。 |
.assertFalse(x) | bool(x) が False であるのと同様に、x のブール値が False であることをアサートします。 |
.assertIs(a b) | 「a は b」という式と同様に、a が b と同一であるかどうかを検証します。 キツネ対オオカミ |
.assertIn(a b) | a が b の式 a と同様に b のメンバーであるかどうかを確認します。 |
Unittest フレームワークでサポートされる OOP の概念
ホワイト ボックス テスト方法は単体テストに使用されます。以下は、Unitttest フレームワークによってサポートされている oops の概念の一部です。
- テスト治具: テスト フィクスチャは、テストを実行するためのベースラインとして使用され、テストが実行される固定環境が存在し、結果が再現可能であることを確認します。 例: 一時データベースを作成するか、サーバープロセスを開始します。
- テストケース: テスト ケースは、テスト対象のシステムが正しく動作するかどうかを判断するために使用される一連の条件です。
- テストスイート: テスト スイートは、ソフトウェア プログラムをテストするために使用されるテストケースのコレクションであり、集約されたテストを一緒に実行することによって、ソフトウェア プログラムが特定の動作セットを持つことを示します。
- テストランナー: テスト ランナーは、テストの実行を設定し、結果をユーザーに提供するコンポーネントです。
Python 単体テストの例
例 1: 2 つの数値の合計を返す単純な関数 add() を作成します。 Unittest フレームワークを使用して、テスト ケース クラス TestAddFunction を作成し、この関数のさまざまなシナリオを検証します。
Python#test.py import unittest def add(a b): return a + b class TestAddFunction(unittest.TestCase): def test_add_positive_numbers(self): self.assertEqual(add(1 2) 3) def test_add_negative_numbers(self): self.assertEqual(add(-1 -2) -3) def test_add_mixed_numbers(self): self.assertEqual(add(1 -2) -1) self.assertEqual(add(-1 2) 1) if __name__ == '__main__': unittest.main()
単体テストを実行するには、ターミナルで次のコマンドを実行します。
Pythonのテスト.py
出力
...
----------------------------------------------------------------------
0.001秒で3つのテストを実行
わかりましたmysqlカウント
テストが失敗した場合 (期待値が変更されたなど)、出力には失敗したテストが表示されます。
..F
===================================================================================
失敗: test_add_positive_numbers (__main__.TestAddFunction)
----------------------------------------------------------------------
トレースバック (最後の呼び出し):
ファイル「f:GeeksforGeeksexample_packagemain.py」test_add_positive_numbers の 8 行目
self.assertEqual(add(1 2) 2)
アサーションエラー: 3 != 2
0.001秒で3つのテストを実行
失敗 (失敗=1)
詳細な結果を得るには、-v オプションを使用します。
Python test.py -v
出力
test_add_mixed_numbers (__main__.TestAddFunction) ... OK
test_add_negative_numbers (__main__.TestAddFunction) ... OK
test_add_positive_numbers (__main__.TestAddFunction) ... OK
0.002 秒で 3 つのテストを実行
わかりました
単体テストで得られる結果
- わかりました -> すべてのテストに合格しました。
- 失敗 -> アサーションのテストが失敗しました (AssertionError)。
- エラー -> テストで予期しない例外が発生しました。
例 2: この例では、unittest フレームワークを使用してさまざまな文字列操作をテストする方法を示します。テスト ケース クラス TestStringMethods には、文字列のプロパティと動作を検証するための複数のテストが含まれています。
Pythonimport unittest class TestStringMethods(unittest.TestCase): def setUp(self): pass # Returns True if the string contains 4 a. def test_strings_a(self): self.assertEqual('a'*4 'aaaa') # Returns True if the string is in upper case. def test_upper(self): self.assertEqual('foo'.upper() 'FOO') def test_isupper(self): self.assertTrue('FOO'.isupper()) self.assertFalse('Foo'.isupper()) def test_strip(self): s = 'geeksforgeeks' self.assertEqual(s.strip('geek') 'sforgeeks') # Returns true if the string splits and matches # the given output. def test_split(self): s = 'hello world' self.assertEqual(s.split() ['hello' 'world']) with self.assertRaises(TypeError): s.split(2) if __name__ == '__main__': unittest.main()
出力
……
----------------------------------------------------------------------
0.000秒以内に5つのテストを実行
わかりました反応テーブル
説明:
- assertEqual(): 結果が期待値と等しいかどうかをチェックします。
- assertTrue() /assertFalse(): 条件が True か False かを検証します。
- assertRaises(): 特定の例外が発生したことを確認します。
- test_strings_a(): 文字の乗算を検証します。
- test_upper(): 文字列の大文字への変換をチェックします。
- test_isupper(): 文字列の大文字プロパティをチェックします。
- テストストリップ(): 指定された文字が文字列から確実に削除されます。
- test_split(): 文字列の分割をチェックし、無効な入力について TypeError を検証します。
- ユニットテスト.メイン(): すべてのテストを実行し、コマンドライン インターフェイスを提供します。