<div dir="ltr"><div><div><div><div>Hi Holger,<br><br></div>Thank you for your response!<br><br></div>No, we haven't switched py.test versions. We just move all setup/teardown procedures from pytest hooks to fixtures.<br>
<br></div>I'll update issue #498.<br><br></div>Thank you!<br>Anton<br></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Mon, Apr 7, 2014 at 1:51 PM, holger krekel <span dir="ltr"><<a href="mailto:holger@merlinux.eu" target="_blank">holger@merlinux.eu</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Anton,<br>
<br>
just to understand better -- you also switched pytest versions or not?<br>
A mere change from "pytest_funcarg__" syntax to "@pytest.fixture"<br>
syntax should not have such an effect.<br>
<br>
There also is issue498 which might be related, btw:<br>
<a href="https://bitbucket.org/hpk42/pytest/issue/498/function-scope-fixture-with-failing" target="_blank">https://bitbucket.org/hpk42/pytest/issue/498/function-scope-fixture-with-failing</a><br>
<br>
Could you file an issue against the tracker and/or add to 498?<br>
<br>
best and thanks,<br>
<br>
holger<br>
<div><div class="h5"><br>
On Mon, Apr 07, 2014 at 13:43 +0300, Anton P wrote:<br>
> Hi All,<br>
><br>
> Recently we switched our test environment from funcargs to fixtures and<br>
> found unexpected and unwanted behaviour: In case fixture finalizer failed<br>
> next time fixture won't be set up.<br>
><br>
> Here I have 2 fixtures:<br>
> env_main - module level<br>
> env - functional level (env_main child)<br>
><br>
> In pytest output you can see message that env was created before test_1<br>
> ("INIT_ENV" message). Then it failed on finalizer after "DESTROY ENV"<br>
> message.<br>
> PROBLEM: test_2 that requires env fixture is launched but without env<br>
> fixture.<br>
> I expect that function level fixture will be recreated for the next test<br>
> function, or at least all other test functions will fail without launching.<br>
> I don't see any reason why they have to be launched in case fixture cannot<br>
> be set up. But it's better to try to recreate fixture for next iteration<br>
> (e.g. next function if scope is function)<br>
><br>
> I see there was an issue #287 which is marked as resolved. But as for me it<br>
> could be reopened.<br>
><br>
> I see that in case we add more test cases, then the fixture will be created<br>
> for the 3d test function but again skipped for the 4th test function.<br>
><br>
> Is it possible to change current default behaviour?<br>
><br>
> Thank you in advance!<br>
> Anton<br>
><br>
> P.S.<br>
> Please find code files attached.<br>
><br>
> Here is execution log:<br>
><br>
> $ py.test -v -s test_params.py<br>
> ============================ test session starts<br>
> ============================<br>
> platform linux2 -- Python 2.7.3 -- py-1.4.20 -- pytest-2.5.2 --<br>
> /usr/bin/python<br>
> plugins: cov<br>
> collected 2 items<br>
><br>
> test_params.py:4: TestClass.test_1 Create ENV_MAIN<br>
> INIT ENV<br>
> PASSEDDESTROY ENV<br>
><br>
> test_params.py:4: TestClass.test_1 ERROR<br>
> test_params.py:7: TestClass.test_2 PASSEDDestroy ENV_MAIN<br>
><br>
><br>
> ================================== ERRORS<br>
> ===================================<br>
> ___________________ ERROR at teardown of TestClass.test_1<br>
> ___________________<br>
><br>
> self = <conftest.EnvTest instance at 0x2025878><br>
><br>
>     def teardown(self):<br>
>         print "DESTROY ENV"<br>
> >       assert 0<br>
> E       assert 0<br>
><br>
> conftest.py:30: AssertionError<br>
> ===================== 2 passed, 1 error in 0.01 seconds<br>
> =====================<br>
<br>
</div></div>> import pytest<br>
> import sys<br>
><br>
> class Env():<br>
>     def __init__(self):<br>
>         self.env = 1<br>
><br>
>     def create(self):<br>
>         print "Create ENV_MAIN"<br>
><br>
>         return self.env<br>
><br>
>     def destroy(self):<br>
>         print "Destroy ENV_MAIN"<br>
><br>
><br>
> class EnvTest():<br>
><br>
>     def __init__(self, request, env):<br>
>         self.request = request<br>
>         self.env = env<br>
>         self.request.node.call_status = False<br>
><br>
>     def setup(self):<br>
>         print "INIT ENV"<br>
>         self.request.node.call_status = True<br>
<div class="">><br>
>     def teardown(self):<br>
>         print "DESTROY ENV"<br>
>         assert 0<br>
><br>
><br>
><br>
</div>> @pytest.fixture(scope="module")<br>
> def env_main(request):<br>
>     env_wrapper = Env()<br>
><br>
>     request.addfinalizer(env_wrapper.destroy)<br>
>     request.config.env = env_wrapper.create()<br>
><br>
>     return env_wrapper<br>
><br>
> @pytest.fixture<br>
> def env(request, env_main):<br>
>     env = EnvTest(request, env_main)<br>
>     request.addfinalizer(env.teardown)<br>
>     env.setup()<br>
><br>
>     return env_main<br>
<br>
> import pytest<br>
><br>
> class TestClass():<br>
>     def test_1(self, env):<br>
>         pass<br>
><br>
>     def test_2(self, env):<br>
>         pass<br>
<br>
> _______________________________________________<br>
> Pytest-dev mailing list<br>
> <a href="mailto:Pytest-dev@python.org">Pytest-dev@python.org</a><br>
> <a href="https://mail.python.org/mailman/listinfo/pytest-dev" target="_blank">https://mail.python.org/mailman/listinfo/pytest-dev</a><br>
<br>
</blockquote></div><br></div>