[TIP] pytest fixture autouse question
holger krekel
holger at merlinux.eu
Thu Jan 10 03:12:04 PST 2013
On Wed, Jan 09, 2013 at 17:29 -0500, Pella,Chris wrote:
> > -----Original Message-----
> > From: holger krekel [mailto:holger at merlinux.eu]
> > Sent: January-04-13 4:57 AM
> > To: Pella,Chris
> > Cc: testing-in-python at lists.idyll.org
> > Subject: Re: [TIP] pytest fixture autouse question
> >
> > Hey Chris,
> >
> > On Thu, Jan 03, 2013 at 14:20 -0500, Pella,Chris wrote:
> > > I may have a misunderstanding of when session-level autouse fixtures are
> > called. I am trying to create a session level fixture that runs before once per
> > test session before any class setup is called.
> >
> > It's a known issue of mixing xUnit and pytest style fixtures. See here for a
> > discussion and the planned resolution:
> >
> > http://mail.python.org/pipermail/pytest-dev/2012-December/002172.html
> >
> > For now, you can work around the issue like this::
> >
> > class TestX:
> > @pytest.fixture(scope="class", autouse=True)
> > def setup_on_class(self):
> > ...
> >
> I now see a problem with this workaround ... e.g. If I run the following code it will throw an exception because cls.skip_me is no longer accessible.
>
> class TestThis():
> @pytest.fixture(scope="class", autouse=True)
> def setup_class(cls):
> #cls.skip_me = True
> cls.skip_me = False
>
> def test_one(cls):
> if cls.skip_me == True:
> pytest.skip("can't test this")
> assert 1
>
> def test_two(cls):
> if cls.skip_me == True:
> pytest.skip("can't test this")
> assert 1
>
> def teardown_class(cls):
> pass
sorry, my bad. I forgot to write down @classmethod:
@classmethod
@pytest.fixture(scope="class", autouse=True)
def setup_class(cls):
#cls.skip_me = True
...
This will make the above example work. note though, that the test
methods should better "self", not "cls". All class attributes
(including "TestThis.skip_me") will be visible on the "self" instance
seen by the test methods.
best,
holger
you need to use
>
> > This will execute after th "session" scoped installer that you describe below.
> >
> > cheers,
> > holger
> >
> > > I have conftest.py file in the directory where the tests reside and in there I
> > have some code that installs some client software on the test node. We only
> > want to install the client once per session for all the test classes that get
> > executed.
> > >
> > > @pytest.fixture(scope="session",autouse=True)
> > > def installer_fixture(request):
> > > """
> > > Installs client at the session level
> > > """
> > > print "installing"
> > > client = InstallClient()
> > > client.install()
> > > time.sleep(60)
> > >
> > > def uninstall():
> > > """
> > > Uninstall client
> > > """
> > > client.uninstall()
> > >
> > > request.addfinalizer(uninstall)
> > >
> > >
> > > I assumed that this would execute prior to any test setup for a particular
> > test class since it is a session level fixture, but I find that setup_class()
> > executes before the clients get installed.
> > >
> > > e.g. with some toy test code I find that the class setup gets executed
> > before the fixture. This is not the behaviour I wanted or expected.
> > >
> > > import pytest
> > >
> > >
> > > class TestMe:
> > >
> > > def setup_class(cls):
> > > pytest.set_trace()
> > > print "setup"
> > >
> > > def test_one(cls):
> > > print "test one"
> > >
> > > def teardown_class(cls):
> > > print "teardown"
> > >
> > >
> > >
> > >
> > > Thanks,
> > > chris
> > >
> > > The information contained in this electronic mail transmission may be
> > > privileged and confidential, and therefore, protected from disclosure.
> > > If you have received this communication in error, please notify us
> > > immediately by replying to this message and deleting it from your
> > > computer without copying or disclosing it.
> > >
> > >
> > > _______________________________________________
> > > testing-in-python mailing list
> > > testing-in-python at lists.idyll.org
> > > http://lists.idyll.org/listinfo/testing-in-python
>
> The information contained in this electronic mail transmission
> may be privileged and confidential, and therefore, protected
> from disclosure. If you have received this communication in
> error, please notify us immediately by replying to this
> message and deleting it from your computer without copying
> or disclosing it.
>
>
>
More information about the testing-in-python
mailing list