[py-dev] Failing to manage test state of a module with py.test

Pierre Rouleau prouleau001 at gmail.com
Thu Nov 16 22:22:14 CET 2006


On 11/16/06, Maciek Fijalkowski <fijal at genesilico.pl> wrote:
> Pierre Rouleau wrote:
>
> >Hi all,
> >
> >Using the latest of py.test (svn 34683), I can't seem to be able to
> >control a module test setup using setup_module() as described in
> >section 2.15 of http://codespeak.net/py/current/doc/test.html
> >
> >The document gives the following example:
> >
> >def setup_module(module):
> >    """ setup up any state specific to the execution
> >        of the given module.
> >    """
> >
> >Now, I am assuming that the the definition of setup_module() must be
> >written /inside/ the test script that test the module-under-test
> >tested, right?
> >
> >Second, I am also assuming that setup_module's argument is the name of
> >the module-under-test.
> >
> >Given the above assumptions, if I write a test script to test roman.py
> > would be called test_roman.py and would include
> >
> >def setup_module(roman):
> >    print 'SETTING up roman for testing....'
> >
> >And if I ran py.test -s test_roman.py I should be able to see the
> >printed output. I don't.
> >
> >So, what do i do wrong here?
> >
> >Thanks
> >_______________________________________________
> >py-dev mailing list
> >py-dev at codespeak.net
> >http://codespeak.net/mailman/listinfo/py-dev
> >
> >
> Hum. I cannot reproduce you problem (I can clearly see 'SETTING up
> roman...' just after [5024] and before any dots. Yes, this is supposed
> to go to main body of testing module and it receives module object
> itself (not a name)
>

Sorry, i also got it working if all the setup_module() does is
printing the message.

I forgot to mention that the setup_module() was setting the value of
knownValues after declaring it global.  I though that it would then be
available to all test functions (as is the case with nose), but it's
not.

The setup_module I have looks like this:

def setup_module(roman):
    print 'SETTING UP........................'

    global knownValues
    knownValues = ( (1, 'I'),
                    (2, 'II'),
                    (3, 'III'),
                    (4, 'IV'),
                    (5, 'V'),
                    (6, 'VI'),
                    (7, 'VII'),
                    ....


I wanted to know if the values set up by the setup_module function
would be available to the test functions.  The test function that
fails is failing because knownValues is not accessible to the check
inside test_known_values.

def test_known_values() :
    """Test all known values."""

    def check(number, roman_numeral):
        print 'test_known_values Testing: ', roman_numeral
        assert roman.toRoman(number) == roman_numeral
        assert roman.fromRoman(roman_numeral) == number
        # all Roman numerals should be in upper case
        assert roman_numeral.upper() == roman_numeral
        # lower case Roman numerals are not accepted
        raises(roman.InvalidRomanNumeralError, roman.fromRoman,
roman_numeral.lower())

    tested_numbers = []

    # test the numbers in the table above
    for number, roman_numeral in knownValues:
        yield check, number, roman_numeral
        tested_numbers.append(number)

    # test the others
    for number in xrange(1,5000):
        if number not in tested_numbers:
            yield check, number, roman.toRoman(number)



Note that nose is able to recover the global variable and the test
succeeds in nosetests. py.test does not seem able to do it.  It's not
that I absolutely want to use global variables, but I wanted to checks
the module setup mechanism.

--

P.R.



More information about the Pytest-dev mailing list