Bird
Raised Fist0
PyTesttesting~10 mins

Parametrize with indirect fixtures in PyTest - Interactive Code Practice

Choose your learning style10 modes available
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to parametrize the test with indirect fixture usage.

PyTest
import pytest

@pytest.fixture
def data(request):
    return request.param

@pytest.mark.parametrize('data', [1, 2, 3], [1]=True)
def test_example(data):
    assert data in [1, 2, 3]
Drag options to blanks, or click blank then click option'
Aparams
Bscope
Cids
Dindirect
Attempts:
3 left
💡 Hint
Common Mistakes
Using 'params' instead of 'indirect' causes pytest to treat values as direct parameters.
Forgetting to set indirect=True means the fixture is not used.
2fill in blank
medium

Complete the code to access the parameter inside the fixture using the request object.

PyTest
import pytest

@pytest.fixture
def setup_data([1]):
    return request.param * 2

@pytest.mark.parametrize('setup_data', [4, 5], indirect=True)
def test_double(setup_data):
    assert setup_data in [8, 10]
Drag options to blanks, or click blank then click option'
Aparam
Brequest
Cdata
Dvalue
Attempts:
3 left
💡 Hint
Common Mistakes
Using 'param' or 'data' as argument instead of 'request' causes errors.
Trying to access 'param' without the request object.
3fill in blank
hard

Fix the error in the test by correctly marking the parameter for indirect fixture usage.

PyTest
import pytest

@pytest.fixture
def config(request):
    return request.param + 1

@pytest.mark.parametrize('config', [10, 20], [1]=True)
def test_config(config):
    assert config in [11, 21]
Drag options to blanks, or click blank then click option'
Aids
Bscope
Cindirect
Dparams
Attempts:
3 left
💡 Hint
Common Mistakes
Omitting 'indirect=True' causes the test to fail because the fixture is not used.
Using 'params' instead of 'indirect' causes wrong behavior.
4fill in blank
hard

Fill both blanks to parametrize two fixtures indirectly.

PyTest
import pytest

@pytest.fixture
def user(request):
    return request.param

@pytest.fixture
def role(request):
    return request.param

@pytest.mark.parametrize('user, role', [('alice', 'admin'), ('bob', 'user')], [1]=[2])
def test_access(user, role):
    assert user in ['alice', 'bob']
    assert role in ['admin', 'user']
Drag options to blanks, or click blank then click option'
Aindirect
BTrue
CFalse
Dscope
Attempts:
3 left
💡 Hint
Common Mistakes
Using 'indirect=False' disables indirect fixture usage.
Using 'scope' instead of 'indirect' causes errors.
5fill in blank
hard

Fill all three blanks to parametrize a test with indirect fixtures and access the parameter inside the fixture.

PyTest
import pytest

@pytest.fixture
def item([1]):
    return request.param * 3

@pytest.mark.parametrize('item', [2, 3], [2]=[3])
def test_item(item):
    assert item in [6, 9]
Drag options to blanks, or click blank then click option'
Arequest
Bindirect
CTrue
Dparams
Attempts:
3 left
💡 Hint
Common Mistakes
Not accepting 'request' in the fixture causes errors.
Omitting 'indirect=True' disables fixture parameterization.

Practice

(1/5)
1. What does using indirect=True in @pytest.mark.parametrize do in pytest?
easy
A. It skips the test when the parameter is None.
B. It disables the fixture for that test.
C. It runs the test only once regardless of parameters.
D. It passes the parameter value to a fixture instead of directly to the test function.

Solution

  1. Step 1: Understand parametrize behavior

    Normally, parameters are passed directly to the test function as arguments.
  2. Step 2: Effect of indirect=True

    When indirect=True is set, pytest sends the parameter value to the fixture instead, allowing setup logic to use it.
  3. Final Answer:

    It passes the parameter value to a fixture instead of directly to the test function. -> Option D
  4. Quick Check:

    indirect=True means parameter goes to fixture [OK]
