setUp function gets called every time you need to run a single TestCase (no matter if you run it using TestSuite or simply unittest.main()).So if you have to test something that requires a complex setUp routine (like loading 50000 records from SQL or preparing an orangemochafrappuccino) but that can be reused all along your TestSuite you have the same problem I had.
Now all around the internet there are posts saying "You could do that" or "One way to do that" or "Once I did that like this..." or even worse "The standard way of doing it is...".
But none of these posts really gets to the bottom of it, they all give you a piece of information. I couldn't find one place that told you "copy/paste this code and be happy".
So, after figuring it out, I can now tell you "copy/paste this code and be happy".
import unittest
from my_program import MyClass
class MyClassTest(unittest.TestCase):
# First define a class variable that determines
# if setUp was ever run
ClassIsSetup = False
def setUp(self):
# If it was not setup yet, do it
if not self.ClassIsSetup:
print "Initializing testing environment"
# run the real setup
self.setupClass()
# remember that it was setup already
self.__class__.ClassIsSetup = True
def setupClass(self):
# Do the real setup
unittest.TestCase.setUp(self)
# you want to have persistent things to test
self.__class__.myclass = MyClass()
# (you can call this later with self.myclass)
You can do the same for the
unittest.tearDown since it is exactly the same code.