Skip to content

Commit a79dc12

Browse files
authored
Merge pull request #3970 from sambarluc/raise_on_empty_parameterset
Raise exception if parametrize collects an empty parameter set
2 parents bceaede + 913c07e commit a79dc12

File tree

6 files changed

+50
-4
lines changed

6 files changed

+50
-4
lines changed

AUTHORS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ Alexei Kozlenok
1313
Anatoly Bubenkoff
1414
Anders Hovmöller
1515
Andras Tim
16+
Andrea Cimatoribus
1617
Andreas Zeidler
1718
Andrzej Ostrowski
1819
Andy Freeland

changelog/3849.feature.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Add ``empty_parameter_set_mark=fail_at_collect`` ini option for raising an exception when parametrize collects an empty set.

doc/en/reference.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -976,6 +976,7 @@ passed multiple times. The expected format is ``name=value``. For example::
976976

977977
* ``skip`` skips tests with an empty parameterset (default)
978978
* ``xfail`` marks tests with an empty parameterset as xfail(run=False)
979+
* ``fail_at_collect`` raises an exception if parametrize collects an empty parameter set
979980

980981
.. code-block:: ini
981982

src/_pytest/mark/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,9 +163,9 @@ def pytest_configure(config):
163163

164164
empty_parameterset = config.getini(EMPTY_PARAMETERSET_OPTION)
165165

166-
if empty_parameterset not in ("skip", "xfail", None, ""):
166+
if empty_parameterset not in ("skip", "xfail", "fail_at_collect", None, ""):
167167
raise UsageError(
168-
"{!s} must be one of skip and xfail,"
168+
"{!s} must be one of skip, xfail or fail_at_collect"
169169
" but it is {!r}".format(EMPTY_PARAMETERSET_OPTION, empty_parameterset)
170170
)
171171

src/_pytest/mark/structures.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,19 @@ def istestfunc(func):
3232

3333

3434
def get_empty_parameterset_mark(config, argnames, func):
35+
from ..nodes import Collector
36+
3537
requested_mark = config.getini(EMPTY_PARAMETERSET_OPTION)
3638
if requested_mark in ("", None, "skip"):
3739
mark = MARK_GEN.skip
3840
elif requested_mark == "xfail":
3941
mark = MARK_GEN.xfail(run=False)
42+
elif requested_mark == "fail_at_collect":
43+
f_name = func.__name__
44+
_, lineno = getfslineno(func)
45+
raise Collector.CollectError(
46+
"Empty parameter set in '%s' at line %d" % (f_name, lineno)
47+
)
4048
else:
4149
raise LookupError(requested_mark)
4250
fs, lineno = getfslineno(func)

testing/test_mark.py

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
transfer_markers,
1414
EMPTY_PARAMETERSET_OPTION,
1515
)
16-
from _pytest.nodes import Node
16+
from _pytest.nodes import Node, Collector
1717

1818
ignore_markinfo = pytest.mark.filterwarnings(
1919
"ignore:MarkInfo objects:pytest.RemovedInPytest4Warning"
@@ -1091,7 +1091,14 @@ def test__eq__(self, lhs, rhs, expected):
10911091
@pytest.mark.parametrize("mark", [None, "", "skip", "xfail"])
10921092
def test_parameterset_for_parametrize_marks(testdir, mark):
10931093
if mark is not None:
1094-
testdir.makeini("[pytest]\n{}={}".format(EMPTY_PARAMETERSET_OPTION, mark))
1094+
testdir.makeini(
1095+
"""
1096+
[pytest]
1097+
{}={}
1098+
""".format(
1099+
EMPTY_PARAMETERSET_OPTION, mark
1100+
)
1101+
)
10951102

10961103
config = testdir.parseconfig()
10971104
from _pytest.mark import pytest_configure, get_empty_parameterset_mark
@@ -1107,6 +1114,34 @@ def test_parameterset_for_parametrize_marks(testdir, mark):
11071114
assert result_mark.kwargs.get("run") is False
11081115

11091116

1117+
def test_parameterset_for_fail_at_collect(testdir):
1118+
testdir.makeini(
1119+
"""
1120+
[pytest]
1121+
{}=fail_at_collect
1122+
""".format(
1123+
EMPTY_PARAMETERSET_OPTION
1124+
)
1125+
)
1126+
1127+
config = testdir.parseconfig()
1128+
from _pytest.mark import pytest_configure, get_empty_parameterset_mark
1129+
from _pytest.compat import getfslineno
1130+
1131+
pytest_configure(config)
1132+
1133+
test_func = all
1134+
func_name = test_func.__name__
1135+
_, func_lineno = getfslineno(test_func)
1136+
expected_errmsg = r"Empty parameter set in '%s' at line %d" % (
1137+
func_name,
1138+
func_lineno,
1139+
)
1140+
1141+
with pytest.raises(Collector.CollectError, match=expected_errmsg):
1142+
get_empty_parameterset_mark(config, ["a"], test_func)
1143+
1144+
11101145
def test_parameterset_for_parametrize_bad_markname(testdir):
11111146
with pytest.raises(pytest.UsageError):
11121147
test_parameterset_for_parametrize_marks(testdir, "bad")

0 commit comments

Comments
 (0)