I too have observed this weird ordering. I would like like the order of fixtures to always respect the order of scopes.
On Thu, Mar 15, 2018 at 6:47 PM, Brian Okken <variedthoug...@gmail.com> wrote: > Bruno, > > Please, merge that PR! > caveat: I have not reviewed the code. > > However, ... > I get numerous questions about it, and I always tell people to create > artificial dependencies between fixtures that need to run in a certain > order. > The general mental model that people have for fixtures is that they are > run in scope order. > I think the current behavior of file order overriding scope order is > insane and a bug. > > - Brian > > On Thu, Mar 15, 2018 at 2:42 PM, Bruno Oliveira <nicodde...@gmail.com> > wrote: > >> Hi everyone and Holger, >> >> Looking at the code below: >> >> >> data = {} >> @pytest.fixture(scope='session')def clean_data(): >> data.clear() >> @pytest.fixture(autouse=True)def add_data(): >> data['value'] = 1 >> @pytest.mark.usefixtures('clean_data')def test_foo(): >> assert data.get('value') >> >> Should test_foo fail or pass? Keep your answer in mind before >> proceeding. :) >> ------------------------------ >> >> I ask this because *unrelated* fixtures, i.e. which don’t depend on each >> other, are executed in the order they are declared in the test function >> signature, regardless of scope. >> >> The example above *fails*, because the fixtures are executed in (add_data, >> clean_data) order: add_data, being *autouse*, is added to the beginning >> of the argument list, and afterwards clean_data is inserted because of >> the usefixtures mark. >> >> This came up in #2405 <https://github.com/pytest-dev/pytest/issues/2405>, >> where Jason Coombs assumed that clean_data, being session-scoped, would >> always be executed first. >> >> I wonder if the current state of things is by design, or just an accident >> of how things work? >> >> I opened up a PR <https://github.com/pytest-dev/pytest/pull/3306> which >> does sort parameters by scope while keeping the relative order of fixtures >> of same scope intact, and the test suite passes without failures so if the >> current behavior is by design there are not tests enforcing it. Using code >> in the PR, then things might also be surprising: >> >> @pytest.fixture(scope='session')def s(): pass >> @pytest.fixture(scope='function')def f(): pass >> def test_foo(f, s): >> pass >> >> s and f are unrelated and execute in (f, s) order in master, but in (s, >> f) order in my branch. >> >> Would like to hear what people think about this matter, as I think it is >> an important one, specially *Holger* if this is a design decision or >> just an accident of implementation, and if we should change it. >> >> Also, please feel free to just reply with what you thought what should be >> the behavior of the first sample. >> >> Cheers, >> Bruno. >> >> >> _______________________________________________ >> 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