[pytest-dev] Testing fixture teardown / finalisation
Floris Bruynooghe
flub at devork.be
Thu Jan 7 15:00:44 EST 2021
Hello,
I can recommend both Bruno's and Florian's approaches as being good
practice :)
Cheers,
Floris
On Thu 07 Jan 2021 at 18:11 +0100, Florian Bruhin wrote:
> Hey,
>
> On Wed, Jan 06, 2021 at 03:26:08PM -0300, Bruno Oliveira wrote:
>> What I suggest you do in your case is to decouple your code from the
>> fixture, so if you have something like this today:
>>
>> [setup / teardown in a fixture]
>>
>> You can write instead:
>>
>> @contextmanager
>> def handle_work_reqs():
>> # [setup]
>> try:
>> yield x # some result
>> finally:
>> # [teardown]
>>
>> @pytest.fixture(scope="module")
>> def my_work_reqs():
>> with handle_work_reqs() as x:
>> yield x
>
> Perhaps it's just as obvious (at least in hindsight), but explicit is
> better as implicit:
>
> Another thing I often do is return some kind of custom class from the
> fixture, which tests can use - let's say we have:
>
> class JSTester:
>
> def __init__(self, qtbot):
> self.qtbot = qtbot # a fixture needed in the class
>
> def run(self, source):
> # ...
>
> # [some other methods tests can use]
>
> @pytest.fixture
> def js_tester(qtbot):
> return JSTester(qtbot)
>
> So that the tests can do things like:
>
> def test_simple_js(js_tester):
> js_tester.run('1 + 1')
>
> If there was some teardown to do here, I'd just add a "cleanup" method
> to that class, and call that in the fixture.
>
> If, for some reason, you have some more complex scenario and want to
> test it inside pytest rather than isolated from it, another possibility
> is the pytester fixture (called testdir in earlier releases):
>
> https://docs.pytest.org/en/latest/writing_plugins.html#testing-plugins
> https://docs.pytest.org/en/latest/reference.html#std-fixture-pytester
>
> Florian
More information about the pytest-dev
mailing list