Hi Morten, On Mon, Nov 01, 2010 at 21:47 +0100, Morten Brekkevold wrote: > We're using nose to run our test suite, but we are considering switching to > py.test. > > Some of our tests inherit Django's django.test.TestCase. This class mucks > about with the test invocation machinery inherited from unittest.TestCase to > add simple support for loading of database fixtures (no need to use super() > calls to parent class' setUp/tearDown). > > Unfortunately, all these tests will fail when run by py.test, whereas nose > runs thems fine.
Indeed, py.test (so far) only covers relatively plain unittest.TestCase usages. > After a quick look at the pytest_unittest plugin, it seems it does its own > tinkering and bypasses the normal way that unittest TestCases are invoked. > The setUp, test* and tearDown methods are called explicitly. Right. > AFAIK, to "manually" run a unittest.TestCase, you instantiate it using the > desired test method's name as an argument. The resulting instance is > callable; calling it will take care of running setUp, the desired method and > the tearDown. Originally the contributor (Guido Wesdorp) and me did this to maintain py.test's own separation of setup/teardown/call phases IIRC. > Django's TestCase class hooks into this by overriding > unittest.TestCase.__call__(), and adds pre_setup and post_teardown hooks as > well. Since py.test never uses TestCase instances as callables, Django > fixtures are never loaded and these tests fail. right. > I'm not familiar with the inner workings of py.test, so my question is: Is > this behavior intentional? If not, can we change it? It is intentional but we can (try to) change it :) > (this can be reproduced using http://dpaste.com/hold/268698/ - which doesn't > require Django, it just rips off Django's TestCase code) Thanks for providing the paste and your precise helpful info. As it happens i am in the process of preparing a pytest-2.0 and just went ahead and changed the unittest-plugin to invoke the test case as you described. This lets your example run. You can install it via:: pip install -i http://pypi.testrun.org pytest best in a virtualenv. Typing "py.test --version" should give you at least 2.0.0.dev18 Does this work better for you? sidenote: the unittest-plugin looks like this now:: http://bitbucket.org/hpk42/pytest/src/tip/pytest/plugin/unittest.py best, holger > > -- > Morten Brekkevold > UNINETT > _______________________________________________ > py-dev mailing list > py-dev@codespeak.net > http://codespeak.net/mailman/listinfo/py-dev > -- _______________________________________________ py-dev mailing list py-dev@codespeak.net http://codespeak.net/mailman/listinfo/py-dev