Hi all,

how about using proper context managers in all cases

if a class that implements the context manager protocol is marked as fixture, it can be used instead


so we would use

@pytest.fixture
@contextlib.contextmanager
def foo(...):
  ...

however the contextlib stuff might be a bit messy to deal with
so a pytest.contextmanager might be necessary

im -1 on the flag

-- Ronny

On 05/09/2013 03:56 PM, holger krekel wrote:
Hi Bruno, Andreas, all,

yesterday in my in-house course i demonstrated the change.  Somebody
pointed out rightly that with 2.3.5 you are allowed to do:

     @pytest.fixture
     def genfix():
         yield 1
         yield 2

Which means that when you write a test you can use the fixture as a generator:

     def test_gen(genfix):
         for x in genfix:
             # ...

This is probably used by very few people but to be on the safe side,
we probably should introduce a flag like this:

     @pytest.fixture(ctx=True)  # signal this is a context manager style fixture
     def fix():
         yield 1

What do you think?  Any other suggestions for the flag name?

I'd rather not introduce something like @pytest.contextfixture
because it would be a duplication of the API (scope, params).
But i am open to be convinced otherwise.

cheers,
holger



On Sun, May 05, 2013 at 10:40 -0300, Bruno Oliveira wrote:
Very nice! I always thought the "request.addfinalizer" mechanism somewhat
cumbersome. :)


On Sun, May 5, 2013 at 10:05 AM, holger krekel<[email protected]>  wrote:

Hi all,

after having been asked by Andreas Pelme and Vladimir Keleshev, repeatedly,
i finally tried to allow fixture functions to be context managers like
this:

     @pytest.fixture
     def myfixture():
         print "setup"
         yield val
         print "teardown"

With this, you don't need to use "request.addfinalizer" - pytest does
this by detecting your yield.  I checked this into trunk to allow
experimentation - it seems to work fine with scopes and parametrization.
For pytest, it's really just a slightly different "fixture function
calling"
protocol, contained in this commit:


https://bitbucket.org/hpk42/pytest/commits/b93ac0cdae02effaa3c136a681cc45bba757fe46

Note that i don't plan to extend this yield mechanism to parametrization
as that would meanparametrization at test execution time, rather than at
collection time.  It would be both conceptually and implementation wise
hard to do i think.

The change is committed to trunk, and you can also do:

     pip install -i http://pypi.testrun.org -U pytest

to get pytest-2.3.6.dev2 at least.

feedback welcome, actually without people actively
wanting it, it might be thrown out again ;)

holger


_______________________________________________
Pytest-dev mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pytest-dev

_______________________________________________
Pytest-dev mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pytest-dev

_______________________________________________
Pytest-dev mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pytest-dev

Reply via email to