복붙노트

[PYTHON] 자동 테스트 세트에 대해 setUp을 한 번만 실행하십시오.

PYTHON

자동 테스트 세트에 대해 setUp을 한 번만 실행하십시오.

내 Python 버전은 2.6입니다.

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

내 생각은 첫 번째 실행 후 'true'로 설정된 부울 변수를 만든 다음 setup 메서드를 두 번 이상 호출하지 않도록 설정하는 것이 었습니다.

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 ---

왜 이것이 작동하지 않는 걸까요? 내가 놓친 게 있니?

해결법

  1. ==============================

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

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

  2. ==============================

    2.Daniel의 대답은 정확 합니다만, TestCase가 unittest.TestCase의 하위 클래스 인 경우 setUpClass ()에서 super ()를 호출하지 않는 등의 일반적인 실수 (예 : django.test 또는 falcon.testing)를 피할 수 있습니다.

    Daniel의 대답은 정확 합니다만, TestCase가 unittest.TestCase의 하위 클래스 인 경우 setUpClass ()에서 super ()를 호출하지 않는 등의 일반적인 실수 (예 : django.test 또는 falcon.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()
    
  3. ==============================

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

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

    예 :

    class MyClass(object):
        ...
    
    def _set_up():
        code to do one-time setup
    
    _set_up()
    

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

  4. ==============================

    4.mySelTest 외부에서 한 번 설정하려는 모든 코드를 배치하십시오.

    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)
    

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

    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)
    

    너의 방법은 너무 일한다.

  5. ==============================

    5.setup_done은 인스턴스 변수가 아닌 클래스 변수입니다.

    setup_done은 인스턴스 변수가 아닌 클래스 변수입니다.

    인스턴스 변수로 참조하고 있습니다 :

    self.setup_done

    하지만 클래스 변수로 참조해야합니다.

    mySelTest.setup_done

    다음은 수정 된 코드입니다.

    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)
    
  6. from https://stackoverflow.com/questions/14305941/run-setup-only-once-for-a-set-of-automated-tests by cc-by-sa and MIT license