Programing

일련의 자동화 된 테스트에 대해 setUp을 한 번만 실행

lottogame 2020. 11. 20. 08:24
반응형

일련의 자동화 된 테스트에 대해 setUp을 한 번만 실행


내 Python 버전은 2.6입니다.

모든 테스트에 필요한 작업을 수행하기 때문에 테스트 setUp 메서드를 한 번만 실행하고 싶습니다.

내 생각은 첫 번째 실행 후 'true'로 설정되는 부울 변수를 만든 다음 설정 메서드에 대한 둘 이상의 호출을 비활성화하는 것입니다.

class mySelTest(unittest.TestCase):
    setup_done = False

    def setUp(self):
        print str(self.setup_done)
            
        if self.setup_done:
            return
        self.setup_done = True
        print str(self.setup_done)

출력 :

False

True

--- Test 1 ---

False

True

--- Test 2 ---

왜 이것이 작동하지 않습니까? 내가 놓친 것이 있습니까?


setUpClass테스트 스위트 당 한 번만 실행되는 메소드를 정의 하는 사용할 수 있습니다 .


다니엘의 대답은 정확하지만 여기에 같은 호출하지 내가 찾은 몇 가지 일반적인 실수 피하기 위해 예이다 super()setUpClass()경우 TestCase의 서브 클래스 unittest.TestCase(처럼 django.testfalcon.testing)를.

에 대한 설명서 에는 이러한 경우 setUpClass()전화해야한다고 언급 되어 있지 않습니다 super(). 이 관련 질문 에서 볼 수 있듯이 그렇지 않으면 오류가 발생합니다 .

class SomeTest(TestCase):
    def setUp(self):
        self.user1 = UserProfile.objects.create_user(resource=SomeTest.the_resource)

    @classmethod
    def setUpClass(cls):
        """ get_some_resource() is slow, to avoid calling it for each test use setUpClass()
            and store the result as class variable
        """
        super(SomeTest, cls).setUpClass()
        cls.the_resource = get_some_resource()

setUp에 대한 호출을 중복 제거하지 말고 한 번만 호출하십시오.

예를 들면 :

class MyClass(object):
    ...

def _set_up():
    code to do one-time setup

_set_up()

모듈이 처음로드 될 때 _set_up ()을 호출합니다. 모듈 수준 함수로 정의했지만 MyClass의 클래스 메서드로 만들 수도 있습니다.


설정하려는 모든 코드를 mySelTest 외부에 한 번 배치합니다.

setup_done = False

class mySelTest(unittest.TestCase):

    def setUp(self):
        print str(setup_done)

        if setup_done:
            return

        setup_done = True
        print str(setup_done)

또 다른 가능성은에서 인스턴스화하는 Singleton 클래스를 갖는 것입니다.이 클래스 setUp()__new__코드를 한 번만 실행 하고 나머지 호출에 대해 개체 인스턴스를 반환합니다. 참조 : 싱글 톤을 정의하는 간단하고 우아한 방법이 있습니까?

class Singleton(object):
    _instance = None
    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance = super(Singleton, cls).__new__(
                            cls, *args, **kwargs)
            # PUT YOUR SETUP ONCE CODE HERE!
            cls.setUpBool = True

        return cls._instance

class mySelTest(unittest.TestCase):

    def setUp(self):
        # The first call initializes singleton, ever additional call returns the instantiated reference.
        print(Singleton().setUpBool)

당신의 방식도 작동합니다.


If you ended up here because of need to load some data for testing... then as far as you are using Django 1.9+ please go for setUpTestData:

class MyTests(TestCase):

    @classmethod
    def setUpTestData(cls):
        # Set up data for the whole TestCase
        cls.foo = Foo.objects.create(bar="Test")

    def test1(self):
        self.assertEqual(self.foo.bar, 'Test') 

setup_done is a class variable, not an instance variable.

You are referencing it as an instance variable:

self.setup_done

But you need to reference it as a class variable:

mySelTest.setup_done

Here's the corrected code:

class mySelTest(unittest.TestCase):
    setup_done = False

    def setUp(self):
        print str(mySelTest.setup_done)

        if mySelTest.setup_done:
            return
        mySelTest.setup_done = True
        print str(mySelTest.setup_done)

참고URL : https://stackoverflow.com/questions/14305941/run-setup-only-once-for-a-set-of-automated-tests

반응형