setUp&tearDown、setUpClass&tearDownClass、tearDownClass&tearDownModule


(1)クラスにsetup()メソッドが定義されている場合、テストプログラムは各テスト項目を実行する前にこのメソッドを呼び出す.
同様に、tearDown()メソッドは、すべてのテスト項目の実行が完了すると呼び出されます.次のことを確認します.
import unittest


class SimpleTest(unittest.TestCase):
    def setUp(self):
        self.foo = list(range(10))
        print(self.foo)
        print("="*30)

    def test_1st(self):
        self.assertEqual(self.foo.pop(), 9)
        print(self.foo)
        print("+"*30)

    def test_2nd(self):
        self.assertEqual(self.foo.pop(), 9)
        print(self.foo)


if __name__ == '__main__':
    unittest.main()
    
  • [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  • ==============================
  • [0, 1, 2, 3, 4, 5, 6, 7, 8]
  • ++++++++++++++++++++++++++++++
  • [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  • ==============================
  • [0, 1, 2, 3, 4, 5, 6, 7, 8]

  • なお、ここで2回のテストはいずれも同じインスタンス属性selfに対して行う.fooはpop()呼び出しを行ったが、テスト結果はpass、すなわち説明、test_1 stとtest_2 ndはそれぞれ呼び出し前にsetUp()を1回呼び出した.
    (2)setup/tearDownを全行程で1回だけ呼び出したい場合はどうすればいいですか?setuUpClass()とtearDownClass()クラスメソッドを使用します.注意この2つの方法を使うときは必ず@classmethodアクセサリーで飾ってください.
    import unittest
    
    
    class SimpleTest(unittest.TestCase):
        @classmethod
        def setUpClass(self):
            self.foo = list(range(10))
            print(self.foo)
            print("="*30)
    
        def test_1st(self):
            self.assertEqual(self.foo.pop(), 9)
            print(self.foo)
    
        def test_2nd(self):
            self.assertEqual(self.foo.pop(), 8)
            print(self.foo)
    
        @classmethod
        def tearDownClass(self):
            print('\t')
            print('+'*30)
    
    
    if __name__ == '__main__':
        unittest.main()
    
    
    
  • [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  • ==============================
  • ++++++++++++++++++++++++++++++
  • [0, 1, 2, 3, 4, 5, 6, 7, 8]                    test_1st
  • [0, 1, 2, 3, 4, 5, 6, 7]                        test_2nd

  • この例ではクラスレベルのsetUpClass()クラスメソッドを使用し,2回目のpop()呼び出しの予想戻り値を変更した.実行結果は、すべてのテスト項目が呼び出される前にsetUpClass()が1回しか呼び出されていないことを示しています.
    (3)setUp/tearDownをファイルレベル全体で1回だけ呼び出したい場合は、setUpModule()とtearDownModule()の2つの関数を使用します.TestCaseクラスと同級であることに注意してください.
    import unittest
    import time
    
    
    def setUpModule():
        print(' ------ ')
        print('')
    
    
    def tearDownModule():
        print(' ------ ')
        print('')
    
    
    class SimpleTest1(unittest.TestCase):
        def test_1st(self):
            print(' 1---step1')
            time.sleep(1)
    
        def test_2nd(self):
            print(' 1---step1')
            time.sleep(1)
    
    
    class SimpleTest2(unittest.TestCase):
        def test_3st(self):
            print(' 2---step3')
            time.sleep(1)
    
        def test_4nd(self):
            print(' 2---step4')
            time.sleep(1)
    
    
    if __name__ == '__main__':
        unittest.main()
    
    
  • 集積テスト------
  • を開始
  • ユニットテスト1---step 1
  • ユニットテスト1---step 1
  • ユニットテスト2---step 3
  • ユニットテスト2---step 4
  • 集積テスト------終了
  • 一般的なassert*()メソッドでは、キャプチャされていない異常が投げ出された場合、このテストの使用例はfailとして記録され、テストは続行されます.ただし、setup()に異常が発生すると、テストプログラム自体にエラーがあり、後のテスト例もtearDown()も実行されないと考えられます.すなわち、tearDown()はsetup()が正常に実行された場合にのみ実行され、必ず実行される.
    参考資料:
    https://blog.csdn.net/yockie/article/details/47415265