Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python unittest.TestCase execution order

Is there a way in Python unittest to set the order in which test cases are run?

In my current TestCase class, some testcases have side effects that set conditions for the others to run properly. Now I realize the proper way to do this is to use setUp() to do all setup related things, but I would like to implement a design where each successive test builds slightly more state that the next can use. I find this much more elegant.

class MyTest(TestCase):    def test_setup(self):     # Do something    def test_thing(self):     # Do something that depends on test_setup() 

Ideally, I would like the tests to be run in the order they appear in the class. It appears that they run in alphabetical order.

like image 234
Mike Avatar asked Mar 22 '11 05:03

Mike


People also ask

Does Unittest run tests in order?

Note that the order in which the various test cases will be run is determined by sorting the test function names with respect to the built-in ordering for strings.

What is the correct order of the unit test layout?

A typical unit test contains 3 phases: First, it initializes a small piece of an application it wants to test (also known as the system under test, or SUT), then it applies some stimulus to the system under test (usually by calling a method on it), and finally, it observes the resulting behavior.

Do Python unit tests run in parallel?

unittest-parallel is a parallel unit test runner for Python with coverage support. By default, unittest-parallel runs unit tests on all CPU cores available. To run your unit tests with coverage, add either the "--coverage" option (for line coverage) or the "--coverage-branch" for line and branch coverage.


2 Answers

Don't make them independent tests - if you want a monolithic test, write a monolithic test.

class Monolithic(TestCase):   def step1(self):       ...    def step2(self):       ...    def _steps(self):     for name in dir(self): # dir() result is implicitly sorted       if name.startswith("step"):         yield name, getattr(self, name)     def test_steps(self):     for name, step in self._steps():       try:         step()       except Exception as e:         self.fail("{} failed ({}: {})".format(step, type(e), e)) 

If the test later starts failing and you want information on all failing steps instead of halting the test case at the first failed step, you can use the subtests feature: https://docs.python.org/3/library/unittest.html#distinguishing-test-iterations-using-subtests

(The subtest feature is available via unittest2 for versions prior to Python 3.4: https://pypi.python.org/pypi/unittest2 )

like image 157
ncoghlan Avatar answered Sep 17 '22 18:09

ncoghlan


It's a good practice to always write a monolithic test for such expectations. However, if you are a goofy dude like me, then you could simply write ugly looking methods in alphabetical order so that they are sorted from a to b as mentioned in the Python documentation - unittest — Unit testing framework

Note that the order in which the various test cases will be run is determined by sorting the test function names with respect to the built-in ordering for strings

Example

  def test_a_first():   print "1"   def test_b_next():   print "2"   def test_c_last():   print "3" 
like image 29
2 revs, 2 users 84% Avatar answered Sep 20 '22 18:09

2 revs, 2 users 84%