Search code examples
pythonpytestparametrized-testingpytest-fixturesparametrize

pytest using fixtures as arguments in parametrize


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.


Solution

  • 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