allow to override parametrized fixtures with non-parametrized ones and vice versa
--HG-- branch : parametrized-fixture-override
This commit is contained in:
parent
bae0f7f46a
commit
060609317a
|
@ -1,10 +1,10 @@
|
||||||
2.7.0.dev (compared to 2.6.4)
|
2.7.0.dev (compared to 2.6.4)
|
||||||
-----------------------------
|
-----------------------------
|
||||||
|
|
||||||
- fix issue616: conftest.py files and their contained fixutres are now
|
- fix issue616: conftest.py files and their contained fixutres are now
|
||||||
properly considered for visibility, independently from the exact
|
properly considered for visibility, independently from the exact
|
||||||
current working directory and test arguments that are used.
|
current working directory and test arguments that are used.
|
||||||
Many thanks to Eric Siegerman and his PR235 which contains
|
Many thanks to Eric Siegerman and his PR235 which contains
|
||||||
systematic tests for conftest visibility and now passes.
|
systematic tests for conftest visibility and now passes.
|
||||||
This change also introduces the concept of a ``rootdir`` which
|
This change also introduces the concept of a ``rootdir`` which
|
||||||
is printed as a new pytest header and documented in the pytest
|
is printed as a new pytest header and documented in the pytest
|
||||||
|
@ -12,7 +12,7 @@
|
||||||
|
|
||||||
- change reporting of "diverted" tests, i.e. tests that are collected
|
- change reporting of "diverted" tests, i.e. tests that are collected
|
||||||
in one file but actually come from another (e.g. when tests in a test class
|
in one file but actually come from another (e.g. when tests in a test class
|
||||||
come from a base class in a different file). We now show the nodeid
|
come from a base class in a different file). We now show the nodeid
|
||||||
and indicate via a postfix the other file.
|
and indicate via a postfix the other file.
|
||||||
|
|
||||||
- add ability to set command line options by environment variable PYTEST_ADDOPTS.
|
- add ability to set command line options by environment variable PYTEST_ADDOPTS.
|
||||||
|
@ -24,7 +24,7 @@
|
||||||
- fix issue650: new option ``--docttest-ignore-import-errors`` which
|
- fix issue650: new option ``--docttest-ignore-import-errors`` which
|
||||||
will turn import errors in doctests into skips. Thanks Charles Cloud
|
will turn import errors in doctests into skips. Thanks Charles Cloud
|
||||||
for the complete PR.
|
for the complete PR.
|
||||||
|
|
||||||
- fix issue655: work around different ways that cause python2/3
|
- fix issue655: work around different ways that cause python2/3
|
||||||
to leak sys.exc_info into fixtures/tests causing failures in 3rd party code
|
to leak sys.exc_info into fixtures/tests causing failures in 3rd party code
|
||||||
|
|
||||||
|
@ -55,6 +55,7 @@
|
||||||
- "python_classes" and "python_functions" options now support glob-patterns
|
- "python_classes" and "python_functions" options now support glob-patterns
|
||||||
for test discovery, as discussed in issue600. Thanks Ldiary Translations.
|
for test discovery, as discussed in issue600. Thanks Ldiary Translations.
|
||||||
|
|
||||||
|
- allow to override parametrized fixtures with non-parametrized ones and vice versa (bubenkoff).
|
||||||
|
|
||||||
2.6.4
|
2.6.4
|
||||||
----------
|
----------
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
# create virtual environment
|
||||||
|
PYTHON = python2.7
|
||||||
|
|
||||||
|
.env:
|
||||||
|
virtualenv .env -p $(PYTHON)
|
||||||
|
|
||||||
|
# install all needed for development
|
||||||
|
develop: .env
|
||||||
|
.env/bin/pip install -e .[test] tox
|
||||||
|
|
||||||
|
# clean the development envrironment
|
||||||
|
clean:
|
||||||
|
-rm -rf .env
|
|
@ -1714,7 +1714,7 @@ class FixtureManager:
|
||||||
faclist = metafunc._arg2fixturedefs.get(argname)
|
faclist = metafunc._arg2fixturedefs.get(argname)
|
||||||
if faclist is None:
|
if faclist is None:
|
||||||
continue # will raise FixtureLookupError at setup time
|
continue # will raise FixtureLookupError at setup time
|
||||||
for fixturedef in faclist:
|
for fixturedef in faclist[-1:]:
|
||||||
if fixturedef.params is not None:
|
if fixturedef.params is not None:
|
||||||
metafunc.parametrize(argname, fixturedef.params,
|
metafunc.parametrize(argname, fixturedef.params,
|
||||||
indirect=True, scope=fixturedef.scope,
|
indirect=True, scope=fixturedef.scope,
|
||||||
|
|
3
setup.py
3
setup.py
|
@ -13,7 +13,8 @@ classifiers = ['Development Status :: 6 - Mature',
|
||||||
('Programming Language :: Python :: %s' % x) for x in
|
('Programming Language :: Python :: %s' % x) for x in
|
||||||
'2 2.6 2.7 3 3.2 3.3 3.4'.split()]
|
'2 2.6 2.7 3 3.2 3.3 3.4'.split()]
|
||||||
|
|
||||||
long_description = open('README.rst').read()
|
with open('README.rst') as fd:
|
||||||
|
long_description = fd.read()
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
|
|
@ -226,6 +226,114 @@ class TestFillFixtures:
|
||||||
result = testdir.runpytest()
|
result = testdir.runpytest()
|
||||||
assert result.ret == 0
|
assert result.ret == 0
|
||||||
|
|
||||||
|
def test_override_parametrized_fixture_conftest_module(self, testdir):
|
||||||
|
"""Test override of the parametrized fixture with non-parametrized one on the test module level."""
|
||||||
|
testdir.makeconftest("""
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
@pytest.fixture(params=[1, 2, 3])
|
||||||
|
def spam(request):
|
||||||
|
return request.param
|
||||||
|
""")
|
||||||
|
testfile = testdir.makepyfile("""
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def spam():
|
||||||
|
return 'spam'
|
||||||
|
|
||||||
|
def test_spam(spam):
|
||||||
|
assert spam == 'spam'
|
||||||
|
""")
|
||||||
|
result = testdir.runpytest()
|
||||||
|
result.stdout.fnmatch_lines(["*1 passed*"])
|
||||||
|
result = testdir.runpytest(testfile)
|
||||||
|
result.stdout.fnmatch_lines(["*1 passed*"])
|
||||||
|
|
||||||
|
def test_override_parametrized_fixture_conftest_conftest(self, testdir):
|
||||||
|
"""Test override of the parametrized fixture with non-parametrized one on the conftest level."""
|
||||||
|
testdir.makeconftest("""
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
@pytest.fixture(params=[1, 2, 3])
|
||||||
|
def spam(request):
|
||||||
|
return request.param
|
||||||
|
""")
|
||||||
|
subdir = testdir.mkpydir('subdir')
|
||||||
|
subdir.join("conftest.py").write(py.code.Source("""
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def spam():
|
||||||
|
return 'spam'
|
||||||
|
"""))
|
||||||
|
testfile = subdir.join("test_spam.py")
|
||||||
|
testfile.write(py.code.Source("""
|
||||||
|
def test_spam(spam):
|
||||||
|
assert spam == "spam"
|
||||||
|
"""))
|
||||||
|
result = testdir.runpytest()
|
||||||
|
result.stdout.fnmatch_lines(["*1 passed*"])
|
||||||
|
result = testdir.runpytest(testfile)
|
||||||
|
result.stdout.fnmatch_lines(["*1 passed*"])
|
||||||
|
|
||||||
|
def test_override_non_parametrized_fixture_conftest_module(self, testdir):
|
||||||
|
"""Test override of the non-parametrized fixture with parametrized one on the test module level."""
|
||||||
|
testdir.makeconftest("""
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def spam():
|
||||||
|
return 'spam'
|
||||||
|
""")
|
||||||
|
testfile = testdir.makepyfile("""
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
@pytest.fixture(params=[1, 2, 3])
|
||||||
|
def spam(request):
|
||||||
|
return request.param
|
||||||
|
|
||||||
|
params = {'spam': 1}
|
||||||
|
|
||||||
|
def test_spam(spam):
|
||||||
|
assert spam == params['spam']
|
||||||
|
params['spam'] += 1
|
||||||
|
""")
|
||||||
|
result = testdir.runpytest()
|
||||||
|
result.stdout.fnmatch_lines(["*3 passed*"])
|
||||||
|
result = testdir.runpytest(testfile)
|
||||||
|
result.stdout.fnmatch_lines(["*3 passed*"])
|
||||||
|
|
||||||
|
def test_override_non_parametrized_fixture_conftest_conftest(self, testdir):
|
||||||
|
"""Test override of the non-parametrized fixture with parametrized one on the conftest level."""
|
||||||
|
testdir.makeconftest("""
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def spam():
|
||||||
|
return 'spam'
|
||||||
|
""")
|
||||||
|
subdir = testdir.mkpydir('subdir')
|
||||||
|
subdir.join("conftest.py").write(py.code.Source("""
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
@pytest.fixture(params=[1, 2, 3])
|
||||||
|
def spam(request):
|
||||||
|
return request.param
|
||||||
|
"""))
|
||||||
|
testfile = subdir.join("test_spam.py")
|
||||||
|
testfile.write(py.code.Source("""
|
||||||
|
params = {'spam': 1}
|
||||||
|
|
||||||
|
def test_spam(spam):
|
||||||
|
assert spam == params['spam']
|
||||||
|
params['spam'] += 1
|
||||||
|
"""))
|
||||||
|
result = testdir.runpytest()
|
||||||
|
result.stdout.fnmatch_lines(["*3 passed*"])
|
||||||
|
result = testdir.runpytest(testfile)
|
||||||
|
result.stdout.fnmatch_lines(["*3 passed*"])
|
||||||
|
|
||||||
def test_autouse_fixture_plugin(self, testdir):
|
def test_autouse_fixture_plugin(self, testdir):
|
||||||
# A fixture from a plugin has no baseid set, which screwed up
|
# A fixture from a plugin has no baseid set, which screwed up
|
||||||
# the autouse fixture handling.
|
# the autouse fixture handling.
|
||||||
|
|
Loading…
Reference in New Issue