Coder Perfect

Using unittest to run a single test. TestCase can be run from the command line.

Problem

The majority of test cases in our team are defined as follows:

ourtcfw.py is a “framework” class:

import unittest

class OurTcFw(unittest.TestCase):
    def setUp:
        # Something

    # Other stuff that we want to use everywhere

There are also many test cases, such as testMyCase.py:

import localweather

class MyCase(OurTcFw):

    def testItIsSunny(self):
        self.assertTrue(localweather.sunny)

    def testItIsHot(self):
        self.assertTrue(localweather.temperature > 20)

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

I place “__” in front of all other tests when I’m writing new test code and want to run it frequently to save time. However, it’s inconvenient, diverts my attention away from the code I’m creating, and the resulting commit noise is grating.

So, for example, when changing testItIsHot(), I’d like to be able to do the following:

$ python testMyCase.py testItIsHot

Then only run testItIsHot in unittest ()

What can I do to make it happen?

I tried to rewrite the if __name__ == “__main__”: part, but since I’m new to Python, I’m feeling lost and keep bashing into everything else than the methods.

Asked by Alois Mahdal

Solution #1

This works as you said; all you have to do now is supply the class name:

python testMyCase.py MyCase.testItIsHot

Answered by phihag

Solution #2

If you structure your test cases in the same way that you organize your code and utilize relative imports for modules in the same package, you can use the following command format:

python -m unittest mypkg.tests.test_module.TestClass.test_method

# In your case, this would be:
python -m unittest testMyCase.MyCase.testItIsHot

This is documented in Python 3: CLI stands for Command-Line Interface.

Answered by Ajay M

Solution #3

It might work as well as you think.

python testMyCase.py MyCase.testItIsHot

There’s also another way to see if testItIsHot is working:

    suite = unittest.TestSuite()
    suite.addTest(MyCase("testItIsHot"))
    runner = unittest.TextTestRunner()
    runner.run(suite)

Answered by Yarkee

Solution #4

If you look at the unittest module’s help, you’ll see that there are numerous ways to run test case classes from a module and test methods from a test case class.

python3 -m unittest -h

[...]

Examples:
  python3 -m unittest test_module               - run tests from test_module
  python3 -m unittest module.TestClass          - run tests from module.TestClass
  python3 -m unittest module.Class.test_method  - run specified test method
```lang-none

It does not require you to define a `unittest.main()` as the default behaviour of your module.

Answered by skqr

Solution #5

In case you want to run only tests from a specific class:

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

In Python 3.6, it works for me.

Answered by Bohdan

Post is based on https://stackoverflow.com/questions/15971735/running-a-single-test-from-unittest-testcase-via-the-command-line