Skip to content

Commit cbb5d48

Browse files
committed
Merge pull request #1413 from nicoddemus/skip-if-parametrize
Fix skip/xfail markers in parametrized arguments
2 parents 310bada + d9ede1b commit cbb5d48

File tree

3 files changed

+88
-7
lines changed

3 files changed

+88
-7
lines changed

_pytest/skipping.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import py
77
import pytest
8-
from _pytest.mark import MarkInfo
8+
from _pytest.mark import MarkInfo, MarkDecorator
99

1010

1111
def pytest_addoption(parser):
@@ -163,14 +163,14 @@ def pytest_runtest_setup(item):
163163
# Check if skip or skipif are specified as pytest marks
164164

165165
skipif_info = item.keywords.get('skipif')
166-
if isinstance(skipif_info, MarkInfo):
166+
if isinstance(skipif_info, (MarkInfo, MarkDecorator)):
167167
eval_skipif = MarkEvaluator(item, 'skipif')
168168
if eval_skipif.istrue():
169169
item._evalskip = eval_skipif
170170
pytest.skip(eval_skipif.getexplanation())
171171

172172
skip_info = item.keywords.get('skip')
173-
if isinstance(skip_info, MarkInfo):
173+
if isinstance(skip_info, (MarkInfo, MarkDecorator)):
174174
item._evalskip = True
175175
if 'reason' in skip_info.kwargs:
176176
pytest.skip(skip_info.kwargs['reason'])

testing/python/collect.py

+78
Original file line numberDiff line numberDiff line change
@@ -531,6 +531,84 @@ def test2(self, x, y):
531531
assert colitems[2].name == 'test2[a-c]'
532532
assert colitems[3].name == 'test2[b-c]'
533533

534+
def test_parametrize_skipif(self, testdir):
535+
testdir.makepyfile("""
536+
import pytest
537+
538+
m = pytest.mark.skipif('True')
539+
540+
@pytest.mark.parametrize('x', [0, 1, m(2)])
541+
def test_skip_if(x):
542+
assert x < 2
543+
""")
544+
result = testdir.runpytest()
545+
result.stdout.fnmatch_lines('* 2 passed, 1 skipped in *')
546+
547+
def test_parametrize_skip(self, testdir):
548+
testdir.makepyfile("""
549+
import pytest
550+
551+
m = pytest.mark.skip('')
552+
553+
@pytest.mark.parametrize('x', [0, 1, m(2)])
554+
def test_skip(x):
555+
assert x < 2
556+
""")
557+
result = testdir.runpytest()
558+
result.stdout.fnmatch_lines('* 2 passed, 1 skipped in *')
559+
560+
def test_parametrize_skipif_no_skip(self, testdir):
561+
testdir.makepyfile("""
562+
import pytest
563+
564+
m = pytest.mark.skipif('False')
565+
566+
@pytest.mark.parametrize('x', [0, 1, m(2)])
567+
def test_skipif_no_skip(x):
568+
assert x < 2
569+
""")
570+
result = testdir.runpytest()
571+
result.stdout.fnmatch_lines('* 1 failed, 2 passed in *')
572+
573+
def test_parametrize_xfail(self, testdir):
574+
testdir.makepyfile("""
575+
import pytest
576+
577+
m = pytest.mark.xfail('True')
578+
579+
@pytest.mark.parametrize('x', [0, 1, m(2)])
580+
def test_xfail(x):
581+
assert x < 2
582+
""")
583+
result = testdir.runpytest()
584+
result.stdout.fnmatch_lines('* 2 passed, 1 xfailed in *')
585+
586+
def test_parametrize_passed(self, testdir):
587+
testdir.makepyfile("""
588+
import pytest
589+
590+
m = pytest.mark.xfail('True')
591+
592+
@pytest.mark.parametrize('x', [0, 1, m(2)])
593+
def test_xfail(x):
594+
pass
595+
""")
596+
result = testdir.runpytest()
597+
result.stdout.fnmatch_lines('* 2 passed, 1 xpassed in *')
598+
599+
def test_parametrize_xfail_passed(self, testdir):
600+
testdir.makepyfile("""
601+
import pytest
602+
603+
m = pytest.mark.xfail('False')
604+
605+
@pytest.mark.parametrize('x', [0, 1, m(2)])
606+
def test_passed(x):
607+
pass
608+
""")
609+
result = testdir.runpytest()
610+
result.stdout.fnmatch_lines('* 3 passed in *')
611+
534612

535613
class TestSorting:
536614
def test_check_equality(self, testdir):

testing/test_skipping.py

+7-4
Original file line numberDiff line numberDiff line change
@@ -551,14 +551,17 @@ def test_func():
551551
pytest_runtest_setup(item))
552552
assert x.value.msg == "condition: hasattr(os, 'sep')"
553553

554-
555-
def test_skipif_reporting(self, testdir):
554+
@pytest.mark.parametrize('params', [
555+
'"hasattr(sys, \'platform\')"',
556+
'True, reason="invalid platform"',
557+
])
558+
def test_skipif_reporting(self, testdir, params):
556559
p = testdir.makepyfile(test_foo="""
557560
import pytest
558-
@pytest.mark.skipif("hasattr(sys, 'platform')")
561+
@pytest.mark.skipif(%(params)s)
559562
def test_that():
560563
assert 0
561-
""")
564+
""" % dict(params=params))
562565
result = testdir.runpytest(p, '-s', '-rs')
563566
result.stdout.fnmatch_lines([
564567
"*SKIP*1*test_foo.py*platform*",

0 commit comments

Comments
 (0)