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
for python >3 you can do it by defining startTestRun
,stopTestRun
of unittest.TestResult class
. answer https://stackoverflow.com/a/64892396/2679740
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)
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.
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.
You can use setUpClass to define methods that only run once per testsuite.
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)