Hint: Indirect means parameter goes to fixture, not test directly [OK]
Common Mistakes:
  • Thinking parameters always go directly to test functions
  • Confusing indirect=True with skipping tests
  • Assuming indirect disables fixtures
2. Which of the following is the correct syntax to parametrize a test with an indirect fixture named data for values 1 and 2, when there are other direct parameters?
easy
A. @pytest.mark.parametrize('data', [1, 2], indirect=True)
B. @pytest.mark.parametrize('data', [1, 2], indirect=['data'])
C. @pytest.mark.parametrize('data', [1, 2], indirect=False)
D. @pytest.mark.parametrize('data', [1, 2], indirect=None)

Solution

  1. Step 1: Recall indirect parameter usage

    When only some parameters are indirect, you pass a list of their names to indirect.
  2. Step 2: Apply to single parameter

    For one parameter data, indirect=['data'] is correct syntax.
  3. Final Answer:

    @pytest.mark.parametrize('data', [1, 2], indirect=['data']) -> Option B
  4. Quick Check:

    indirect=['param_name'] for indirect fixture [OK]
Hint: Use indirect=['param_name'] to mark specific params indirect [OK]
Common Mistakes:
  • Using indirect=True for single param when multiple params exist
  • Passing indirect=False or None which disables indirect
  • Not using a list for indirect parameter names
3. Given the code below, what will be printed when running the test?
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)
medium
A. 6 and 10
B. 3 and 5
C. None and None
D. Error: request.param not found

Solution

  1. Step 1: Understand fixture with request.param

    The fixture data returns request.param * 2, so it doubles the parameter.
  2. Step 2: Parametrize with indirect=True

    Parameters 3 and 5 are passed to the fixture, so the test receives 6 and 10.
  3. Final Answer:

    6 and 10 -> Option A
  4. Quick Check:

    Fixture doubles param: 3*2=6, 5*2=10 [OK]
Hint: Indirect param goes to fixture; fixture doubles it [OK]
Common Mistakes:
  • Thinking parameters go directly to test, so expecting 3 and 5
  • Assuming request.param is unavailable causing error
  • Confusing fixture return with test parameter
4. What is wrong with this pytest code snippet?
@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]
medium
A. The fixture should not return a value.
B. Fixture name and parameter name must be different.
C. Missing indirect=True in parametrize to pass parameters to fixture.
D. The assert statement is incorrect.

Solution

  1. Step 1: Check parametrize usage with fixture

    Parameters must be passed indirectly to fixtures using indirect=True.
  2. Step 2: Identify missing indirect=True

    The code lacks indirect=True, so parameters go directly to test, not fixture.
  3. Final Answer:

    Missing indirect=True in parametrize to pass parameters to fixture. -> Option C
  4. Quick Check:

    indirect=True needed to use request.param [OK]
Hint: Add indirect=True to parametrize when using request.param [OK]
Common Mistakes:
  • Forgetting indirect=True causes request.param error
  • Thinking fixture and param names must differ
  • Assuming fixture cannot return values
5. You want to test a 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?
hard
A. @pytest.mark.parametrize('config', ["file1.json", "file2.json"], indirect=['config'])
B. @pytest.mark.parametrize('config', ["file1.json", "file2.json"])
C. @pytest.mark.parametrize('config', ["file1.json", "file2.json"], indirect=True)
D. @pytest.mark.parametrize('config', ["file1.json", "file2.json"], indirect=False)

Solution

  1. Step 1: Identify indirect parameter usage for single fixture

    When passing parameters to a fixture, use indirect=['fixture_name'] to mark that parameter indirect.
  2. Step 2: Apply to config fixture

    Since only config is indirect, use indirect=['config'] with the list of file paths.
  3. Final Answer:

    @pytest.mark.parametrize('config', ["file1.json", "file2.json"], indirect=['config']) -> Option A
  4. Quick Check:

    Use indirect=['config'] to pass params to fixture [OK]
Hint: Use indirect=['fixture_name'] to pass params to fixture [OK]
Common Mistakes:
  • Using indirect=True instead of list for single param
  • Not using indirect causing fixture to miss parameters
  • Setting indirect=False disables indirect passing
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard