Unittest - How do I code lots of simple tests
Paul Moore
pf_moore at yahoo.co.uk
Tue Oct 21 16:16:06 EDT 2003
One of the things I really dislike about Unittest (compared, say, to a
number of adhoc testing tricks I've used in the past, and to Perl's
"standard" testing framework) is that the testcase-as-a-class model
tends to imply a relatively high granularity in testing.
A good example of this comes from "Dive Into Python"
(http://diveintopython.org) section 7.3. Here, the author has written
a module which converts numbers to Roman numerals. The test case is
then
class KnownValues(unittest.TestCase):
knownValues = ( (1, 'I'), ... # 50-plus specific cases
def testToRomanKnownValues(self):
"""toRoman should give known result with known input"""
for integer, numeral in self.knownValues:
result = roman.toRoman(integer)
self.assertEqual(numeral, result)
Now, to my mind, the big problem here is that this *isn't* one test,
but rather 50 (or more). OK, the same checks are done if everything
succeeds, but
1. If a test fails, the rest are skipped! If there's a pattern to the
failures (the code handles numbers ending in 4 and 9 wrongly, for
example) it's much easier to find if all of the checks are
reported.
2. Psychologically, "52 tests succeeded" is a much bigger boost than
"1 test succeeded" (albeit this test covered 52 cases). And it's
not just psychology - we really *did* test 52 distinct conditions.
The only way I can see of producing the "true" number of tests is via
some form of ugly hack like
test_values = ((1, 'I'), ...)
class KnownValues(unittest.TestCase):
pass
for arabic, roman in test_values:
def test(self):
result = roman.toRoman(arabic)
self.assertEqual(roman, result)
setattr(KnownValues, 'test_%s_%s' % (arabic, roman), test)
But I can't really see that as the "right approach".
Can anyone suggest a more reasonable way of running this sort of
table-driven test via unittest?
Maybe I should use doctest instead, but to be honest, I prefer the
overall infrastructure of unittest (for real tests). It's just this
particular issue that really bugs me...
Paul.
--
This signature intentionally left blank
More information about the Python-list
mailing list