Unittest testing assert*() calls rather than methods?

Terry Reedy tjreedy at udel.edu
Thu Sep 29 00:03:48 CEST 2011


On 9/28/2011 10:16 AM, Tim Chase wrote:

> When performing unittest tests, I have a number of methods of the form
>
> def test_foo(self):
> data = (
> (item1, result1),
> ... #bunch of tests for fence-post errors
> )
> for test, result in data:
> self.assertEqual(process(test), result)
>
> When I run my tests, I only get a tick for running one the one test
> (test_foo), not the len(data) tests that were actually performed. Is
> there a way for unittesting to report the number of passed-assertions
> rather than the number of test-methods run?

In my view, unittest, based on JUnit from Java, is both overkill and 
inadequate for simple function testing of multiple input-output pairs. 
So I wrote my own short function test function that does just what I 
want, and which I can change if I change what I want.

Ben has described the combinatorial explosion solution. But if I were 
using unittest, I might do something like the following:

   def test_foo(self):
     data = (
       (item1, result1),
       ... #bunch of tests for fence-post errors
       )
     errors = []
     for input, expected in data:
       try:
         actual = process(input)
         if actual != expected: errors.append(input, expected, actual)
       except Exception as e:
         errors.append(input, expected, actual)
     self.assertEqual((0,[]), (len(errors),errors))

except that I would write a functest(func, iopairs) that returned the 
error pair. (This is essentially what I have done for for myself.)  I am 
presuming that one can run unittest so that it prints the unequal items.

-- 
Terry Jan Reedy




More information about the Python-list mailing list