TL;DR: use scope
, @pytest.mark.usefixtures
and request.cls
to define your fixture as attribute of the class.
With pytest
you can use fixtures to have a nice delimitation of responsibilities within your test modules, sticking to the Arrange-Act-Assert pattern:
import pytest
@pytest.fixture()
def get_some_data():
yield "get some data"
def test_reading_data(get_some_data):
assert get_some_data == "get some data"
If the following code works, what about if you want to organize your tests functions within classes? Naively you would assume the following to be a fair implement:
import pytest
@pytest.fixture()
def get_some_data():
yield "get some data"
class TestDummy(unittest.TestCase):
def test_dummy(self, get_some_data):
assert get_some_data() == "get some data"
Running poetry run pytest -vvvs tests/path/to/test_module.py
will return the following error in the traceback:
E TypeError: TestDummy.test_dummy() missing 1 required positional argument: 'get_some_data'
In order to use python fixture within a class, you need to edit the above snippet for the following as you cannot call fixtures directly:
import pytest
@pytest.fixture()
def get_some_data():
yield "get some data"
class TestDummy(unittest.TestCase):
@pytest.fixture(autouse=True)
def _get_some_data(self, get_some_data):
self.get_some_data = get_some_data
def test_dummy(self):
assert self.get_some_data == "get some data"
Note that _get_some_data
will be called once per test by default which is inconvenient if you have to perform request through the network e.g. requests.get("https://www.google.com")
. You can change this behaviour by adapting the scope:
@pytest.fixture(scope="module")
def get_some_data():
yield "get some data"
@pytest.fixture(scope="class")
def define_get_data_attribute(request, get_some_data):
request.cls._get_some_data = get_some_data
@pytest.mark.usefixtures("define_get_data_attribute")
class TestDummy(unittest.TestCase):
def test_dummy(self):
assert self._get_some_data == "get some data"
Note that the request
object gives access to the requesting test context such as the cls attribute. More here.