여러 테스트를위한 Unittest 설정 / 해체


118

테스트 시나리오의 시작 / 끝에서 실행되는 기능이 있습니까? setUp 및 tearDown 함수는 매 테스트 전후에 실행됩니다.

나는 일반적으로 이것을 갖고 싶습니다.

class TestSequenceFunctions(unittest.TestCase):

    def setUpScenario(self):
        start() #launched at the beginning, once

    def test_choice(self):
        element = random.choice(self.seq)
        self.assertTrue(element in self.seq)

    def test_sample(self):
        with self.assertRaises(ValueError):
            random.sample(self.seq, 20)
        for element in random.sample(self.seq, 5):
            self.assertTrue(element in self.seq)

    def tearDownScenario(self):
        end() #launched at the end, once

지금은 이러한 설정 및 분해가 단위 테스트이며 모든 시나리오 (많은 테스트 포함)에 분산되어 있습니다. 하나는 첫 번째 테스트이고 다른 하나는 마지막 테스트입니다.


6
어떤 버전? unittest 모듈은 Python 2.7에 module_setup 및 module_teardown을 포함하도록 확장되었습니다.
S.Lott 2011

3
2.7은 또한 setUpClass () 및 tearDownClass () 클래스 메서드를 도입했습니다.이를 통해 동일한 파일에 여러 클래스를 포함 할 수 있습니다.
Per Fagrell 2011

답변:


132

(2.7 현재 문서 ) 당신은 얻을 수 setUpClasstearDownClass각각 실행하기 전에 주어진 클래스에서 테스트 한 후 실행한다. 또는 하나의 파일에 그룹이있는 경우 setUpModuletearDownModule( documentation )를 .

그렇지 않으면 가장 좋은 방법은 아마도 자신의 파생 된 TestSuite를 만들고 재정의하는 것 run()입니다. 다른 모든 호출은 부모가 처리하고 run은 부모의 run메서드에 대한 호출을 중심으로 설정 및 해체 코드를 호출합니다 .


71

동일한 시나리오가 있습니다. setUpClass 및 tearDownClass 메서드가 완벽하게 작동합니다.

import unittest

class Test(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        cls._connection = createExpensiveConnectionObject()

    @classmethod
    def tearDownClass(cls):
        cls._connection.destroy()

6
올바른 예를 보여주고 이러한 함수가 작동하려면 클래스 메서드 여야하므로 수락 된 답변으로 업데이트되어야합니다.
NuclearPeon

1

파이썬 2.5의 경우, pydev로 작업 할 때 약간 어렵습니다. pydev는 테스트 스위트를 사용하지 않지만 모든 개별 테스트 케이스를 찾아서 모두 개별적으로 실행하는 것으로 보입니다.

이에 대한 내 솔루션은 다음과 같은 클래스 변수를 사용하는 것입니다.

class TestCase(unittest.TestCase):
    runCount = 0

    def setUpClass(self):
        pass # overridden in actual testcases

    def run(self, result=None):
        if type(self).runCount == 0:
            self.setUpClass()

        super(TestCase, self).run(result)
        type(self).runCount += 1

이 트릭을 사용하면 TestCase(원본 대신) this 에서 unittest.TestCase상속하면 runCount0 도 상속 됩니다. 그런 다음 run 메서드 runCount에서 자식 테스트 케이스의가 확인되고 증가합니다. 이것은runCount 클래스 변수는 0으로 집니다.

즉, setUpClass인스턴스 당 한 번이 아니라 클래스 당 한 번만 실행됩니다.

나는이 없습니다 tearDownClass아직 방법을,하지만 뭔가가 그 카운터를 사용하여 만들 수있는 것 같아요.


0

예를 들면 다음과 같습니다. 3 개의 테스트 메서드가 테스트별로 생성되는 것이 아니라 한 번 생성되는 공유 리소스에 액세스합니다.

import unittest
import random

class TestSimulateLogistics(unittest.TestCase):

    shared_resource = None

    @classmethod
    def setUpClass(cls):
        cls.shared_resource = random.randint(1, 100)

    @classmethod
    def tearDownClass(cls):
        cls.shared_resource = None

    def test_1(self):
        print('test 1:', self.shared_resource)

    def test_2(self):
        print('test 2:', self.shared_resource)

    def test_3(self):
        print('test 3:', self.shared_resource)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.