Define the test suite in the Test Module
Defining Test suites inside the test module.
Each test module can provide one or more methods that define a different test suite. One
Method can exercise all the tests in a given module; another method can define a participant
Subset.
1. Create a new file called recipe6.py in which to put our code for this recipe.
2. Pick a class to test. In this case, we will use our Roman numeral converter.
3. Create a test class using the same name as the class under test with test appended
To the end.
4. Write a series of test methods, including a setup method that creates a new
Instance of the romannumeralconverter for each test method.
5. Create some methods in the recipe's module (but not in the test case) that define
Different Test suites.
6. Create a runner that will iterate over each of these test suites and run them through
Unittest's texttestrunner.
7. Run the combination of Test suites, and see the results.
Test code:
Codeclass RomanNumeralConverter(object): def __init__(self): self.digit_map = {"M":1000, "D":500, "C":100, "L":50, "X":10, "V":5, "I":1} def convert_to_decimal(self, roman_numeral): val = 0 for char in roman_numeral: val += self.digit_map[char] return valimport unittestclass RomanNumeralConverterTest(unittest.TestCase): def setUp(self): self.cvt = RomanNumeralConverter() def test_parsing_millenia(self): self.assertEquals(1000, \ self.cvt.convert_to_decimal("M")) def test_parsing_century(self): self.assertEquals(100, \ self.cvt.convert_to_decimal("C")) def test_parsing_half_century(self): self.assertEquals(50, \ self.cvt.convert_to_decimal("L")) def test_parsing_decade(self): self.assertEquals(10, \ self.cvt.convert_to_decimal("X")) def test_parsing_half_decade(self): self.assertEquals(5, self.cvt.convert_to_decimal("V")) def test_parsing_one(self): self.assertEquals(1, self.cvt.convert_to_decimal("I")) def test_empty_roman_numeral(self): self.assertTrue(self.cvt.convert_to_decimal("") == 0) self.assertFalse(self.cvt.convert_to_decimal("") > 0) def test_no_roman_numeral(self): self.assertRaises(TypeError, \ self.cvt.convert_to_decimal, None) def test_combo1(self): self.assertEquals(4000, \ self.cvt.convert_to_decimal("MMMM")) def test_combo2(self): self.assertEquals(2010, \ self.cvt.convert_to_decimal("MMX")) def test_combo3(self): self.assertEquals(4668, \ self.cvt.convert_to_decimal("MMMMDCLXVIII"))def high_and_low(): suite = unittest.TestSuite() suite.addTest(\ RomanNumeralConverterTest("test_parsing_millenia")) suite.addTest(\ RomanNumeralConverterTest("test_parsing_one")) return suitedef combos(): return unittest.TestSuite(map(RomanNumeralConverterTest,\ ["test_combo1", "test_combo2", "test_combo3"]))def all(): return unittest.TestLoader().loadTestsFromTestCase(\ RomanNumeralConverterTest)if __name__ == "__main__": for suite_func in [high_and_low, combos, all]: print "Running test suite '%s'" % suite_func.func_name suite = suite_func() unittest.TextTestRunner(verbosity=2).run(suite)
Output result:
Running Test Suite 'high _ and_low'
Test_parsing_millenia (_ main _. romannumeralconvertertest)... OK
Test_parsing_one (_ main _. romannumeralconvertertest)... OK
----------------------------------------------------------------------
Ran 2 tests in 0.000 s
OK
Running Test Suite 'combos'
Test_combo1 (_ main _. romannumeralconvertertest)... OK
Test_combo2 (_ main _. romannumeralconvertertest)... OK
Test_combo3 (_ main _. romannumeralconvertertest)... OK
----------------------------------------------------------------------
Ran 3 tests in 0.000 s
OK
Running Test Suite 'all'
Test_combo1 (_ main _. romannumeralconvertertest)... OK
Test_combo2 (_ main _. romannumeralconvertertest)... OK
Test_combo3 (_ main _. romannumeralconvertertest)... OK
Test_empty_roman_numeral (_ main _. romannumeralconvertertest)... OK
Test_no_roman_numeral (_ main _. romannumeralconvertertest)... OK
Test_parsing_century (_ main _. romannumeralconvertertest)... OK
Test_parsing_decade (_ main _. romannumeralconvertertest)... OK
Test_parsing_half_century (_ main _. romannumeralconvertertest)... OK
Test_parsing_half_decade (_ main _. romannumeralconvertertest)... OK
Test_parsing_millenia (_ main _. romannumeralconvertertest)... OK
Test_parsing_one (_ main _. romannumeralconvertertest)... OK
----------------------------------------------------------------------
Ran 11 tests in 0.001 s
OK