Frank
Frank

Reputation: 66214

How to set up a resource shared by several unit tests?

In Python, how can I have one setup (which may contain expensive function calls) for a whole set of unit tests?

Example:

import unittest

class Test1(unittest.TestCase):
    def setUp(self):
        print "expensive call"
    def test1(self):
        self.assertEqual(1, 1)
    def test2(self):
        self.assertEqual(1, 1)

if __name__ == "__main__":
    unittest.main()

Will run the expensive call twice:

$ python unittest.py
expensive call
.expensive call
.
----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK

How can I change it so the expensive call is made only once and its resources accessible to all tests?

UPDATE: I'm using Python 2.6.

Upvotes: 9

Views: 4680

Answers (1)

ChrisB
ChrisB

Reputation: 4718

You can use setUpClass

import unittest

class Test(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        print 'setUpClass'
        cls.data = 123

    def test_one(self):
        print 'test_one'
        print self.data

    def test_two(self):
        print 'test_two'


if __name__ == "__main__":
    unittest.main()

See http://docs.python.org/library/unittest.html#unittest.TestCase.setUpClass

UPDATE:

For python 2.6, I suppose you could use class-level attributes:

class Test(unittest.TestCase):
     value = result_of_some_expensive_function()
     def test(self):
         print self.value

That function will run once when your test is defined.

Upvotes: 15

Related Questions