Skip to content Skip to sidebar Skip to footer

Instantiate Python Unittest.testcase With Arguments

I would like to iterate over a list of items, and run an assertion on each of them. One example might be checking whether each number in a list is odd. TestCase: class TestOdd(unit

Solution 1:

According to "Python unit testing: parametrized test cases", published in Eli Bendersky's blog:

Python’s standard unittest library is great and I use it all the time. One thing missing from it, however, is a simple way of running parametrized test cases. In other words, you can’t easily pass arguments into a unittest.TestCase from outside.

Eli's solution is inheriting unittest.TestCase into ParametrizedTestCase. I'm not sure about copyright issues, so I won't copy-paste the code here.

If there is any better solution, I will be happy to accept it.

Solution 2:

Same can be achieved using class attributes.

classTestOdd1(unittest.TestCase):
    NUMBER=1defrunTest(self):
        """Assert that the item is odd"""
        self.assertTrue( self.NUMBER % 2 == 1, "Number should be odd")

classTestOdd2(TestOdd1):
    NUMBER=2if __name__ == '__main__':
    unittest.main()

The unittesting will discover them automatically, so no need to create a suite.

If you want to avoid using a TestCase for base class, you can use multiple inheritance:

from unittest import TestCase, main

classTestOdd:
    defrunTest(self):
        """Assert that the item is odd"""
        self.assertTrue( self.NUMBER % 2 == 1, "Number should be odd")

classTestOdd1(TestOdd, TestCase):
    NUMBER=1classTestOdd2(TestOdd, TestCase):
    NUMBER=2if __name__ == '__main__':
    main()

Solution 3:

I would go this way:

TestCase file containing test logic itself:

import my_config
from unittest import TestCase

classTestOdd(unittest.TestCase):
    defrunTest(self):
        """Assert that the item is odd"""
        self.assertTrue(int(my_config.options['number']) %2==1, "Number should be odd")

then in the TestSuite file:

import argparse
import my_config
import TestCase

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('-num', '--number', type=int, default=0)
    my_config.options = parser.parse_args()
    
    suite_case = unittest.TestLoader().loadTestsFromTestCase(TestCase)
    test_suite = unittest.TestSuite([suite_case])

    unittest.TextTestRunner(verbosity=1, failfast=True, buffer=False).run(test_suite)

my_config.py helping file:

options = {}

and then from command line we can execute:

python3 -m unittest TestSuite.py --number=1
python3 -m unittest TestSuite.py --number=2
.
.
python3 -m unittest TestSuite.py --number=1000

Or execution calling from command line could be done by using for cycle inside Shell script.

Post a Comment for "Instantiate Python Unittest.testcase With Arguments"