Skip to content

Commit 412b43b

Browse files
committed
Merge pull request #865 from nicoddemus/skipif-reason-multiple
Report correct reason when using multiple skip/xfail markers
2 parents 23aaa8a + 953916d commit 412b43b

File tree

3 files changed

+50
-14
lines changed

3 files changed

+50
-14
lines changed

CHANGELOG

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@
1616
fixtures declared on the first one.
1717
Thanks Florian Bruhin for reporting and Bruno Oliveira for the PR.
1818

19+
- fix issue863: skipped tests now report the correct reason when a skip/xfail
20+
condition is met when using multiple markers.
21+
Thanks Raphael Pierzina for reporting and Bruno Oliveira for the PR.
22+
1923
- optimized tmpdir fixture initialization, which should make test sessions
2024
faster (specially when using pytest-xdist). The only visible effect
2125
is that now pytest uses a subdirectory in the $TEMP directory for all

_pytest/skipping.py

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -98,24 +98,36 @@ def _getglobals(self):
9898
return d
9999

100100
def _istrue(self):
101+
if hasattr(self, 'result'):
102+
return self.result
101103
if self.holder:
102104
d = self._getglobals()
103105
if self.holder.args:
104106
self.result = False
105-
for expr in self.holder.args:
106-
self.expr = expr
107-
if isinstance(expr, py.builtin._basestring):
108-
result = cached_eval(self.item.config, expr, d)
109-
else:
110-
if self.get("reason") is None:
111-
# XXX better be checked at collection time
112-
pytest.fail("you need to specify reason=STRING "
113-
"when using booleans as conditions.")
114-
result = bool(expr)
115-
if result:
116-
self.result = True
107+
# "holder" might be a MarkInfo or a MarkDecorator; only
108+
# MarkInfo keeps track of all parameters it received in an
109+
# _arglist attribute
110+
if hasattr(self.holder, '_arglist'):
111+
arglist = self.holder._arglist
112+
else:
113+
arglist = [(self.holder.args, self.holder.kwargs)]
114+
for args, kwargs in arglist:
115+
for expr in args:
117116
self.expr = expr
118-
break
117+
if isinstance(expr, py.builtin._basestring):
118+
result = cached_eval(self.item.config, expr, d)
119+
else:
120+
if "reason" not in kwargs:
121+
# XXX better be checked at collection time
122+
msg = "you need to specify reason=STRING " \
123+
"when using booleans as conditions."
124+
pytest.fail(msg)
125+
result = bool(expr)
126+
if result:
127+
self.result = True
128+
self.reason = kwargs.get('reason', None)
129+
self.expr = expr
130+
return self.result
119131
else:
120132
self.result = True
121133
return getattr(self, 'result', False)
@@ -124,7 +136,7 @@ def get(self, attr, default=None):
124136
return self.holder.kwargs.get(attr, default)
125137

126138
def getexplanation(self):
127-
expl = self.get('reason', None)
139+
expl = getattr(self, 'reason', None) or self.get('reason', None)
128140
if not expl:
129141
if not hasattr(self, 'expr'):
130142
return ""

testing/test_skipping.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -409,6 +409,26 @@ def test_that():
409409
])
410410
assert result.ret == 0
411411

412+
@pytest.mark.parametrize('marker, msg1, msg2', [
413+
('skipif', 'SKIP', 'skipped'),
414+
('xfail', 'XPASS', 'xpassed'),
415+
])
416+
def test_skipif_reporting_multiple(self, testdir, marker, msg1, msg2):
417+
testdir.makepyfile(test_foo="""
418+
import pytest
419+
@pytest.mark.{marker}(False, reason='first_condition')
420+
@pytest.mark.{marker}(True, reason='second_condition')
421+
def test_foobar():
422+
assert 1
423+
""".format(marker=marker))
424+
result = testdir.runpytest('-s', '-rsxX')
425+
result.stdout.fnmatch_lines([
426+
"*{msg1}*test_foo.py*second_condition*".format(msg1=msg1),
427+
"*1 {msg2}*".format(msg2=msg2),
428+
])
429+
assert result.ret == 0
430+
431+
412432
def test_skip_not_report_default(testdir):
413433
p = testdir.makepyfile(test_one="""
414434
import pytest

0 commit comments

Comments
 (0)