Running a subset of test case methods

Sometimes it's convenient to run only a subset of test methods in a given test case. This recipe will show how to run either the whole test case, or pick a subset from the command line.

How to do it...

The following steps show how to code a command-line script to run subsets of tests:

  1. Create a new file named recipe4.py in which to put all the code for this recipe.
  2. Pick a class to test. In this case, we will use our Roman numeral converter.
    class RomanNumeralConverter(object):
      def __init__(self, roman_numeral):
        self.roman_numeral = roman_numeral
        self.digit_map = {"M":1000, "D":500, "C":100, "L":50, "X":10, "V":5, "I":1}
    
      def convert_to_decimal(self):
        val = 0
        for char in self.roman_numeral:
          val += self.digit_map[char]
        return val
  3. Create a test class using the same name as the class under test with Test appended to the end.
    import unittest
    class RomanNumeralConverterTest(unittest.TestCase):
  4. Create several test methods.
      def test_parsing_millenia(self):
        value = RomanNumeralConverter("M")
        self.assertEquals(1000, value.convert_to_decimal())
    
      def test_parsing_century(self):
        value = RomanNumeralConverter("C")
        self.assertEquals(100, value.convert_to_decimal())
  5. Write a main runner that either runs the entire test case or accepts a variable number of test methods.
    if __name__ == "__main__":
      import sys
      suite = unittest.TestSuite()
      if len(sys.argv) == 1:
        suite = unittest.TestLoader().loadTestsFromTestCase(
                      RomanNumeralConverterTest)
      else:
        for test_name in sys.argv[1:]:
          suite.addTest(
            RomanNumeralConverterTest(test_name))
    
      unittest.TextTestRunner(verbosity=2).run(suite)
  6. Run the recipe with no extra command-line arguments, and see it run all the tests. Also run it with a test method name, and see it run only the specified test method.
    How to do it...

How it works...

For this test case, we coded a couple of test methods. But instead of simply running all the tests, or defining a fixed list, we used Python's sys library to parse the command-line arguments. If there are no extra arguments, it runs the entire test case. If there are extra arguments, then they are assumed to be test method names. It uses unittest's inbuilt ability to specify test method names when instantiating RomanNumeralConverterTest.

Tip

Python 2.7 has this built in; Python 2.6 and earlier versions don't

Python 2.6 doesn't have this feature, which makes this recipe useful. If we are using Python 2.7, there is a command-line version we can use. If we need to support multiple versions of Python, this recipe can be quite handy.

..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset
18.119.28.108