[py-dev] RFC: draft new resource management API (v1)

holger krekel holger at merlinux.eu
Wed Jun 27 20:36:47 CEST 2012


Hi Floris,

On Wed, Jun 27, 2012 at 16:59 +0100, Floris Bruynooghe wrote:
> Hello Holger,
> 
> Thanks for the detailed document.  As I understand it the vast
> majority of the functionality is already possible using funcargs.
> Maybe a summary of the benefits over plain funcargs could be helpful?

makes sense.  Maybe some X versus Y examples would help.

> And some guidance for plugin writers on which of the two to choose
> would also be helpful.

Yip.  I think the examples should make it clear that probably the
new API is best fitting in most cases.

> Also, as a general observation I think it will become harder to find
> where a resource factory lives.  Before you could just grep for
> pytest_funcarg__foo which was actually quite nice, certainly when
> you're extending a resource at different levels.  This is still
> possible but not as easy.

Right, the grep-ability was intended behaviour.  It would remain
possible with the new resourcefactory markers i pondered in my
reply to Carl.  Otherwise you would need to invoke "py.test --funcargs"
to get the locations.

> Other then that I've got only one comment really:
> 
> On 27 June 2012 13:57, holger krekel <holger at merlinux.eu> wrote:
> > Setting resources as class attributes
> > -------------------------------------------
> >
> > If you want to make an attribute available on a test class, you can
> > use the resource_attr marker::
> >
> >    @pytest.mark.resource_attr("db")
> >    class TestClass:
> >        def test_something(self):
> >            #use self.db
> 
> I'm not convinced of creating a special purpose mark for this.
> Firstly it seems like an anti-pattern in py.test to me, more like
> xUnit style.

unittest/xUnit-compat is the main idea for this new marker. It would
work on pytest and unittest.TestCase classes alike.  It's also reminiscent
of Rob Collin's testscenario unittest-extension.

> easily done with::
> 
>    class TestClas(object):
>        @classmethod
>        def setup_class(cls, item):
>            cls.db = item.getresource('db')

Not really.  Here we would need to check if the setup_class() 
accepts an item parameter and setup_class methods do not follow
the hook-keyword-arg-calling convention.  Also passing an
item would be slightly arbitrary as the setup_class would
only be called once for all of its test items (functions).

> Also, I realised this API provides for what is probably most of the
> cases of where I want dynamic resources:
> 
> def pytest_setup_init(session):
>     for item in my_item_generator():
>         session.register_resource_factory(item.name, item)

Not sure i understand this idea.  Is it intended as a mixture of 
collection (my_item_generator) and setup (as the hook name suggests)? 

Note that the doc is currently wrong a bit as well - the register_factory
would need to happen at collection-time, not setup-time as the Module.setup()
wrongly suggested.

best,
holger

> (presuming atnode=session is the default)
> 
> 
> Regards,
> Floris
> 
> 
> -- 
> Debian GNU/Linux -- The Power of Freedom
> www.debian.org | www.gnu.org | www.kernel.org
> _______________________________________________
> py-dev mailing list
> py-dev at codespeak.net
> http://codespeak.net/mailman/listinfo/py-dev



More information about the Pytest-dev mailing list