Hi Brian, James,

Glad you both found it useful!

> Would it be worth PR-ing this suggestion into the docs?

Sure, sounds great. While this is definitely useful for this use case, it
is also a good generic testing advice, so definitely has a place in
pytest's docs.

Cheers,
Bruno.

On Thu, Jan 7, 2021 at 11:58 AM James Cooke <m...@jamescooke.info> wrote:

> Hi Bruno,
>
> This is great! Just echoing what Brian said - simple and obvious, and I'm
> disappointed that I didn't see it myself. I've integrated your suggestion
> today and the teardown tests are now much simpler, so this definitely
> helped.
>
> Would it be worth PR-ing this suggestion into the docs? My guess is that
> it would help many devs. Am happy to do the copypasta if you think it's
> worth it.
>
> Cheers,
>
> James
>
>
> On Thu, 7 Jan 2021, at 5:56 AM, Brian Okken wrote:
>
> Bruno,
>
> This is brilliant in that it’s obvious now that I see it, but didn’t occur
> to me before.
>
> Super cool.
>
> - Brian
>
> On Jan 6, 2021, at 10:26 AM, Bruno Oliveira <nicodde...@gmail.com> wrote:
>
> 
>
> Hi James,
>
> What I suggest you do in your case is to decouple your code from the
> fixture, so if you have something like this today:
>
>     @pytest.fixture(scope="module")
>     def my_work_reqs():
>         # some
>         # complicated
>         # setup
>         # code
>
>         yield  x # some result
>
>         # some
>         # complicated
>         # teardown
>         # code
>
> You can write instead:
>
>
>     @contextmanager
>     def handle_work_reqs():
>         # some
>         # complicated
>         # setup
>         # code
>         try:
>             yield x # some result
>         finally:
>             # some
>             # complicated
>             # teardown
>             # code
>
>     @pytest.fixture(scope="module")
>     def my_work_reqs():
>         with handle_work_reqs() as x:
>             yield x
>
> Now you can test handle_work_reqs normally, as it is not tied to the
> pytest framework.
>
> I like this approach in general, decoupling custom code from a framework
> is a great way to make it easier to test.
>
> HTH,
> Bruno.
>
>
>
> On Wed, Jan 6, 2021 at 2:37 PM James Cooke <m...@jamescooke.info> wrote:
>
> Hi all,
>
> It's been a while since I've had to write a complicated and robust pytest
> fixture and I'm struggling with testing the teardown / finalisation code.
>
> Instead of boring you with the [my-work-project] requirements of cleaning
> up GCS after tests, I'll refer to the fixture in the docs
> https://docs.pytest.org/en/stable/fixture.html#fixture-finalization-executing-teardown-code
> :
>
>     @pytest.fixture(scope="module")
>     def smtp_connection():
>         smtp_connection = smtplib.SMTP("smtp.gmail.com", 587, timeout=5)
>         yield smtp_connection  # provide the fixture value
>         print("teardown smtp")
>         smtp_connection.close()
>
> My (very old) usual strategy for testing teardown of a fixture that uses
> `yield` would be:
>
> * Start test
>
>     - Instantiate the fixture.
>
>     - Manipulate the instance with `next()` to trigger the teardown.
>
>     - Ensure that teardown was successful - in this case assert that the
> SMTP connection returned when the fixture was instantiated was closed
> successfully.
>
> Given that since v4.1 (https://github.com/pytest-dev/pytest/issues/4545),
> the arrangement step of "Instantiate the fixture" does not work, could
> someone point me at the recommended method of testing fixture teardown?
>
> I would like to ensure that teardown is resilient and can resolve multiple
> conditions that can happen in [my-work-project]'s test suite. I can see
> that there are multiple tests on fixtures in
> https://github.com/pytest-dev/pytest/blob/48c9a96a03261e7cfa5aad0367a9186d9032904a/testing/python/fixtures.py
> , are there any preferred / recommended / efficient methods in this file?
> Alternatively, is there a way to by-pass the fixture wrapping that happens
> that prevents it being callable? Should I be using
> `smtp_connection.__pytest_wrapped__.obj()` to instantiate? (this seems bad)
>
> Any pointers / suggestions would be great.
>
> Thanks,
>
> James
>
>
> _______________________________________________
> pytest-dev mailing list
> pytest-dev@python.org
> https://mail.python.org/mailman/listinfo/pytest-dev
>
> _______________________________________________
> pytest-dev mailing list
> pytest-dev@python.org
> https://mail.python.org/mailman/listinfo/pytest-dev
>
>
>
_______________________________________________
pytest-dev mailing list
pytest-dev@python.org
https://mail.python.org/mailman/listinfo/pytest-dev

Reply via email to