__init__ for unittest.TestCase

PythonUnit Testing

Python Problem Overview


I'd like to add a couple of things to what the unittest.TestCase class does upon being initialized but I can't figure out how to do it.

Right now I'm doing this:

#filename test.py

class TestingClass(unittest.TestCase):

    def __init__(self):
        self.gen_stubs()

    def gen_stubs(self):
        # Create a couple of tempfiles/dirs etc etc.
        self.tempdir = tempfile.mkdtemp()
        # more stuff here

I'd like all the stubs to be generated only once for this entire set of tests. I can't use setUpClass() because I'm working on Python 2.4 (I haven't been able to get that working on python 2.7 either).

What am I doing wrong here?

I get this error:

 `TypeError: __init__() takes 1 argument (2 given)` 

...and other errors when I move all of the stub code into __init__ when I run it with the command python -m unittest -v test.

Python Solutions


Solution 1 - Python

Try this:

class TestingClass(unittest.TestCase):

    def __init__(self, *args, **kwargs):
        super(TestingClass, self).__init__(*args, **kwargs)
        self.gen_stubs()

You are overriding the TestCase's __init__, so you might want to let the base class handle the arguments for you.

Solution 2 - Python

Just wanted to add some clarifications about overriding the init function of

unittest.TestCase

The function will be called before each method in your test class. Please note that if you want to add some expensive computations that should be performed once before running all test methods please use the SetUpClass classmethod

@classmethod
def setUpClass(cls):
    cls.attribute1 = some_expensive_computation()

This function will be called once before all test methods of the class. See setUp for a method that is called before each test method.

Solution 3 - Python

Install unittest2 and use that package's unittest.

import unittest2 

and then use the setupModule / tearDownModule or setupClass / tearDown class for special initialization logic

More info: http://www.voidspace.org.uk/python/articles/unittest2.shtml

Also most likely your are creating an integration test more than an unittest. Choose a good name for the Tests to differentiate them or put in a different container module.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionffledglingView Question on Stackoverflow
Solution 1 - PythonkarthikrView Answer on Stackoverflow
Solution 2 - PythonThomas VetterliView Answer on Stackoverflow
Solution 3 - PythonfabrizioMView Answer on Stackoverflow