I would like to use fixtures as arguments of pytest.mark.parametrize
or something that would have the same results.
For example:
import pytest import my_package @pytest.fixture def dir1_fixture(): return '/dir1' @pytest.fixture def dir2_fixture(): return '/dir2' @pytest.parametrize('dirname, expected', [(dir1_fixture, 'expected1'), (dir2_fixture, 'expected2')] def test_directory_command(dirname, expected): result = my_package.directory_command(dirname) assert result == expected
The problem with fixture params is that every param of the fixture will get run every time it's used, but I don't want that. I want to be able to choose which fixtures will get used depending on the test.
Being able to reuse fixtures in parametrized tests is a must when we want to avoid repetition. Unfortunately, pytest doesn't support that yet. On the other hand, we can make it happen either by using getfixturevalue in pytest or through a third-party library.
fixture() allows one to parametrize fixture functions.
pytest will build a string that is the test ID for each set of values in a parametrized test. These IDs can be used with -k to select specific cases to run, and they will also identify the specific case when one is failing. Running pytest with --collect-only will show the generated IDs.
If you're on pytest 3.0 or later, I think you should be able to solve this particular scenario by writing a fixture along the lines of:
@pytest.fixture(params=['dir1_fixture', 'dir2_fixture']) def dirname(request): return request.getfixturevalue(request.param)
Docs here: http://doc.pytest.org/en/latest/builtin.html#_pytest.fixtures.FixtureRequest.getfixturevalue
However, you can't use this approach if the fixture you're attempting to dynamically load is parametrized.
Alternatively, you might be able to figure something out with the pytest_generate_tests hook. I haven't been able to bring myself to look into that much, though.
Will was on the right path, you should use request.getfixturevalue
to retrieve the fixture.
But you can do it right in the test, which is simpler.
@pytest.mark.parametrize('dirname, expected', [ ('dir1_fixture', 'expected1'), ('dir2_fixture', 'expected2')]) def test_directory_command(dirname, expected, request): result = my_package.directory_command(request.getfixturevalue(dirname)) assert result == expected
Another way is to use lazy-fixture plugin:
@pytest.mark.parametrize('dirname, expected', [ (pytest.lazy_fixture('dir1_fixture'), 'expected1'), (pytest.lazy_fixture('dir2_fixture'), 'expected2')]) def test_directory_command(dirname, expected): result = my_package.directory_command(dirname) assert result == expected
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With