Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python unittest with expensive setup

Tags:

My test file is basically:

class Test(unittest.TestCase):     def testOk():         pass  if __name__ == "__main__":     expensiveSetup()     try:         unittest.main()     finally:         cleanUp() 

However, I do wish to run my test through Netbeans testing tools, and to do that I need unittests that don't rely on an environment setup done in main. Looking at Caching result of setUp() using Python unittest - it recommends using Nose. However, I don't think Netbeans supports this. I didn't find any information indicating that it does. Additionally, I am the only one here actually writing tests, so I don't want to introduce additional dependencies for the other 2 developers unless they are needed.

How can I do the setup and cleanup once for all the tests in my TestSuite?

The expensive setup here is creating some files with dummy data, as well as setting up and tearing down a simple xml-rpc server. I also have 2 test classes, one testing locally and one testing all methods over xml-rpc.

like image 389
Staale Avatar asked Jan 08 '09 07:01

Staale


People also ask

Is Pytest better than Unittest?

Which is better – pytest or unittest? Although both the frameworks are great for performing testing in python, pytest is easier to work with. The code in pytest is simple, compact, and efficient. For unittest, we will have to import modules, create a class and define the testing functions within that class.

What is setUp in Unittest python?

setUp allows us to write preparation code that is run for all of our tests in a TestCase subclass. Note: If you have multiple test files with TestCase subclasses that you'd like to run, consider using python -m unittest discover to run more than one test file.

Is Unittest built into python?

unittest has been built into the Python standard library since version 2.1. You'll probably see it in commercial Python applications and open-source projects. unittest contains both a testing framework and a test runner. unittest has some important requirements for writing and executing tests.

Does setUp run before every test python?

Does setUp run before every test Python? The setUp() runs before every test method in the test class. The tearDown() runs after every test method in the test class.


2 Answers

If you use Python >= 2.7 (or unittest2 for Python >= 2.4 & <= 2.6), the best approach would be be to use

def setUpClass(cls):     # ... setUpClass = classmethod(setUpClass) 

to perform some initialization once for all tests belonging to the given class.

And to perform the cleanup, use:

@classmethod def tearDownClass(cls):     # ... 

See also the unittest standard library documentation on setUpClass and tearDownClass classmethods.

like image 131
Mekk Avatar answered Sep 18 '22 05:09

Mekk


This is what I do:

class TestSearch(unittest.TestCase):     """General Search tests for...."""      matcher = None     counter      = 0     num_of_tests = None      def setUp(self): # pylint: disable-msg=C0103          """Only instantiate the matcher once"""         if self.matcher is None:             self.__class__.matcher = Matcher()             self.__class__.num_of_tests = len(filter(self.isTestMethod, dir(self)))         self.__class__.counter = self.counter + 1       def tearDown(self): # pylint: disable-msg=C0103         """And kill it when done"""         if self.counter == self.num_of_tests:             print 'KILL KILL KILL'             del self.__class__.matcher 

Sadly (because I do want my tests to be independent and deterministic), I do this a lot (because system testing that take less than 5 minutes are also important).

like image 25
Tal Weiss Avatar answered Sep 18 '22 05:09

Tal Weiss