[TIP] dynamically retrieving fixtures which depend on generated parameters from the comand-line

holger krekel holger at merlinux.eu
Fri May 17 01:05:42 PDT 2013


Hi Elizabeth,

On Thu, May 16, 2013 at 19:05 +0000, Elizabeth Lin wrote:
> Hi Holger,
> 
> Thanks again for the help.  I was looking at it some more and ended up
> having "fixA" not rely on the generatedfix fixture, and instead just
> re-using that code as a regular function.  Seems a little cleaner since it
> avoids having to use skips or removal of unneeded params.  Mods here in
> case you're interested:
> https://gist.github.com/elizabethlin/7754f0324b8f7b1c7388

That looks simpler, indeed!

> the collection vs setup time info is useful.  I remember there used to be
> a text file included with the py package that included architecture
> information, which was also very useful.  Is this kind of info still
> available somewhere?

I don't think information was lost but i am not sure what exactly you
are refering to.  Maybe checkout http://pytest.org and in particular:

    http://pytest.org/latest/plugins.html#py-test-hook-reference

for information on hooks.  There isn't really an "architecture" page
at the moment but i agree there should.

cheers,
holger


> Thanks,
> Liz
> 
> 
> On 5/15/13 12:54 AM, "holger krekel" <holger at merlinux.eu> wrote:
> 
> >Hi Elizabeth,
> >
> >On Tue, May 14, 2013 at 22:14 +0000, Elizabeth Lin wrote:
> >> Here's the simplified example code:
> >> https://gist.github.com/elizabethlin/7754f0324b8f7b1c7388
> >> 
> >> this gets generates the following tests:
> >> test_example.py:31: TestExample.test_one[std] FAILED
> >> test_example.py:35: TestExample.test_two[std] FAILED
> >> test_example.py:39: TestExample.test_three[std] FAILED
> >> test_example.py:31: TestExample.test_one[virt] FAILED
> >> test_example.py:35: TestExample.test_two[virt] FAILED
> >> 
> >> 
> >>  when really I want
> >> test_example.py:31: TestExample.test_one[std] FAILED
> >> test_example.py:35: TestExample.test_two[std] FAILED
> >> test_example.py:39: TestExample.test_three[std] FAILED
> >> test_example.py:31: TestExample.test_one[virt-typeA] FAILED
> >> test_example.py:35: TestExample.test_two[virt-typeA] FAILED
> >> " [virt-typeB]
> >> " [virt-typeB]
> >> 
> >> Can someone help me out?  I imagine that pytest_generate_tests gets
> >>called at an earlier step, before the fixtures are executed, and at that
> >>time, it can't detect that we need the parametrization for generated fix
> >>to happen.  There's probably other reasons this won't work, but I'm
> >>having trouble decifering the pytest code, and the flow of it.
> >
> >you may or may not be aware of this:
> >
> >- test parametrization happens at collection time
> >- Fixture functions execute at setup time
> >
> >If you use "request.getfuncargvalue()" during test setup pytest has
> >no chance of knowing about this usage during collection.  If "virt" is a
> >heavy
> >resource and you want to avoid creating it, it's probably best to still
> >parametrize it into existence during collection but then shortcut
> >itshThanks
> >creation (i.e. pytest.skip() it) in its fixture function.
> >
> >You could remove not needed parameter sets in a
> >pytest_collect_modifyitems
> >hook (in a conftest.py) to avoid the skipping.  See a (somewhat hacky) way
> >to achieve that attached.   I wouldn't be very happy with using that
> >myself,
> >however, and rather try to aim for a simpler way even if it means writing
> >more verbose tests or more fixture names into test signatures.
> >
> >HTH,
> >
> >holger
> >
> 



More information about the testing-in-python mailing list