Nifty Nose Functionality

I just put the finishing touches on some automated regression tests for figleaf, my simple code coverage analysis program. In the process I found a nice use for nose's yield test constructor.

Briefly, nose lets you write code like this:

def test()
   for i in range(0, 10):
      yield check_num, i, 2*i

def check_num(i, j):
   assert 2*i == j

This defines a set of 10 tests, each of which are executed and counted independently.

(I think this behavior is based on py.test but I could be wrong.)

I hadn't had any use for this kind of test before, but when considering how to write the figleaf tests, I realized that this would be a really neat way of basing regressions tests on individual files.

Suppose I have a directory full of .py files together with coverage information, and I want to execute each .py file and check the coverage results against the previously recorded coverage information. Easy! Here's the code:

def test():
   for filename in os.listdir(testdir):
       if filename.startswith('tst') and filename.endswith('.py'):
           yield compare_coverage, filename, filename + '.cover'

where compare_coverage(pyfile, cover_file) is a function that executes the given filename and compares current coverage data with the pre-recorded stuff.

This saves me having to do something silly like write an individual test loader for each .py file, which would be cumbersome and perhaps brittle.

--titus


Legacy Comments

Posted by Eduardo Padoan on 2007-02-07 at 06:30.

> (I think this behavior is based on py.test but I could be wrong.)
Yes, it is. It is called Generative test.  <a
href="http://codespeak.net/py/current/doc/test.html#generative-tests-
yielding-more-tests">http://codespeak.net/py/current/doc/test.html
#generative-tests-yielding-more-tests</a>

Posted by Jay Parlar on 2007-02-07 at 07:56.

It is in fact based on py.test. I asked Jason Pellerin to add this
functionallity last year, after I switched from py.test to nose for a
project and needed this kind of generation.

Posted by Terry Peppers on 2007-02-08 at 07:56.

I have a full suite of tests that are built on this very behavior.
Handy when you have a base test that you want to run with different
test values or in my case a single test against multiple web sites.

Comments !

social