-
-
Notifications
You must be signed in to change notification settings - Fork 2.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Update fixtures.rst w/ finalizer order #10171
Conversation
Add note to clarify the difference in execution order between after-yield finalizers and `request.addfinalizer` finalizers.
for more information, see https://pre-commit.ci
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks a lot @aizpurua23a! Left a few comments, please take a look.
@pytest.fixture | ||
def fix_w_yield(): | ||
yield | ||
print("after_yield_1") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is not a good example I think, because of course both prints will be executed sequentially (pytest cannot mess with how Python executes code within a function).
I suggest we use two fixtures:
@pytest.fixture
def fix_w_yield1():
yield
print("after_yield_1")
@pytest.fixture
def fix_w_yield2():
yield
print("after_yield_2")
And then make test_bar
request both:
def test_bar(fix_w_yield1, fix_w_yield2):
print("test_bar")
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ah, I see.
The execution order with the addfinalizer method is evident, so the execution order only needs clarification in this case.
Lovely! How about now?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think we can keep the examples using addfinalizer
as they are useful for comparision, so could you please bring them back? Thanks
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sure thing, re-added.
Co-authored-by: Bruno Oliveira <nicoddemus@gmail.com>
Co-authored-by: Bruno Oliveira <nicoddemus@gmail.com>
Co-authored-by: Bruno Oliveira <nicoddemus@gmail.com>
@pytest.fixture | ||
def fix_w_yield(): | ||
yield | ||
print("after_yield_1") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think we can keep the examples using addfinalizer
as they are useful for comparision, so could you please bring them back? Thanks
doc/en/how-to/fixtures.rst
Outdated
Note on finalizer order | ||
"""""""""""""""""""""""" | ||
|
||
Finalizers are executed in a first-in-last-out order, while operations after yield are executed sequentially. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
while operations after yield are executed sequentially.
This sentence needs tweaking if we look at the output. 👍
Finalizers are executed in FILO order, that is correct, because we can see that adding fin2
and fin1
we get back fn1
, fn2
in the output.
But the same can be said for the yield fixtures: we request them in fix_w_yield1
, fix_w_yield2
order, and we get fix_w_yield2
and fix_w_yield1
in the output.
That's because yield
fixtures use addfinalizer
behind the scenes: when the fixture executes, we register a function with addfinalizer
that resumes the generator (which in turn calls the teardown code).
Not sure how to "fix" this sentence, or perhaps we can explain something along the lines of what I wrote above, if that makes things clearer.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, that makes sense.
I tried to explain how both examples show the similar FILO behavior, plus added the hidden usage of addfinalizer after the examples.
What do you think?
Co-authored-by: Bruno Oliveira <nicoddemus@gmail.com>
Thanks @aizpurua23a! cc @fish-face |
Fixes #10023
Add note to clarify the difference in execution order between after-yield finalizers and
request.addfinalizer
finalizers.