pytest-dev / pytest

The pytest framework makes it easy to write small tests, yet scales to support complex functional testing
https://pytest.org
MIT License
12.14k stars 2.69k forks source link

Cannot use pytest.mark.usefixtures() in pytest.param #4112

Open dtomas opened 6 years ago

dtomas commented 6 years ago

Adding Fixtures to a parametrization of a test function via pytest.mark.usefixtures has no effect. The fixtures are not executed and are missing from request.fixturenames.

Example:

import pytest

@pytest.fixture
def c():
    return []

@pytest.fixture
def a(c):
    c.append('a')

@pytest.fixture
def b(c):
    c.append('b')

@pytest.mark.parametrize('expected', [
    pytest.param(['a'], marks=pytest.mark.usefixtures('a'), id='a'),
    pytest.param(['b'], marks=pytest.mark.usefixtures('b'), id='b'),
])
def test_usefixtures_param(request, c, expected):
    assert c == expected
$ pip list
Package        Version
-------------- -------
atomicwrites   1.2.1  
attrs          18.2.0 
more-itertools 4.3.0  
pip            18.1   
pluggy         0.7.1  
py             1.6.0  
pytest         3.8.2  
setuptools     40.4.3 
six            1.11.0 
wheel          0.32.1
RonnyPfannschmidt commented 6 years ago

linking https://github.com/pytest-dev/pytest/issues/349#issuecomment-428680193 as it has some more details on the problem

voronovpetr commented 6 years ago

I think I have same problem. Specified fixture as argument for pytest.mark.usefixture will be ignored if this specified fixture has params.

import pytest

@pytest.fixture
def data():
    return dict()

@pytest.fixture(params=[1, 2])
def add_data(request, data):
    data['a'] = request.param

@pytest.mark.usefixtures('add_data')
@pytest.fixture
def completed_data(data):
    data['b'] = 3
    return data

def test_data(completed_data):
    assert 'a' in completed_data

I expect add_data must be executed before start completing completed_data but it does not. Also it work (how am I expect) if specify add_data in define of completed_data:

@pytest.fixture
def completed_data(data, add_data):
    data['b'] = 3
    return data

Please say me if I'm wrong.

RonnyPfannschmidt commented 6 years ago

marks on fixtures are NOT supported and won't be

nchammas commented 4 years ago

linking #349 (comment) as it has some more details on the problem

Just for reference, here is the code @dtomas linked to in their original comment: https://github.com/pytest-dev/pytest/blob/3.9.0/src/_pytest/python.py#L418-L421

Posting this link here since @dtomas's original comment didn't pin the code link to a specific git version or hash. It now points to some unrelated code.

DenisKuplyakov commented 2 years ago

It looks like that there is still no support on adding pytest.mark.usefixtures to marks of pytest.param. Are there any news on that?

The-Compiler commented 2 years ago

@DenisKuplyakov I'm not aware of anyone working on this. If there were any news, they would likely be in this issue.

vyahello commented 2 years ago

Hey guys, do we have any updates on it?

The-Compiler commented 2 years ago

@vyahello see the comment right above yours. I'm not sure what you're trying to achieve by asking the same thing again a month later...