Skip to content

Commit

Permalink
Fixed scope override inside metafunc.parametrize. Fixes #634
Browse files Browse the repository at this point in the history
  • Loading branch information
Stranger6667 committed Jul 25, 2016
1 parent d37af20 commit af362b3
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 2 deletions.
1 change: 1 addition & 0 deletions AUTHORS
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ David Díaz-Barquero
David Mohr
David Vierra
Diego Russo
Dmitry Dygalo
Edison Gustavo Muenz
Eduardo Schettino
Elizaveta Shashkova
Expand Down
5 changes: 5 additions & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,10 @@
* ImportErrors in plugins now are a fatal error instead of issuing a
pytest warning (`#1479`_). Thanks to `@The-Compiler`_ for the PR.

* Fixed scope override inside metafunc.parametrize (`#634`_).
Thanks to `Stranger6667`_ for the PR.

.. _#634: https://github.com/pytest-dev/pytest/issues/634
.. _#1580: https://github.com/pytest-dev/pytest/pull/1580
.. _#1605: https://github.com/pytest-dev/pytest/issues/1605
.. _#1597: https://github.com/pytest-dev/pytest/pull/1597
Expand All @@ -72,6 +76,7 @@
.. _@DRMacIver: https://github.com/DRMacIver
.. _@BeyondEvil: https://github.com/BeyondEvil
.. _@JonathonSonesen: https://github.com/JonathonSonesen
.. _@Stranger6667: https://github.com/Stranger6667


2.9.2
Expand Down
10 changes: 8 additions & 2 deletions _pytest/python.py
Original file line number Diff line number Diff line change
Expand Up @@ -998,9 +998,15 @@ def parametrize(self, argnames, argvalues, indirect=False, ids=None,
newmarks = newkeywords.setdefault(0, {})
newmarks[newmark.markname] = newmark


if scope is None:
scope = "function"
if self._arg2fixturedefs:
# Takes the most narrow scope from used fixtures
fixtures_scopes = [fixturedef[0].scope for fixturedef in self._arg2fixturedefs.values()]
for scope in reversed(scopes):
if scope in fixtures_scopes:
break
else:
scope = 'function'
scopenum = scopes.index(scope)
valtypes = {}
for arg in argnames:
Expand Down
37 changes: 37 additions & 0 deletions testing/python/metafunc.py
Original file line number Diff line number Diff line change
Expand Up @@ -819,6 +819,43 @@ def test_checklength():
reprec = testdir.inline_run()
reprec.assertoutcome(passed=5)

def test_parametrize_issue634(self, testdir):
testdir.makepyfile('''
import pytest
@pytest.fixture(scope='module')
def foo(request):
print('preparing foo-%d' % request.param)
return 'foo-%d' % request.param
def test_one(foo):
pass
def test_two(foo):
pass
test_two.test_with = (2, 3)
def pytest_generate_tests(metafunc):
params = (1, 2, 3, 4)
if not 'foo' in metafunc.fixturenames:
return
test_with = getattr(metafunc.function, 'test_with', None)
if test_with:
params = test_with
metafunc.parametrize('foo', params, indirect=True)
''')
result = testdir.runpytest("-s")
output = result.stdout.str()
assert output.count('preparing foo-2') == 1
assert output.count('preparing foo-3') == 1

def test_parametrize_issue323(self, testdir):
testdir.makepyfile("""
import pytest
Expand Down

0 comments on commit af362b3

Please sign in to comment.