diff --git a/_pytest/python.py b/_pytest/python.py index 7ad1a085c..0745587ba 100644 --- a/_pytest/python.py +++ b/_pytest/python.py @@ -19,8 +19,10 @@ class FactoryMarker: return function class SetupMarker: - def __init__(self, scope): + def __init__(self, scope, enabled): self.scope = scope + self.enabled = enabled + def __call__(self, function): function._pytestsetup = self return function @@ -36,14 +38,17 @@ def factory(scope=None, params=None): """ return FactoryMarker(scope, params) -def setup(scope="function"): +def setup(scope="function", enabled=None): """ return a decorator to mark functions as setup functions. :arg scope: the scope for which the setup function will be active, one of "function", "class", "module", "session". Defaults to "function". + :arg enabled: if a callable is specified, enabled(node) will be called + and if it returns a false value this setup function + will not be called and its funcargs will not be setup. """ - return SetupMarker(scope) + return SetupMarker(scope, enabled) def cached_property(f): """returns a cached property that is calculated by function f. diff --git a/testing/test_python.py b/testing/test_python.py index 2b9e1e65a..d0b1ebdaa 100644 --- a/testing/test_python.py +++ b/testing/test_python.py @@ -1898,6 +1898,32 @@ class TestSetupDiscovery: reprec = testdir.inline_run("-s") reprec.assertoutcome(passed=2) + @pytest.mark.xfail(reason="'enabled' feature not implemented") + def test_setup_enabled_functionnode(self, testdir): + testdir.makepyfile(""" + import pytest + + def enabled(parentnode, markers): + return "needsdb" in markers + + @pytest.factory(params=[1,2]) + def db(request): + return request.param + + @pytest.setup(enabled=enabled) + def createdb(db): + pass + + def test_func1(request): + assert "db" not in request.funcargnames + + @pytest.mark.needsdb + def test_func2(request): + assert "db" in request.funcargnames + """) + reprec = testdir.inline_run("-s") + reprec.assertoutcome(passed=2) + def test_callables_nocode(self, testdir): """ a imported mock.call would break setup/factory discovery