Python の単体テスト フレームワーク:unittest を使用した効果的なテスト

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.TestCasetest_upperこのクラスでは、 、 、test_isupper3 つのメソッドを定義しますtest_splitこれら 3 つのメソッドは、3 つのテスト ケースです。

unittest.TestCaseassertEqual(a, b)このクラスは、 、assertTrue(x)、 などの多数のアサーション メソッドを提供しますassertFalse(x)これらのアサート メソッドは、コードが期待どおりに動作することを確認するために使用されます。

3. テストを実行し、テスト結果を表示します。

テスト ケースを定義したら、これらのテスト ケースを実行してテスト結果を表示できます。unittest.main()を実行すると、すべてのテスト ケースを実行できます。

上記のコードの最後で、 を呼び出しますunittest.main()この関数は、現在のモジュール内のすべてのサブクラスを検索しunittest.TestCasetestこれらのサブクラスで から始まるすべてのメソッドを実行します。

このコードを実行すると、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 つのメソッドは、各テスト メソッドの前後に実行され、テスト環境の準備とリソースのクリーンアップに使用できます。setUptearDown

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. コンピューターの基本

情報取得方法:

おすすめ

転載: blog.csdn.net/myh919/article/details/131981111