Test login functionality with multiple user roles using indirect fixtures
Preconditions (3)
✅ Expected Result: The test runs for each user role, login succeeds, and assertions pass for all cases
import pytest # Simulated login function def login(username, password): valid_users = {"admin": "adminpass", "guest": "guestpass", "user": "userpass"} return valid_users.get(username) == password # Fixture that receives user role indirectly @pytest.fixture def user(request): role = request.param credentials = { "admin": ("admin", "adminpass"), "guest": ("guest", "guestpass"), "user": ("user", "userpass") } return credentials[role] # Test function using indirect parametrize @pytest.mark.parametrize("user", ["admin", "guest", "user"], indirect=True) def test_login(user): username, password = user assert login(username, password) is True
This code defines a login function that checks if the username and password match known valid users.
The user fixture uses request.param to receive the user role indirectly from the test parameter. It returns the corresponding credentials tuple.
The test test_login uses pytest.mark.parametrize with indirect=True to pass the user roles to the user fixture. For each role, it gets credentials and asserts that login succeeds.
This approach keeps test data separate from setup logic and makes tests clear and reusable.
Now add data-driven testing with 3 different sets of invalid credentials to verify login fails
indirect=True in @pytest.mark.parametrize do in pytest?indirect=True is set, pytest sends the parameter value to the fixture instead, allowing setup logic to use it.data for values 1 and 2, when there are other direct parameters?indirect.data, indirect=['data'] is correct syntax.import pytest
@pytest.fixture
def data(request):
return request.param * 2
@pytest.mark.parametrize('data', [3, 5], indirect=True)
def test_double(data):
print(data)data returns request.param * 2, so it doubles the parameter.@pytest.fixture
def setup_data(request):
return request.param + 1
@pytest.mark.parametrize('setup_data', [10, 20])
def test_increment(setup_data):
assert setup_data in [11, 21]indirect=True.indirect=True, so parameters go directly to test, not fixture.config that reads a file path from parameters and loads data. You have two file paths: "file1.json" and "file2.json". How do you correctly parametrize the test to pass these paths to the fixture using indirect parametrization, when there are other direct parameters?indirect=['fixture_name'] to mark that parameter indirect.config is indirect, use indirect=['config'] with the list of file paths.Pass the test and this pattern moves unknown