On Sat, Jun 30, 2012 at 12:26 +0100, Floris Bruynooghe wrote:
> > On Sat, Jun 30, 2012 at 01:23 +0100, Floris Bruynooghe wrote:
> > > On Fri, Jun 29, 2012 at 10:55:23AM +0000, holger krekel wrote:
> > > >
> > > > def setup_directory(db):
> > > > # called when the first test in the directory tree is about
> > > > to execute
> > >
> > > I think the naming of these functions break the py.test convention,
> > > normally the only functions picked up from conftest.py start with
> > > pytest_. I can certainly imagine a conftest.py or plugin already
> > > having a setup_session function. These are new functions and do not
> > > provide a compatibility API with other testing frameworks, so I think
> > > they would be better named pytest_setup_session and
> > > pytest_setup_directory.
> >
> > I think using pytest_* hooks also has consistency problems:
> >
> > * hooks cannot usually receive arbitrary funcargs
>
> This is why a signature with a request/node for these might be better::
>
> def pytest_setup_session(session):
> session.getresource('db') # or .getfuncargvalue()?
> ...
>
> > * xUnit-style consistency: consider explaining the new functions
> > to someone only knowing setup_module/ class etc.
>
> As I tried to say before, they do not come for xUnit so I don't think
> this is too important. I think the consistency inside conftest.py is
> more important.
Well, pytest introduced setup_module/class and nose/unittest ported it.
I consider setup_directory (or setup_session) to be xUnit consistent
from a user perspective and maybe nose/unittest will also add it - i guess
there are extensions there implementing something like this already.
In generaly, if we go the route of making setup_X more powerful there
probably is less need for pytest_runtest_setup calls. The only difference
would be that runtest_setup is called in plugins/conftest.py whereas
setup_function/method need to be defined around the actual test code.
(TBH i wonder if setup_module/class/function/method could be allowed in
conftest.py files as well - in many cases there are easier to handle
than pytest_runtest_item(item) which does not even guarantee that
the item is a python function - could be a PEP8 checker Item).
> > I am wondering, however, do we even need a "setup_session"? setup_directory
> > should usually be enough, i guess, and it's more unlikely people used
> > that name already (and we could warn about setup_session in 2.X to
> > reserve introducing it in 2.X+1).
>
> Maybe not, but if you don't provide setup_session (or
> pytest_setup_session) then pytest_sessionstart will be used again
> when someone thinks of a reason to use it. And that's what you wanted
> to avoid.
We definitely need to provide prominent examples for whole-session setup
to avoid further usage of sessionstart or configure.
> [...]
> > If a setup-function has no body, then tests could just require it themselves
> > and that'd be enough. If there is a need, we could introduce a marker for
> > requiring funcarg-resources such that tests do not need to require it
> > in their signature.
>
> I'm not sure what that would save, either the test function must
> request the resource or must be marked to need the resource. If
> anything the second takes more work.
>
>
> As an aside however, one of my usecases for merged request/item
> objects was so I could put setup in a session-wide scoped funcarg but
> also automatically request this funcarg based on a mark::
>
> def pytest_runtest_setup(item):
> if 'needsdb' in item.keywords: # or a more explicit API
> item.getresource('db')
>
> I understand that this will still be possible via::
>
> def pytest_runtest_setup(item):
> if 'needsdb' in item.keywords:
> item.session.getresource('db')
>
> Or something similar to that.
It'd probably be best if this requirement is know at collection time so
--collectonly can present the complete picture. This could look like this::
def pytest_itemcollected(item):
if 'needsdb' in item.keywords:
item.applymarker(pytest.mark.needsresource("db"))
Also, the above issue of requiring a global resource could be expressed
like this::
def pytest_collection_finish(session):
session.applymarker(pytest.mark.needsresource("db"))
This should also in principle work well in case of a parametrized "db"
so that all tests requiring "db" can be run multiple times.
(I am not sure if the above already existing hooks fit well for that, however.)
best,
holger
_______________________________________________
py-dev mailing list
[email protected]
http://codespeak.net/mailman/listinfo/py-dev