84

How can I be sure of the unittest methods' order? Is the alphabetical or numeric prefixes the proper way?

class TestFoo(TestCase):
    def test_1(self):
        ...
    def test_2(self):
        ...

or

class TestFoo(TestCase):
    def test_a(self):
        ...
    def test_b(self):
        ...
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
nmb.ten
  • 2,158
  • 1
  • 20
  • 18
  • 1
    possible duplicate of [changing order of unit tests in Python](http://stackoverflow.com/questions/4005695/changing-order-of-unit-tests-in-python) – S.Lott Nov 04 '10 at 10:25
  • 4
    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. http://docs.python.org/library/unittest.html – morsik Aug 26 '15 at 13:48
  • Consider using pytest. Life is nicer with pytest – Ouss Feb 05 '21 at 17:58
  • There is a nice solution proposed here that worked for me: [Controlling the order of unittest.TestCases](https://codereview.stackexchange.com/a/243078) – Maxim Zabolotskikh Dec 29 '22 at 11:25

19 Answers19

119

You can disable it by setting sortTestMethodsUsing to None:

import unittest
unittest.TestLoader.sortTestMethodsUsing = None

For pure unit tests, you folks are right; but for component tests and integration tests... I do not agree that you shall assume nothing about the state. What if you are testing the state?

For example, your test validates that a service is auto-started upon installation. If in your setup, you start the service, then do the assertion, and then you are no longer testing the state, but you are testing the "service start" functionality.

Another example is when your setup takes a long time or requires a lot of space and it just becomes impractical to run the setup frequently.

Many developers tend to use "unit test" frameworks for component testing...so stop and ask yourself, am I doing unit testing or component testing?

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
max
  • 9,708
  • 15
  • 89
  • 144
  • 39
    +1 for this: "What if you are testing the state". Happens quite often when testing methods talking to a DB backend for instance. Do not be dogmatic, there _are_ legitimate exceptions to the otherwise sensible rule of making each unit test isolated. – András Aszódi Jul 22 '14 at 09:39
  • Even if you set desired order it could fail in more 'intelligent' environment. My IDE can skip test which were successful earlier and the code isn't changed. Making test dependent of each other is asking for troubles. – Maciej Wawrzyńczuk Nov 26 '18 at 15:33
  • 2
    It could be argued that testing the state of objects should involve mocking said object. This, of course, assumes an appropriate mocking library is available. Also, mocking requires more time and may require multiple tiers of mocked frameworks. It should only be a guideline. There is a point where mocking to the _nth_ degree becomes more complicated than necessary just to test a single state in one object. FWIW, I agree with @max in principle. – IAbstract Aug 03 '19 at 14:13
  • 7
    ```sortTestMethodsUsing = None``` appears to not work in Python 3.9.5, and indeed the documentation no longer mentions this. However, ```sortTestMethodsUsing = lambda *args: -1``` has the effect of sorting the tests by the order in which they are defined within each module. If you are not doing anything fancy with custom loaders ```unittest.defaultTestLoader.sortTestMethodsUsing = lambda *args: -1``` worked fine for me inside. – ScienceSnake Jun 09 '21 at 18:56
85

There is no reason given that you can't build on what was done in a previous test or should rebuild it all from scratch for the next test. At least no reason is usually offered but instead people just confidently say "you shouldn't". That isn't helpful.

In general I am tired of reading too many answers here that say basically "you shouldn't do that" instead of giving any information on how to best do it if in the questioners judgment there is good reason to do so. If I wanted someone's opinion on whether I should do something then I would have asked for opinions on whether doing it is a good idea.

That out of the way, if you read say loadTestsFromTestCase and what it calls it ultimately scans for methods with some name pattern in whatever order they are encountered in the classes method dictionary, so basically in key order. It take this information and makes a testsuite of mapping it to the TestCase class. Giving it instead a list ordered as you would like is one way to do this. I am not so sure of the most efficient/cleanest way to do it but this does work.

Seren Seraph
  • 893
  • 6
  • 2
  • 8
    I agree with your remarks about unhelpful "don't do that" comments without explanations, but having said that there *are* genuine reasons why it's not a good idea to have dependencies between tests. Chief among them is it is nice to have tests fail because a particular thing has broken and not because there's some unclear, undocumented link between the test you're running and some other test which you're not. If you never run isolated tests then that's fine, but being able to run individual tests is helpful in some circumstances, and this is not possible where they depend on each other. – JimmidyJoo Mar 10 '15 at 15:24
  • 1
    The answer is that the unit tests should be independent of each other so that you can run and debug them in isolation. – JeremyP Sep 10 '15 at 12:46
  • 20
    Unit tests should be independent, true. Or better said, they should be able to be run independently for many good reasons. But, I write functional tests, integration tests, and system tests with the unittest framework as well, and these would be unfeasible to run without ordering them since system state MATTERS in integration tests! – Rob Hunter Apr 12 '16 at 18:04
  • 1
    Can you provide an example of how to set the test execution order? – Stevoisiak Nov 06 '17 at 19:08
14

If you use 'nose' and you write your test cases as functions (and not as methods of some TestCase derived class), 'nose' doesn't fiddle with the order, but uses the order of the functions as defined in the file.

In order to have the assert_* methods handy without needing to subclass TestCase I usually use the testing module from NumPy. Example:

from numpy.testing import *

def test_aaa():
    assert_equal(1, 1)

def test_zzz():
    assert_equal(1, 1)

def test_bbb():
    assert_equal(1, 1)

Running that with ''nosetest -vv'' gives:

test_it.test_aaa ... ok
test_it.test_zzz ... ok
test_it.test_bbb ... ok
----------------------------------------------------------------------
Ran 3 tests in 0.050s
OK

Note to all those who contend that unit tests shouldn't be ordered: while it is true that unit tests should be isolated and can run independently, your functions and classes are usually not independent.

They rather build up on another from simpler/low-level functions to more complex/high-level functions. When you start optimising your low-level functions and mess up (for my part, I do that frequently; if you don't, you probably don't need unit test anyway;-) then it's a lot better for diagnosing the cause, when the tests for simple functions come first, and tests for functions that depend on those functions later.

If the tests are sorted alphabetically the real cause usually gets drowned among one hundred failed assertions, which are not there because the function under test has a bug, but because the low-level function it relies on has.

That's why I want to have my unit tests sorted the way I specified them: not to use state that was built up in early tests in later tests, but as a very helpful tool in diagnosing problems.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Elmar Zander
  • 1,338
  • 17
  • 32
  • 1
    I have a suite of a few hundred test cases and I sadly can't say that's true. It's not avoided on purpose either, sometimes it really was in this order. Also I'm not sure if it's configurable in nose somewhere, but scrolling through the help I can't make out the option either. – erikbstack Mar 26 '15 at 10:16
  • Your example works, but this doesn't work in my case as the tests are still executed alphabetically, but reading through the other answers, i realized that i have to isolate my tests properly – danidee Dec 12 '16 at 10:21
  • Tempted to downvote solely for the `from x import *`. While this might seem clean and obvious, it obfuscates the origin of your functions, which is especially annoying to people who are less familiar with the package from which you are importing. Please don't do this. – KeithWM Sep 21 '20 at 07:37
12

I half agree with the idea that tests shouldn't be ordered. In some cases it helps (it's easier, damn it!) to have them in order... after all, that's the reason for the 'unit' in UnitTest.

That said, one alternative is to use mock objects to mock out and patch the items that should run before that specific code under test. You can also put a dummy function in there to monkey patch your code. For more information, check out Mock, which is part of the standard library now.

Here are some YouTube videos if you haven't used Mock before.

Video 1

Video 2

Video 3

More to the point, try using class methods to structure your code, and then place all the class methods in one main test method.

import unittest
import sqlite3

class MyOrderedTest(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        cls.create_db()
        cls.setup_draft()
        cls.draft_one()
        cls.draft_two()
        cls.draft_three()

    @classmethod
    def create_db(cls):
        cls.conn = sqlite3.connect(":memory:")

    @classmethod
    def setup_draft(cls):
        cls.conn.execute("CREATE TABLE players ('draftid' INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 'first', 'last')")

    @classmethod
    def draft_one(cls):
        player = ("Hakeem", "Olajuwon")
        cls.conn.execute("INSERT INTO players (first, last) VALUES (?, ?)", player)

    @classmethod
    def draft_two(cls):
        player = ("Sam", "Bowie")
        cls.conn.execute("INSERT INTO players (first, last) VALUES (?, ?)", player)

    @classmethod
    def draft_three(cls):
        player = ("Michael", "Jordan")
        cls.conn.execute("INSERT INTO players (first, last) VALUES (?, ?)", player)

    def test_unordered_one(self):
        cur = self.conn.execute("SELECT * from players")
        draft = [(1, u'Hakeem', u'Olajuwon'), (2, u'Sam', u'Bowie'), (3, u'Michael', u'Jordan')]
        query = cur.fetchall()
        print query
        self.assertListEqual(query, draft)

    def test_unordered_two(self):
        cur = self.conn.execute("SELECT first, last FROM players WHERE draftid=3")
        result = cur.fetchone()
        third = " ".join(result)
        print third
        self.assertEqual(third, "Michael Jordan")
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Jason Wirth
  • 745
  • 1
  • 10
  • 17
10

Why do you need a specific test order? The tests should be isolated and therefore it should be possible to run them in any order, or even in parallel.

If you need to test something like user unsubscribing, the test could create a fresh database with a test subscription and then try to unsubscribe. This scenario has its own problems, but in the end it’s better than having tests depend on each other. (Note that you can factor out common test code, so that you don’t have to repeat the database setup code or create testing data ad nauseam.)

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
zoul
  • 102,279
  • 44
  • 260
  • 354
  • 3
    It might be difficult to run them in parallel if they access a database (which is mostly the case with django) – Antoine Pelisse Nov 04 '10 at 09:38
  • 1
    Exactly. If you need the tests to run in specific order, else they fail, you don't have independent tests - therefore, some of them are incomplete or erroneous. – Piskvor left the building Nov 04 '10 at 09:38
  • 24
    Each test is the continuation of the previous. Here is simple example of tests order. testing user subscribing, testing disabling of the subscribing, testing unsubscribing of the subscribed and disabled subscription. I must to do all the things tested in the previous test again if tests are not ordered. Is it wrong way? – nmb.ten Nov 04 '10 at 09:51
  • @Antoine: True. With some of my projects I keep the DB inside a single file, so that think I could simply create a unique temporary database for each test and run them in parallel if I wanted to. Of course this is not possible in general, but it might be worth a thought. – zoul Nov 04 '10 at 10:20
  • Django creates a test database when its testrunner is started which is used throughout all the tests. So, tests which use the database cannot be independent. Suppose I want to do something that creates 1 instance of X and 2 of Y, then check those counts; then, I want to create another instance of Y in a different test and check the number of Ys in the database. Depending on which test gets run first, the number will be 1 or 3. For something this simple, each test setup could record the current counts, and the test could compare the difference, but that isn't a general solution. – Mitchell Model Aug 12 '11 at 21:22
  • 2
    @MitchellModel Django uses transactions to roll back changes to the database between tests. Your second test should not see the modifications to the database created in the first test. (If you are, your view is probably using transactions - you should be using Django's TransactionTestCase instead of TestCase for that view) – Izkata Nov 28 '11 at 19:50
  • 6
    One reason I can think of is when two tests don't depend on one another, but the components they are testing do. Imagine testing a class B which is a subclass of A. If A has issues, it will fail B tests too. It would be nicer to get errors related to A test first. But overall, it shouldn't make a big difference really. – Mansour Feb 06 '12 at 17:02
  • 1
    If you have broken 2 or 3 tests with a code change, you'll notice the first failing test & try to fix it. After that, you'll run all tests again. If you a test failure for a different test this time, it would appear that your fix did work for the first test, when actually your change might not have done anything, but unittest just is running the tests in a different order. – fastmultiplication May 04 '12 at 04:31
  • 7
    For debugging, it makes lots of sense to have the (independent) tests ordered from simple to complex. – Michael Clerx Oct 22 '12 at 11:27
  • 1
    Wouldn't it be nice if you could specify the dependencies of each test? I agree it's generally better for each test to be purely independent of each other. But sometimes when dealing with databases or complex setup, it's simpler and more efficient (i.e., tests run faster) to introduce basic dependencies. – speedplane Apr 15 '16 at 13:53
  • I just got a case when one of my 30 tests takes ~40s to run as it tests all possible input combinations. So I'd like to keep this to run as the last as wouldn't care about this one if I can't at first pass my other quick test cases. – olivecoder Jun 29 '16 at 10:52
  • Some people like to have focused tests, so they have a test for 'MyClass()' and then 'MyClass(someValues)' and then they have separate tests for 'MyClass().foo()' and so forth. If the first two cases fail, there's little point in trying all the other tests. It'll just generate bogus noise. – kfsone Mar 31 '17 at 00:22
  • @zoul the answer to 'how do i do x ?' is not 'why do you want to do x'. – david.barkhuizen Sep 09 '17 at 09:24
  • 1
    In my experience it often is, however inconvenient such answers feel at the first moment. Feel free to disagree, though. – zoul Sep 10 '17 at 10:04
  • If it is important to run the tests in any order, the order of the tests should be random, which requires changing the default. – Tobias Hagge May 23 '18 at 17:44
8

From 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.

If you need set the order explicitly, use a monolithic test.

class Monolithic(TestCase):
  def step1(self):
      ...

  def step2(self):
      ...

  def steps(self):
    for name in sorted(dir(self)):
      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)

Check out this Stack Overflow question for details.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
morsik
  • 1,250
  • 14
  • 17
7

You should try the proboscis library. It will allow you to make tests order as well as set up any test dependencies. I use it and this library is truly awesome.

For example, if test case #1 from module A should depend on test case #3 from module B you CAN set this behaviour using the library.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Sergei Danielian
  • 4,938
  • 4
  • 36
  • 58
7

Don't rely on the order. If they use some common state, like the filesystem or database, then you should create setUp and tearDown methods that get your environment into a testable state, and then clean up after the tests have run.

Each test should assume that the environment is as defined in setUp, and should make no further assumptions.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
  • 1
    In integration tests you might need to execute tests sequentially in a certain order to duplicate your pipeline. – Zach Estela Feb 12 '19 at 22:34
7

There are a number of reasons for prioritizing tests, not the least of which is productivity, which is what JUnit Max is geared for. It's sometimes helpful to keep very slow tests in their own module so that you can get quick feedback from the those tests that that don't suffer from the same heavy dependencies. Ordering is also helpful in tracking down failures from tests that are not completely self-contained.

eradman
  • 1,996
  • 1
  • 17
  • 23
  • 3
    Sorry, but I tend to disagree. Unit tests shouldn't depend on each other, but it still often makes a lot of sense if they are executed in the order they were specified. Say, you have two functions ``a`` and ``b`` and ``b`` uses ``a``. Then it is much better if ``test_a`` is executed before ``test_b``, because if ``a`` contains an error you will spot that much earlier this way, instead of trying to find the bug in ``b``. – Elmar Zander Mar 13 '12 at 16:30
  • @ElmarZander - if `test_b` runs also `a`, then you might have a problem with your test structure, as `test_b` will end up testing not a single unit `b` but two: `b` and `a`. You should probably mock the result of `a` in your `test_b` instead. Unit tests ≠ integration tests. – mac Dec 23 '13 at 13:29
  • @mac Thanks, but I do know what integration tests are. What I wrote had nothing to with that, and no, I don't have a problem with my test structure. I'm just adhering to some structured design approach, where I compose more complex functions from simpler ones, and it would neither make sense nor be possible to mock every five-line-function by another five-line-function, but it does make a lot of sense to test the simpler ones before the more complex function built on top. – Elmar Zander Oct 16 '15 at 16:20
6

Here is a simpler method that has the following advantages:

  • No need to create a custom TestCase class.
  • No need to decorate every test method.
  • Use the unittest standard load test protocol. See the Python docs here.

The idea is to go through all the test cases of the test suites given to the test loader protocol and create a new suite but with the tests ordered by their line number.

Here is the code:

import unittest

def load_ordered_tests(loader, standard_tests, pattern):
    """
    Test loader that keeps the tests in the order they were declared in the class.
    """
    ordered_cases = []
    for test_suite in standard_tests:
        ordered = []
        for test_case in test_suite:
            test_case_type = type(test_case)
            method_name = test_case._testMethodName
            testMethod = getattr(test_case, method_name)
            line = testMethod.__code__.co_firstlineno
            ordered.append( (line, test_case_type, method_name) )
        ordered.sort()
        for line, case_type, name in ordered:
            ordered_cases.append(case_type(name))
    return unittest.TestSuite(ordered_cases)

You can put this in a module named order_tests and then in each unittest Python file, declare the test loader like this:

from order_tests import load_ordered_tests

# This orders the tests to be run in the order they were declared.
# It uses the unittest load_tests protocol.
load_tests = load_ordered_tests

Note: the often suggested technique of setting the test sorter to None no longer works because Python now sorts the output of dir() and unittest uses dir() to find tests. So even though you have no sorting method, they still get sorted by Python itself!

pierrebai
  • 61
  • 1
  • 1
5

A simple method for ordering "unittest" tests is to follow the init.d mechanism of giving them numeric names:

def test_00_createEmptyObject(self):
    obj = MyObject()
    self.assertIsEqual(obj.property1, 0)
    self.assertIsEqual(obj.dict1, {})

def test_01_createObject(self):
    obj = MyObject(property1="hello", dict1={"pizza":"pepperoni"})
    self.assertIsEqual(obj.property1, "hello")
    self.assertIsDictEqual(obj.dict1, {"pizza":"pepperoni"})

def test_10_reverseProperty(self):
    obj = MyObject(property1="world")
    obj.reverseProperty1()
    self.assertIsEqual(obj.property1, "dlrow")

However, in such cases, you might want to consider structuring your tests differently so that you can build on previous construction cases. For instance, in the above, it might make sense to have a "construct and verify" function that constructs the object and validates its assignment of parameters.

def make_myobject(self, property1, dict1):  # Must be specified by caller
    obj = MyObject(property1=property1, dict1=dict1)
    if property1:
        self.assertEqual(obj.property1, property1)
    else:
        self.assertEqual(obj.property1, 0)
    if dict1:
        self.assertDictEqual(obj.dict1, dict1)
    else:
        self.assertEqual(obj.dict1, {})
    return obj

def test_00_createEmptyObject(self):
    obj = self.make_object(None, None)

def test_01_createObject(self):
    obj = self.make_object("hello", {"pizza":"pepperoni"})

def test_10_reverseProperty(self):
    obj = self.make_object("world", None)
    obj.reverseProperty()
    self.assertEqual(obj.property1, "dlrow")
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
kfsone
  • 23,617
  • 2
  • 42
  • 74
  • *Why* does that work? Because they are executed in alphabetic order? Is that guaranteed? – Peter Mortensen Feb 05 '21 at 17:52
  • OK, I found it in [*unittest — Unit testing framework*, section *Organizing test code*](http://docs.python.org/library/unittest.html): *"The order in which the various tests will be run is determined by sorting the test method names with respect to the built-in ordering for strings."* – Peter Mortensen Feb 05 '21 at 18:08
  • @PeterMortensen That's fairly important info. I upvoted your answer :) – kfsone Feb 22 '23 at 17:53
4

There are scenarios where the order can be important and where setUp and Teardown come in as too limited. There's only one setUp and tearDown method, which is logical, but you can only put so much information in them until it gets unclear what setUp or tearDown might actually be doing.

Take this integration test as an example:

You are writing tests to see if the registration form and the login form are working correctly. In such a case the order is important, as you can't login without an existing account. More importantly the order of your tests represents some kind of user interaction. Where each test might represent a step in the whole process or flow you're testing.

Dividing your code in those logical pieces has several advantages.

It might not be the best solution, but I often use one method that kicks off the actual tests:

def test_registration_login_flow(self):
    _test_registration_flow()
    _test_login_flow()
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Jonas Geiregat
  • 5,214
  • 4
  • 41
  • 60
2

I agree with the statement that a blanket "don't do that" answer is a bad response.

I have a similar situation where I have a single data source and one test will wipe the data set causing other tests to fail.

My solution was to use the operating system environment variables in my Bamboo server...

(1) The test for the "data purge" functionality starts with a while loop that checks the state of an environment variable "BLOCK_DATA_PURGE." If the "BLOCK_DATA_PURGE" variable is greater than zero, the loop will write a log entry to the effect that it is sleeping 1 second. Once the "BLOCK_DATA_PURGE" has a zero value, execution proceeds to test the purge functionality.

(2) Any unit test which needs the data in the table simply increments "BLOCK_DATA_PURGE" at the beginning (in setup()) and decrements the same variable in teardown().

The effect of this is to allow various data consumers to block the purge functionality so long as they need without fear that the purge could execute in between tests. Effectively the purge operation is pushed to the last step...or at least the last step that requires the original data set.

Today I am going to extend this to add more functionality to allow some tests to REQUIRE_DATA_PURGE. These will effectively invert the above process to ensure that those tests only execute after the data purge to test data restoration.

Rob Rose
  • 1,806
  • 22
  • 41
kingsisyphus
  • 146
  • 4
  • 1
    Kudos for the first paragraph. "Don't do that" always comes from some kind of inexperience, i.e. a developer who has never had to automate integration or user acceptance testing. – pmneve Dec 12 '17 at 17:50
1

I have implemented a plugin, nosedep, for Nose which adds support for test dependencies and test prioritization.

As mentioned in the other answers/comments, this is often a bad idea, however there can be exceptions where you would want to do this (in my case it was performance for integration tests - with a huge overhead for getting into a testable state, minutes vs. hours).

A minimal example is:

def test_a:
  pass

@depends(before=test_a)
def test_b:
  pass

To ensure that test_b is always run before test_a.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Zitrax
  • 19,036
  • 20
  • 88
  • 110
1

See the example of WidgetTestCase on Organizing test code. It says that

Class instances will now each run one of the test_*() methods, with self.widget created and destroyed separately for each instance.

So it might be of no use to specify the order of test cases, if you do not access global variables.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
jiakai
  • 501
  • 2
  • 14
0

The philosophy behind unit tests is to make them independent of each other. This means that the first step of each test will always be to try to rethink how you are testing each piece to match that philosophy. This can involve changing how you approach testing and being creative by narrowing your tests to smaller scopes.

However, if you still find that you need tests in a specific order (as that is viable), you could try checking out the answer to Python unittest.TestCase execution order .

carrvo
  • 511
  • 5
  • 11
0

It seems they are executed in alphabetical order by test name (using the comparison function between strings).

Since tests in a module are also only executed if they begin with "test", I put in a number to order the tests:

class LoginTest(unittest.TestCase):
    def setUp(self):
        driver.get("http://localhost:2200")

    def tearDown(self):
        # self.driver.close()
        pass
    def test1_check_at_right_page(self):
        ...
        assert "Valor" in driver.page_source

    def test2_login_a_manager(self):
        ...
        submit_button.click()
        assert "Home" in driver.title

    def test3_is_manager(self):
        ...

Note that numbers are not necessarily alphabetical - "9" > "10" in the Python shell is True for instance. Consider using decimal strings with fixed 0 padding (this will avoid the aforementioned problem) such as "000", "001", ... "010"... "099", "100", ... "999".

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Jonathan Ma
  • 353
  • 3
  • 11
-2

Contrary to what was said here:

  • tests have to run in isolation (order must not matter for that)

and

  • ordering them is important because they describe what the system do and how the developer implements it.

In other words, each test brings you information of the system and the developer logic.

So if this information is not ordered it can make your code difficult to understand.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
gregorySalvan
  • 371
  • 2
  • 9
  • 1
    There are some scenarios where tests *need* to run in a specific order. For example: I have an API wrapper which logs into an external server. The login *needs* to happen before any other unittest. – Stevoisiak Nov 06 '17 at 19:11
  • @StevenVascellaro Tests you're describing are not unit tests, the topic is about unit testing, and you NEVER have scenario where tests need to run in a specific order. It's a code smell about bad design or wrong tests. If you write such kind of tests, you'd better review what you know about testing, because to me the tests you're describing are useless and make the code hard to change. Think about it, you're talking to test an external system, which should already be tested. Focus on YOUR system that's what you're testing. – gregorySalvan Nov 08 '17 at 20:55
  • 1
    The topic is not about unit testing but about using unittest to automate integration testing. As a QA Test Automation engineer, my job is to do integration and browser-based 'end-to-end' testing. Unit testing (whatever the tool is) is in the domain of the developer doing test first development or doing their best to turn over clean code to the next step in testing. – pmneve Dec 12 '17 at 17:45
  • sometimes i need to meta-test some functions to test that my test is reliable, that's why i want an order – izzulmakin Mar 01 '21 at 10:10
-2

To randomise the order of test methods you can monkey patch the unittest.TestLoader.sortTestMethodsUsing attribute

if __name__ == '__main__':
    import random
    unittest.TestLoader.sortTestMethodsUsing = lambda self, a, b: random.choice([1, 0, -1])
    unittest.main()

The same approach can be used to enforce whatever order you need.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Tomasz Swider
  • 2,314
  • 18
  • 22