1. はじめに
ソフトウェア開発において、単体テストは、関数やメソッドなどの個々のソフトウェア コンポーネントの正確性をチェックするために使用されるテスト手法です。Python には、 という組み込みの単体テスト ライブラリが用意されておりunittest
、これを使用してテスト コードを作成し、テストを実行し、テスト結果をレポートすることができます。
unittest
この記事では、 を使用して単体テストを作成および実行する方法を説明します。unittest
この記事を読むことで、の基本的な使い方と、unittest
でのアサーション メソッドとテスト ケースの構成構造の使用方法が理解できます。
2. 基本的な概念と手法
ではunittest
、各テスト ケースは のunittest.TestCase
インスタンスであり、テスト ケースのコレクションがテスト スイートです。unittest.TestCase
サブクラスを実装してテスト ケースを定義し、このサブクラスのオブジェクトをインスタンス化して特定のテスト ケースを作成できます。
以下に、テスト ケースを定義して使用する方法を示す簡単な例を示します。
import unittest
class TestStringMethods(unittest.TestCase):
def test_upper(self):
self.assertEqual('foo'.upper(), 'FOO')
def test_isupper(self):
self.assertTrue('FOO'.isupper())
self.assertFalse('Foo'.isupper())
def test_split(self):
s = 'hello world'
self.assertEqual(s.split(), ['hello', 'world'])
# check that s.split fails when the separator is not a string
with self.assertRaises(TypeError):
s.split(2)
if __name__ == '__main__':
unittest.main()
上記のコードでは、TestStringMethods
を継承するクラスを定義しますunittest.TestCase
。test_upper
このクラスでは、 、 、test_isupper
の3 つのメソッドを定義しますtest_split
。これら 3 つのメソッドは、3 つのテスト ケースです。
unittest.TestCase
assertEqual(a, b)
このクラスは、 、assertTrue(x)
、 などの多数のアサーション メソッドを提供しますassertFalse(x)
。これらのアサート メソッドは、コードが期待どおりに動作することを確認するために使用されます。
3. テストを実行し、テスト結果を表示します。
テスト ケースを定義したら、これらのテスト ケースを実行してテスト結果を表示できます。unittest.main()
を実行すると、すべてのテスト ケースを実行できます。
上記のコードの最後で、 を呼び出しますunittest.main()
。この関数は、現在のモジュール内のすべてのサブクラスを検索しunittest.TestCase
、test
これらのサブクラスで から始まるすべてのメソッドを実行します。
このコードを実行すると、unittest
各テスト ケースの結果を示すテスト レポートが出力されます。たとえば、すべてのテスト ケースが成功すると、次の出力が表示されます。
....
----------------------------------------------------------------------
Ran 4 tests in 0.001s
OK
4. テストローダーとテストランナーの使用
テスト ローダーはテストの検索とロードに使用され、テスト ランナーはこれらのテストの実行と結果のレポートを担当します。Python のunittest ライブラリはデフォルトのテスト ローダーとテスト ランナーを提供しますが、特別なニーズに合わせてカスタマイズすることもできます。
以下は、テストをロードするために使用する方法を示す例ですunittest.TestLoader
。
import unittest
class TestStringMethods(unittest.TestCase):
# ... 前面的内容 ...
def suite():
suite = unittest.TestSuite()
loader = unittest.TestLoader()
suite.addTest(loader.loadTestsFromTestCase(TestStringMethods))
return suite
if __name__ == '__main__':
runner = unittest.TextTestRunner()
runner.run(suite())
この例では、最初に のunittest.TestLoader
インスタンスを作成します。次に、クラスで定義されているすべてのテストloadTestsFromTestCase
をロードするメソッドを呼び出します。TestStringMethods
次に、これらのテストをテスト スイートに追加しました。
テストランナーについては、デフォルトのテストランナーとしてクラスunittest
が提供されています。unittest.TextTestRunner
このクラスのインスタンスは、テキスト レポートをコンソールに出力します。テスト ランナーをカスタマイズしたい場合は、unittest.TestRunner
クラスを拡張することで実行できます。
5. テストスイート
テスト スイートは、テスト ケースまたはテスト スイートのコレクションです。unittest
実行する必要があるテストを指定するために使用されます。独自のテスト スイートを作成すると、unittest
どのテストを実行するかを正確に制御できます。以下は、テスト スイートを作成し、テスト ケースを追加する例です。
import unittest
class TestStringMethods(unittest.TestCase):
# ... 与前文相同 ...
def suite():
suite = unittest.TestSuite()
suite.addTest(TestStringMethods('test_upper'))
suite.addTest(TestStringMethods('test_isupper'))
return suite
if __name__ == '__main__':
runner = unittest.TextTestRunner()
runner.run(suite())
suite
この例では、インスタンスを作成しunittest.TestSuite
、このインスタンスにテスト ケースを追加する関数を作成します。このセクションではmain
、インスタンスを作成しunittest.TextTestRunner
、そのrun
メソッドを呼び出してテスト スイートを実行します。
6 つの setUp メソッドとtearDown メソッド
テストに使用されるメソッドに加えて、とunittest.TestCase
という 2 つの特別なメソッドが提供されます。これら 2 つのメソッドは、各テスト メソッドの前後に実行され、テスト環境の準備とリソースのクリーンアップに使用できます。setUp
tearDown
setUp
と を使用したtearDown
例を次に示します。
import unittest
class TestDatabaseMethods(unittest.TestCase):
def setUp(self):
self.conn = create_database_connection()
self.cur = self.conn.cursor()
def tearDown(self):
self.cur.close()
self.conn.close()
def test_insert(self):
self.cur.execute("INSERT INTO employees VALUES (1, 'John')")
self.cur.execute("SELECT * FROM employees")
result = self.cur.fetchone()
self.assertEqual(result, (1, 'John'))
if __name__ == '__main__':
unittest.main()
この例では、setUp
メソッド内でデータベース接続とカーソルを作成し、tearDown
メソッド内でそれらを閉じます。こうすることで、各テスト メソッドがクリーンなデータベース環境に対して確実に実行されるようになります。
7、unittest.mock: オブジェクトと動作のモック
場合によっては、テスト対象のオブジェクトをいくつか置き換えたり、特定の動作をシミュレートしたりすることが必要になる場合があります。unittest.mock
モジュールは、Mock
それを行うのに役立つクラスやその他の多くのツールを提供します。
を使用した例を次に示しますunittest.mock
。
from unittest import TestCase, mock
from my_module import MyObject
class TestMyObject(TestCase):
@mock.patch('my_module.MyObject')
def test_my_method(self, MockMyObject):
obj = MockMyObject()
obj.my_method.return_value = 42
assert obj.my_method() == 42
obj.my_method.assert_called_once()
unittest.mock.patch
この例では、デコレータを使用してMyObject
クラスを置き換えています。その後、メソッドが返す値を設定したり、メソッドが正しく呼び出されたかどうかを確認したりするなど、この代替オブジェクトの動作を制御できます。
全体として、Pythonunittest
フレームワークは単体テスト用の強力で柔軟なツールを提供します。これはunittest
氷山の一角にすぎません。さらに多くの機能が発見され、使用されるのを待っています。
以下はサポート情報です。[ソフトウェア テスト] を行う友人にとって、これは最も包括的で完全な準備倉庫となるはずです。この倉庫は、最も困難な旅にも同行してくれました。あなたにも役立つことを願っています。
ソフトウェアテストインタビューアプレット
ソフトウェア テストの質問バンクには、何百万人もの人が参加しました。!!誰が知っているのか!!!ネットワーク全体で最も包括的なクイズ ミニ プログラムです。携帯電話を使用して、地下鉄やバスの中でもクイズに答えることができます。
次の面接の質問セクションが取り上げられます。
1. ソフトウェアテストの基礎理論、2. Web、アプリ、インターフェース機能テスト、3. ネットワーク、4. データベース、5. Linux
6. Web、アプリ、インターフェイスの自動化、7. パフォーマンス テスト、8. プログラミングの基本、9. 時間面接の質問、10. 公開テストの質問、11. セキュリティ テスト、12. コンピューターの基本
情報取得方法: