013-unittestユニットテストフレームワーク

13450 ワード

unittestユニットテストフレームワーク


重要な概念


1.TestCase TestCaseは、特定の入力セットの特定の戻り値をチェックする最小のテストユニットである.unittestはTestCaseベースクラスを提供し、私たちが作成したテストクラスはこのベースクラスを継承する必要があり、それは新しいテスト例2を作成するために使用することができる.TestSuiteテストキットは、実行するテストのセットを組み立てるためのテスト例、テストキット、または両方のセットです.unittestはTestSuiteクラスを提供してテストキット3を作成する.Test Runner Test Runnerは、テストの実行を調整し、ユーザーに結果を提供するためのコンポーネントです.unittestはTextTestRunnerクラスの実行テスト例4を提供した.TestFixture TestFixtureは、1つ以上のテストを実行するために必要な環境準備、および関連するクリーンアップ動作を表します.uintestはsetup()/tearDown()、setuUpClass()/tearDownClass()を提供しています.

TestSuite


TestSuiteクラスの次のaddTest()を呼び出してテスト例を追加します.一度に1つの使用例しか追加できないため、テストクラスとテスト方法を指定する必要があります.
suit = unittest.TestSuite()
suit.addTest(Calculator("test_add"))
suit.addTest(Calculator("test_sub"))

1.テストキットの追加順序により、テスト例の実行順序を制御することができる.1つのテストファイルに多くのテスト・インスタンスがある場合、毎回すべてのテスト・インスタンスを実行するわけではありません.したがって、テスト・スイートとランダーを使用して、実行するテスト・インスタンスを柔軟に制御できます.

discoverメソッド


unittestはdefaultTestLoaderクラスのdiscover()メソッドを提供し、複数のファイルからテスト・インスタンスを検索できます.
discover(start_dir,pattern="test*.py",top_level_dir=None )

1. start_dir:テスト対象モジュール名またはテスト例ディレクトリ2.pattern=「test*.py」:テストケースファイル名の一致原則をテストします.ここでは、「test」で始まる「.py」タイプのファイルと一致し、アスタリスク「*」は任意の複数の文字3を表す.top_level_dir=None:テストモジュールの最上位ディレクトリ、最上位ディレクトリがない場合はデフォルトNone
import unittest
# test_case
test_dir = r"./test_case" suit = unittest.defaultTestLoader.discover(test_dir,pattern="test*.py") if __name__ == "__main__": runner = unittest.TextTestRunner() runner.run(suit)

discover()メソッドのstart_dirパラメータは「./test_caseディレクトリとして定義され、test_a.pyファイルのテスト例のみをロードできます.unittestにtest_case/サブディレクトリのテストファイルを検索させるには、各サブディレクトリの下に1つの__init_.pyファイルを置く必要があります.__init_.pyファイルの役割は、ターゲットを標準のPythonモジュールにマークすることです.

テストのスキップと予期しない失敗


テストを実行するときに、一部のテスト・インスタンスを直接スキップする必要がある場合や、テスト・インスタンスが条件に合致している場合にテストをスキップする場合、またはテスト・インスタンスを直接失敗に設定する場合があります.unittestはこれらのニーズを実現する装飾器を提供しています
unittest.skip(reason)無条件のスキップ装飾のテストは、スキップテストの原因unittestを説明する必要がある.skipIf(condition,reason)条件が真である場合、装飾のテストunittestをスキップする.skipUnless(condition,reason)条件が真である場合、装飾のテストunittestを実行する.expectedFailure()は、実行結果が失敗したかどうかにかかわらず、テストを失敗としてマークします.
import unittest

class Mytest(unittest.TestCase):
@unittest.skip(" ")
def test_skip(self):
print("aaa")

@unittest.skipIf(3 > 2 ,"")
def test_skipIf(self):
print("bbb")

@unittest.skipUnless(3 > 2,"")
def test_skipUnless(self):
print("ccc")

@unittest.expectedFailure
def test_expectedFailure(self):
self.assertEqual(2,3)


if "__name__" == "__main__":
unittest.main()

実行結果
Skipped:  

Skipped:  , 
ccc


Ran 4 tests in 0.006s

OK (skipped=2, expected failures=1)

 
ユニットテスト部分コード:
1.calculatorを作成します.pyファイル
class Calculator:

    def __init__(self,a,b):
        self.a = int(a)
        self.b = int(b)

    def add(self):
        return self.a + self.b

    def sub(self):
        return self.a - self.b

    def mul(self):
        return self.a * self.b

    def div(self):
        return self.a / self.b

2.unittestユニットテストフレームワークによるテスト用例の作成
import unittest
from Calculator import Calculator

class TestCalculator(unittest.TestCase):
    def test_add(self):
        c = Calculator(3,5)     # type(c):
        result = c.add()        # type(result):
        self.assertEqual(result,8)

    def test_sub(self):
        c = Calculator(13,5)
        result = c.sub()
        self.assertEqual(result, 8)

    def test_mul(self):
        c = Calculator(2,3)
        result = c.mul()
        self.assertEqual(result,5)

    def test_div(self):
        c = Calculator(6,3)
        result = c.div()
        self.assertEqual(result,2)


if __name__ == "__main__":
    unittest.main()

3.テストキットとテストドライバの作成
import unittest
from Calculator import Calculator

class TestCalculator(unittest.TestCase):
    #  
    def setUp(self):
        print("test start:")
    #  
    def tearDown(self):
        print("test end:")

    def test_add(self):
        c = Calculator(3,5)     # type(c):
        result = c.add()        # type(result):
        self.assertEqual(result,8)

    def test_sub(self):
        c = Calculator(13,5)
        result = c.sub()
        self.assertEqual(result, 8)

    def test_mul(self):
        c = Calculator(2,3)
        result = c.mul()
        self.assertEqual(result,5)

    def test_div(self):
        c = Calculator(6,3)
        result = c.div()
        self.assertEqual(result,2)


if __name__ == "__main__":
    #  
    suit = unittest.TestSuite()
    suit.addTest(Calculator("test_add"))
    suit.addTest(Calculator("test_sub"))
    suit.addTest(Calculator("test_mul"))
    suit.addTest(Calculator("test_div"))
    #  
    runner = unittest.TextTestRunner()
    runner.run(suit)