優れた開発者は、徹底的なテストを行わずにコードをデプロイすることはできません。単体テストは、大規模なプログラムの個々のモジュールをテストするプロセスです。
この記事では、Python 単体テスト モジュールを使用してコードの単体テストを実行する方法について説明します。まず、テストの種類について理解しましょう。
テストには、手動テストと自動テストがあります。手動テストとは、開発完了後に人間が手動でテストを行うテスト手法です。自動テストは、プログラムが自動的にテストを実行し、結果を提供するテスト手法です。
手動テストは時間がかかり、実行が難しいことは理解できたはずです。したがって、開発者はテスト (自動テスト) を実行するためのコードを作成します。自動テストにはさまざまな種類のテストがあります。その中には、単体テスト、統合テスト、エンドツーエンド テスト、ストレス テストなどがあります。
標準的なテストの流れを見てみましょう。
- コードを作成または更新します。
- コードのさまざまなケースに応じてテストを作成または更新します。
- テストを実行します (手動またはテスト ランナーを使用)。
- テスト結果を参照してください。エラーがある場合は、修正して手順を繰り返します。
ここでは、単体テストと呼ばれる最も重要かつ基本的なテストの種類について説明します。早速、実際のチュートリアルを見ていきましょう。
単体テストとは何ですか?
単体テストは、独立したコードの小さなブロックをテストする手法です。小さなブロックのコードは、ほとんどの場合関数になります。独立という言葉は、プロジェクト内の他のコードに依存しないことを意味します。
文字列が「」と等しいかどうかを確認する必要があるとします。そのために、引数を 1 つ受け取り、それが「」と等しいかどうかを返す関数を作成しました。
def is_equal_to_(string):
return string == ""
上記の関数は他のコードとの依存関係がありません。したがって、さまざまな入力を与えることで独立してテストできます。独立したコード部分はプロジェクト全体で使用できます。
単体テストの重要性
一般に、独立したブロックのコードはプロジェクト全体で使用できます。したがって、適切に記述してテストする必要があります。単体テストは、このようなタイプの独立したコード ブロックをテストするために使用されるテストです。プロジェクトで単体テストを使用しない場合はどうなりますか?
プロジェクト全体で使用されるコードの小さなブロックをテストしなかったと仮定します。他の小さなコード ブロックを使用する、統合テストやエンドツーエンド テストなどの他のすべてのテストは失敗する可能性があります。これによりアプリケーションが中断されます。そのため、コードの基本構成要素は十分にテストする必要があります。
これで、すべての独立したコード ブロックに対する単体テストと作成された単体テストの重要性がわかりました。単体テストを実行しているため、統合テストやエンドツーエンド テストなどの他のテストは、コードの独立したブロックが原因で失敗することはありません。
次のセクションでは、Python 単体テスト モジュールとは何か、および単体テスト モジュールを使用して Python で単体テストを作成する方法について説明します。
注: Python のクラスやモジュールなどに精通していることを前提としています。クラスやモジュールなどの Python の中級概念に精通していない場合は、以降のセクションを理解するのが難しいかもしれません。
Python単体テストとは何ですか?
Python Unittest は、Python コードをテストするための組み込みのテスト フレームワークです。テスト ランナーが備わっているため、手間をかけずにテストを実行できます。したがって、サードパーティのモジュールを使用せずに、組み込みのUnittestモジュールをテストに使用できます。ただし、要件に応じて変更されます。組み込みのUnittestモジュールは、Python でテストを始めるのに適しています。
Unittest モジュールを使用して Python コードをテストするには、次の手順に従う必要があります。
#1.コードを書きます。
#2. unittest
モジュールをインポートします。
#3.キーワードtest
で始まるファイルを作成します。たとえばtest_prime.py
。キーワードtest は、テスト ファイルを識別するために使用されます。
#4.クラスunittest.TestCase
を拡張するクラスを作成します。
#5.クラス内にメソッド(テスト)を記述します。各メソッドには、要件に基づいた異なるテスト ケースが含まれています。メソッドにはtest
キーワードで始まる名前を付ける必要があります。
#6.テストを実行します。テストはさまざまな方法で実行できます。
- コマンド
python -m unittest test_filename.py
を実行します。 - コマンド
python test_filename.py
を使用して、一般的な Python ファイルと同様にテスト ファイルを実行します。このメソッドを機能させるには、テスト ファイルでunittest
のmain
メソッドを呼び出す必要があります。 - 最後に、
discover
使用します。テストのファイル名を指定せずに、コマンドpython -m unittest discover
を使用してテストを自動実行できます。従った命名規則を使用してテストが検索されます。したがって、開始時にキーワードtest
を使用してテスト ファイルに名前を付ける必要があります。
一般に、テストでは、コードの出力と予想される出力を比較します。したがって、出力を比較するために、 unittest にはさまざまなメソッドが用意されています。比較関数のリストはここにあります。
難しいことはなく、簡単に理解することができます。彼らは単純です。
それはたくさんの理論です。ここでコーディングに入る必要があります。
注: unittest モジュールについて質問がある場合は、 ドキュメントを参照して疑問を解消してください。早速、unittest モジュールを使用してみましょう。
Python での単体テスト (unittest を使用)
最初にいくつかの関数を作成してから、テストの作成に集中します。まず、お気に入りのコード エディターでフォルダーを開きます。そして、 utils.py
というファイルを作成します。次のコードをファイルに貼り付けます。
import math
def is_prime(n):
if n < 0:
return 'Negative numbers are not allowed'
if n <= 1:
return False
if n == 2:
return True
if n % 2 == 0:
return False
for i in range(2, int(math.sqrt(n)) + 1):
if n % i == 0:
return False
return True
def cubic(a):
return a * a * a
def say_hello(name):
return "Hello, " + name
utils.py
ファイルには 3 つの異なる関数があります。ここで、異なるテスト ケースで各関数をテストする必要があります。最初の関数is_prime
のテストを書いてみましょう。
#1. test_utils.py
というファイルをサンプル フォルダーにutils.py
として作成します。
#2. utils
およびunittest
モジュールをインポートします。
#3. unittest.TestCase
クラスを拡張してTestUtils
という名前のクラスを作成します。クラス名は何でも構いません。クラスに意味のある名前を付けるようにしてください。
#4.クラス内に、引数としてself
を受け入れるtest_is_prime
というメソッドを作成します。
#5. is_prime
に引数を指定してさまざまなテスト ケースを作成し、その出力を予想される出力と比較します。
#6.テストケースの例self.assertFalse(utils.is_prime(1))
。
#7。上記の場合、 is_prime(1)
の出力が false になることが予想されます。
#8.上記の場合と同様に、テストする機能に基づいて異なるテスト ケースを作成します。
テストを見てみましょう。
import unittest
import utils
class TestUtils(unittest.TestCase):
def test_is_prime(self):
self.assertFalse(utils.is_prime(4))
self.assertTrue(utils.is_prime(2))
self.assertTrue(utils.is_prime(3))
self.assertFalse(utils.is_prime(8))
self.assertFalse(utils.is_prime(10))
self.assertTrue(utils.is_prime(7))
self.assertEqual(utils.is_prime(-3),
"Negative numbers are not allowed")
if __name__ == '__main__':
unittest.main()
python filename.py
コマンドを使用してテストを実行するために、 unittest
のmain
メソッドを呼び出しています。次に、テストを実行します。
以下のような出力が表示されます。
$ python test_utils.py
.
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK
次に、他の関数のテスト ケースも作成してみます。関数のさまざまなケースを考えて、それらのテストを作成します。上記のクラスに追加された次のテストを見てください。
...
class TestUtils(unittest.TestCase):
def test_is_prime(self):
...
def test_cubic(self):
self.assertEqual(utils.cubic(2), 8)
self.assertEqual(utils.cubic(-2), -8)
self.assertNotEqual(utils.cubic(2), 4)
self.assertNotEqual(utils.cubic(-3), 27)
def test_say_hello(self):
self.assertEqual(utils.say_hello(""), "Hello, ")
self.assertEqual(utils.say_hello("Chandan"), "Hello, Chandan")
self.assertNotEqual(utils.say_hello("Chandan"), "Hi, Chandan")
self.assertNotEqual(utils.say_hello("Hafeez"), "Hi, Hafeez")
...
ここでは、 unittest
モジュールの比較関数の一部のみを使用しました。完全なリストはここで見つけることができます。
Unittest モジュールを使用して単体テストを作成する方法を学習しました。ここで、テストを実行するさまざまな方法を見てみましょう。
Unittest を使用してテストを実行する方法
テスト ケースを実行する方法については、上のセクションですでに説明しました。 Unittest モジュールを使用してテストを実行する他の 2 つの方法を見てみましょう。
#1.ファイル名とunittestモジュールを使用します。
このメソッドでは、unittest モジュールとファイル名を使用してテストを実行します。テストを実行するコマンドはpython -m unittest filename.py
です。この例では、テストを実行するコマンドはpython -m unittest test_utils.py
です。
#2. Discover メソッドの使用
Unittest モジュールのdiscover
メソッドを使用して、すべてのテスト ファイルを自動検出し、実行します。テスト ファイルを自動検出するには、キーワードtest
で始まる名前を付ける必要があります。
Discover メソッドを使用してテストを実行するコマンドは、 python -m unittest discover
です。このコマンドは、名前がtest
で始まるすべてのファイルを検出し、実行します。
結論👩💻
単体テストは、プログラミングの世界における基本的なテストです。現実世界には他にもたくさんのテストがあります。一つ一つ学んでみてください。このチュートリアルが、unittest モジュールを使用して Python で基本的なテストを作成するのに役立つことを願っています。 pytest、Robot Framework、nose、nose2、slash などのサードパーティ ライブラリがあります。プロジェクトの要件に基づいてそれらを探索できます。
テストをお楽しみください 😎
Python のインタビューの質問と回答にも興味があるかもしれません。