Skip to content
Permalink
Browse files

Merge pull request #3500 from RonnyPfannschmidt/fix-3498-unittest-marks

fix #3498 - correctly consider marks on unittest classes
  • Loading branch information...
nicoddemus committed May 24, 2018
2 parents afde9f0 + bc25d51 commit 48215fdcb90baf9abc1f83661d9d8be3e72a4b22
Showing with 66 additions and 3 deletions.
  1. +1 −1 _pytest/fixtures.py
  2. +1 −1 _pytest/python.py
  3. +2 −1 _pytest/unittest.py
  4. +1 −0 changelog/3498.bugfix
  5. +61 −0 testing/test_unittest.py
@@ -984,7 +984,7 @@ def __init__(self, session):
session.config.pluginmanager.register(self, "funcmanage")

def getfixtureinfo(self, node, func, cls, funcargs=True):
if funcargs and not hasattr(node, "nofuncargs"):
if funcargs and not getattr(node, "nofuncargs", False):
argnames = getfuncargnames(func, cls=cls)
else:
argnames = ()
@@ -1155,7 +1155,7 @@ def __init__(self, name, parent, args=None, config=None,

if fixtureinfo is None:
fixtureinfo = self.session._fixturemanager.getfixtureinfo(
self.parent, self.obj, self.cls,
self, self.obj, self.cls,
funcargs=not self._isyieldedfunction())
self._fixtureinfo = fixtureinfo
self.fixturenames = fixtureinfo.names_closure
@@ -54,7 +54,7 @@ def collect(self):
continue
funcobj = getattr(x, 'im_func', x)
transfer_markers(funcobj, cls, module)
yield TestCaseFunction(name, parent=self)
yield TestCaseFunction(name, parent=self, callobj=funcobj)
foundsomething = True

if not foundsomething:
@@ -66,6 +66,7 @@ def collect(self):


class TestCaseFunction(Function):
nofuncargs = True
_excinfo = None

def setup(self):
@@ -0,0 +1 @@
Fix ``usefixtures`` mark applyed to unittest tests by correctly instantiating ``FixtureInfo``.
@@ -828,3 +828,64 @@ def test_should_not_run(self):
""")
reprec = testdir.inline_run()
reprec.assertoutcome(passed=1)


@pytest.mark.issue(3498)
@pytest.mark.parametrize("base", [
'six.moves.builtins.object',
'unittest.TestCase',
'unittest2.TestCase',
])
def test_usefixtures_marker_on_unittest(base, testdir):
module = base.rsplit('.', 1)[0]
pytest.importorskip(module)
testdir.makepyfile(conftest="""
import pytest
@pytest.fixture(scope='function')
def fixture1(request, monkeypatch):
monkeypatch.setattr(request.instance, 'fixture1', True )
@pytest.fixture(scope='function')
def fixture2(request, monkeypatch):
monkeypatch.setattr(request.instance, 'fixture2', True )
def node_and_marks(item):
print(item.nodeid)
for mark in item.iter_markers():
print(" ", mark)
@pytest.fixture(autouse=True)
def my_marks(request):
node_and_marks(request.node)
def pytest_collection_modifyitems(items):
for item in items:
node_and_marks(item)
""")

testdir.makepyfile("""
import pytest
import {module}
class Tests({base}):
fixture1 = False
fixture2 = False
@pytest.mark.usefixtures("fixture1")
def test_one(self):
assert self.fixture1
assert not self.fixture2
@pytest.mark.usefixtures("fixture1", "fixture2")
def test_two(self):
assert self.fixture1
assert self.fixture2
""".format(module=module, base=base))

result = testdir.runpytest('-s')
result.assert_outcomes(passed=2)

0 comments on commit 48215fd

Please sign in to comment.
You can’t perform that action at this time.