-
-
Notifications
You must be signed in to change notification settings - Fork 2.9k
Description
I've been following #517 for some time and I've recently looked at #4091 in the hope that it would help me figure out how I can get better support for xunit style class fixtures. Here is what I want to be able to do:
@pytest.fixture(scope="session")
def db():
return database.Database()
class TestIt(object):
def setup_class(cls, db):
# This method fails with: TypeError: setup_class() takes exactly 2 arguments (1 given)
cls.foo = db.build_expensive_foo()
def setup(self, db):
# fails with same error as setup_class
cls.bar = db.build_expensive_bar()
@pytest.fixture(autouse=True, scope='class')
def prep_class(self, db):
# db is available here, but self is an instance, not the class itself, so this
# doesn't work as intended. I could use self.__class__, but feel like I
# shouldn't need to.
print('prepare', self, db)
self.foo = 'bar'
def test_foo_bar(self):
assert self.foo
assert self.barI seem to have two, maybe distinct, problems:
-
Despite the work done in Use fixtures to invoke xunit-style fixtures #4091,
setup_classandsetupdo not seem to have access to fixtures (dbin this example). I'm not sure if that is intended, an oversight, but the above "feels" like it should work to me. -
Using an autouse fixture at the class level gives access to the
dbfixture but the fact that an instance instead of the class is being passed in makes it non-intuitive on how to store state at the class level.
Suggestion
I'd really like to see setup_class() and setup() get support for using fixtures defined elsewhere. We have a lot of tests that use this pattern to cache test data at the class level and it would be helpful to give those methods access to other fixtures.
I understand from the discussions in the issues and PR that pytest is trying to keep a distinction between xunit style and newer fixture style tests, but I'm not sure why that needs to be the case. Unless there is a technical limitation that makes this hard to support, the UX described above feels well balanced IMO and would be ideal for our code bases that are heavily using setup_class and setup extensively.
Being able to use fixtures as proposed also allows a more gradual transition from one style to another.
- Maybe consider passing the class object instead of the instance object to class level methods using a fixture
Version Info
Using Arch Linux. Versions:
(pytest-xunit)rsyring@nanite:~/tmp$ pytest --version
This is pytest version 4.5.0, imported from /home/rsyring/tmp/virtualenvs/pytest-xunit/lib/python3.7/site-packages/pytest.py
(pytest-xunit)rsyring@nanite:~/tmp$ pip freeze
atomicwrites==1.3.0
attrs==19.1.0
more-itertools==7.0.0
pluggy==0.11.0
py==1.8.0
pytest==4.5.0
six==1.12.0
wcwidth==0.1.7
(pytest-xunit)rsyring@nanite:~/tmp$ python --version
Python 3.7.3
Edit: tested with clean virtualenv and Python 3