Run setUp only once for a set of automated tests

前端 未结 8 1233
逝去的感伤
逝去的感伤 2020-12-13 05:15

My Python version is 2.6.

I would like to execute the test setUp method only once since I do things there which are needed for all tests.

My idea was to crea

相关标签:
8条回答
  • 2020-12-13 06:03

    for python >3 you can do it by defining startTestRun,stopTestRun of unittest.TestResult class. answer https://stackoverflow.com/a/64892396/2679740

    0 讨论(0)
  • 2020-12-13 06:06

    I'm using Python 3 and found that the cls reference is also available in the setup method and so the following works:

    class TestThing(unittest.TestCase):
    
      @classmethod
      def setUpClass(cls):
        cls.thing = Thing() # the `thing` is only instantiated once
    
      def setup(self):
        self.thing = cls.thing # ...but set on each test case instance
    
      def test_the_thing(self):
        self.assertTrue(self.thing is not None)
    
    0 讨论(0)
  • 2020-12-13 06:07

    Don't try to dedupe the calls to setUp, just call it once.

    For example:

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

    This will call _set_up() when the module's first loaded. I've defined it to be a module-level function, but you could equally make it a class method of MyClass.

    0 讨论(0)
  • 2020-12-13 06:07

    Place all code you want set up once outside the 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)
    

    Another possibility is having a Singleton class that you instantiate in setUp(), which will only run the __new__ code once and return the object instance for the rest of the calls. See: Is there a simple, elegant way to define singletons?

    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)
    

    Your way works too though.

    0 讨论(0)
  • 2020-12-13 06:09

    You can use setUpClass to define methods that only run once per testsuite.

    0 讨论(0)
  • 2020-12-13 06:11

    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)
    
    0 讨论(0)
提交回复
热议问题