2010-11-18 05:12:16 +08:00
|
|
|
import pytest
|
2011-09-25 13:40:43 +08:00
|
|
|
import sys
|
2009-10-15 22:18:57 +08:00
|
|
|
|
2013-10-12 21:39:22 +08:00
|
|
|
from _pytest.skipping import MarkEvaluator, folded_skips, pytest_runtest_setup
|
2010-11-13 18:10:45 +08:00
|
|
|
from _pytest.runner import runtestprotocol
|
2009-10-17 23:42:40 +08:00
|
|
|
|
2015-10-02 05:36:43 +08:00
|
|
|
|
2015-10-03 23:55:04 +08:00
|
|
|
class TestEvaluator:
|
2010-05-04 18:37:56 +08:00
|
|
|
def test_no_marker(self, testdir):
|
|
|
|
item = testdir.getitem("def test_func(): pass")
|
|
|
|
evalskipif = MarkEvaluator(item, 'skipif')
|
|
|
|
assert not evalskipif
|
|
|
|
assert not evalskipif.istrue()
|
|
|
|
|
|
|
|
def test_marked_no_args(self, testdir):
|
|
|
|
item = testdir.getitem("""
|
2010-11-18 05:12:16 +08:00
|
|
|
import pytest
|
|
|
|
@pytest.mark.xyz
|
2010-07-27 03:15:15 +08:00
|
|
|
def test_func():
|
2010-05-04 18:37:56 +08:00
|
|
|
pass
|
|
|
|
""")
|
|
|
|
ev = MarkEvaluator(item, 'xyz')
|
|
|
|
assert ev
|
|
|
|
assert ev.istrue()
|
|
|
|
expl = ev.getexplanation()
|
2010-05-06 01:50:59 +08:00
|
|
|
assert expl == ""
|
2010-05-04 18:37:56 +08:00
|
|
|
assert not ev.get("run", False)
|
|
|
|
|
|
|
|
def test_marked_one_arg(self, testdir):
|
|
|
|
item = testdir.getitem("""
|
2010-11-18 05:12:16 +08:00
|
|
|
import pytest
|
|
|
|
@pytest.mark.xyz("hasattr(os, 'sep')")
|
2010-07-27 03:15:15 +08:00
|
|
|
def test_func():
|
2010-05-04 18:37:56 +08:00
|
|
|
pass
|
|
|
|
""")
|
|
|
|
ev = MarkEvaluator(item, 'xyz')
|
|
|
|
assert ev
|
|
|
|
assert ev.istrue()
|
|
|
|
expl = ev.getexplanation()
|
|
|
|
assert expl == "condition: hasattr(os, 'sep')"
|
|
|
|
|
2013-02-15 19:47:48 +08:00
|
|
|
@pytest.mark.skipif('sys.version_info[0] >= 3')
|
|
|
|
def test_marked_one_arg_unicode(self, testdir):
|
|
|
|
item = testdir.getitem("""
|
|
|
|
import pytest
|
|
|
|
@pytest.mark.xyz(u"hasattr(os, 'sep')")
|
|
|
|
def test_func():
|
|
|
|
pass
|
|
|
|
""")
|
|
|
|
ev = MarkEvaluator(item, 'xyz')
|
|
|
|
assert ev
|
|
|
|
assert ev.istrue()
|
|
|
|
expl = ev.getexplanation()
|
|
|
|
assert expl == "condition: hasattr(os, 'sep')"
|
|
|
|
|
2010-05-04 18:37:56 +08:00
|
|
|
def test_marked_one_arg_with_reason(self, testdir):
|
|
|
|
item = testdir.getitem("""
|
2010-11-18 05:12:16 +08:00
|
|
|
import pytest
|
|
|
|
@pytest.mark.xyz("hasattr(os, 'sep')", attr=2, reason="hello world")
|
2010-07-27 03:15:15 +08:00
|
|
|
def test_func():
|
2010-05-04 18:37:56 +08:00
|
|
|
pass
|
|
|
|
""")
|
|
|
|
ev = MarkEvaluator(item, 'xyz')
|
|
|
|
assert ev
|
|
|
|
assert ev.istrue()
|
|
|
|
expl = ev.getexplanation()
|
|
|
|
assert expl == "hello world"
|
|
|
|
assert ev.get("attr") == 2
|
|
|
|
|
2010-05-22 00:11:47 +08:00
|
|
|
def test_marked_one_arg_twice(self, testdir):
|
|
|
|
lines = [
|
2010-11-18 05:12:16 +08:00
|
|
|
'''@pytest.mark.skipif("not hasattr(os, 'murks')")''',
|
|
|
|
'''@pytest.mark.skipif("hasattr(os, 'murks')")'''
|
2010-05-22 00:11:47 +08:00
|
|
|
]
|
|
|
|
for i in range(0, 2):
|
|
|
|
item = testdir.getitem("""
|
2010-11-18 05:12:16 +08:00
|
|
|
import pytest
|
2010-05-22 00:11:47 +08:00
|
|
|
%s
|
|
|
|
%s
|
2010-07-27 03:15:15 +08:00
|
|
|
def test_func():
|
2010-05-22 00:11:47 +08:00
|
|
|
pass
|
|
|
|
""" % (lines[i], lines[(i+1) %2]))
|
|
|
|
ev = MarkEvaluator(item, 'skipif')
|
|
|
|
assert ev
|
|
|
|
assert ev.istrue()
|
|
|
|
expl = ev.getexplanation()
|
|
|
|
assert expl == "condition: not hasattr(os, 'murks')"
|
|
|
|
|
|
|
|
def test_marked_one_arg_twice2(self, testdir):
|
|
|
|
item = testdir.getitem("""
|
2010-11-18 05:12:16 +08:00
|
|
|
import pytest
|
|
|
|
@pytest.mark.skipif("hasattr(os, 'murks')")
|
|
|
|
@pytest.mark.skipif("not hasattr(os, 'murks')")
|
2010-07-27 03:15:15 +08:00
|
|
|
def test_func():
|
2010-05-22 00:11:47 +08:00
|
|
|
pass
|
|
|
|
""")
|
|
|
|
ev = MarkEvaluator(item, 'skipif')
|
|
|
|
assert ev
|
|
|
|
assert ev.istrue()
|
|
|
|
expl = ev.getexplanation()
|
|
|
|
assert expl == "condition: not hasattr(os, 'murks')"
|
|
|
|
|
2013-07-07 00:54:24 +08:00
|
|
|
def test_marked_skip_with_not_string(self, testdir):
|
|
|
|
item = testdir.getitem("""
|
|
|
|
import pytest
|
|
|
|
@pytest.mark.skipif(False)
|
|
|
|
def test_func():
|
|
|
|
pass
|
|
|
|
""")
|
|
|
|
ev = MarkEvaluator(item, 'skipif')
|
2013-10-12 21:39:22 +08:00
|
|
|
exc = pytest.raises(pytest.fail.Exception, ev.istrue)
|
2013-07-07 00:54:24 +08:00
|
|
|
assert """Failed: you need to specify reason=STRING when using booleans as conditions.""" in exc.value.msg
|
|
|
|
|
2010-05-04 18:37:56 +08:00
|
|
|
def test_skipif_class(self, testdir):
|
|
|
|
item, = testdir.getitems("""
|
2010-11-18 05:12:16 +08:00
|
|
|
import pytest
|
2010-05-04 18:37:56 +08:00
|
|
|
class TestClass:
|
2010-11-18 05:12:16 +08:00
|
|
|
pytestmark = pytest.mark.skipif("config._hackxyz")
|
2010-05-04 18:37:56 +08:00
|
|
|
def test_func(self):
|
|
|
|
pass
|
|
|
|
""")
|
|
|
|
item.config._hackxyz = 3
|
|
|
|
ev = MarkEvaluator(item, 'skipif')
|
|
|
|
assert ev.istrue()
|
|
|
|
expl = ev.getexplanation()
|
|
|
|
assert expl == "condition: config._hackxyz"
|
|
|
|
|
|
|
|
|
2015-10-02 04:55:51 +08:00
|
|
|
class TestXFail(object):
|
2010-05-04 18:37:56 +08:00
|
|
|
def test_xfail_simple(self, testdir):
|
|
|
|
item = testdir.getitem("""
|
2010-11-18 05:12:16 +08:00
|
|
|
import pytest
|
|
|
|
@pytest.mark.xfail
|
2010-07-27 03:15:15 +08:00
|
|
|
def test_func():
|
2010-05-04 18:37:56 +08:00
|
|
|
assert 0
|
|
|
|
""")
|
|
|
|
reports = runtestprotocol(item, log=False)
|
|
|
|
assert len(reports) == 3
|
|
|
|
callreport = reports[1]
|
2010-07-27 03:15:15 +08:00
|
|
|
assert callreport.skipped
|
2012-06-23 17:32:32 +08:00
|
|
|
assert callreport.wasxfail == ""
|
2010-05-04 18:37:56 +08:00
|
|
|
|
|
|
|
def test_xfail_xpassed(self, testdir):
|
|
|
|
item = testdir.getitem("""
|
2010-11-18 05:12:16 +08:00
|
|
|
import pytest
|
|
|
|
@pytest.mark.xfail
|
2010-07-27 03:15:15 +08:00
|
|
|
def test_func():
|
2010-05-04 18:37:56 +08:00
|
|
|
assert 1
|
|
|
|
""")
|
|
|
|
reports = runtestprotocol(item, log=False)
|
|
|
|
assert len(reports) == 3
|
|
|
|
callreport = reports[1]
|
|
|
|
assert callreport.failed
|
2012-06-23 17:32:32 +08:00
|
|
|
assert callreport.wasxfail == ""
|
2010-05-04 18:37:56 +08:00
|
|
|
|
2010-05-04 19:02:27 +08:00
|
|
|
def test_xfail_run_anyway(self, testdir):
|
|
|
|
testdir.makepyfile("""
|
2010-11-18 05:12:16 +08:00
|
|
|
import pytest
|
|
|
|
@pytest.mark.xfail
|
2010-07-27 03:15:15 +08:00
|
|
|
def test_func():
|
2010-05-04 19:02:27 +08:00
|
|
|
assert 0
|
2013-10-10 04:55:20 +08:00
|
|
|
def test_func2():
|
|
|
|
pytest.xfail("hello")
|
2010-05-04 19:02:27 +08:00
|
|
|
""")
|
|
|
|
result = testdir.runpytest("--runxfail")
|
|
|
|
result.stdout.fnmatch_lines([
|
|
|
|
"*def test_func():*",
|
|
|
|
"*assert 0*",
|
2013-10-10 04:55:20 +08:00
|
|
|
"*1 failed*1 pass*",
|
2010-05-04 19:02:27 +08:00
|
|
|
])
|
|
|
|
|
2010-05-04 18:37:56 +08:00
|
|
|
def test_xfail_evalfalse_but_fails(self, testdir):
|
|
|
|
item = testdir.getitem("""
|
2010-11-18 05:12:16 +08:00
|
|
|
import pytest
|
|
|
|
@pytest.mark.xfail('False')
|
2010-05-04 18:37:56 +08:00
|
|
|
def test_func():
|
|
|
|
assert 0
|
|
|
|
""")
|
|
|
|
reports = runtestprotocol(item, log=False)
|
|
|
|
callreport = reports[1]
|
2010-07-27 03:15:15 +08:00
|
|
|
assert callreport.failed
|
2012-06-23 17:32:32 +08:00
|
|
|
assert not hasattr(callreport, "wasxfail")
|
|
|
|
assert 'xfail' in callreport.keywords
|
2010-05-04 18:37:56 +08:00
|
|
|
|
|
|
|
def test_xfail_not_report_default(self, testdir):
|
|
|
|
p = testdir.makepyfile(test_one="""
|
2010-11-18 05:12:16 +08:00
|
|
|
import pytest
|
|
|
|
@pytest.mark.xfail
|
2010-05-04 18:37:56 +08:00
|
|
|
def test_this():
|
|
|
|
assert 0
|
|
|
|
""")
|
2013-10-12 21:39:22 +08:00
|
|
|
testdir.runpytest(p, '-v')
|
2010-05-06 01:50:59 +08:00
|
|
|
#result.stdout.fnmatch_lines([
|
|
|
|
# "*HINT*use*-r*"
|
|
|
|
#])
|
2010-05-04 18:37:56 +08:00
|
|
|
|
|
|
|
def test_xfail_not_run_xfail_reporting(self, testdir):
|
|
|
|
p = testdir.makepyfile(test_one="""
|
2010-11-18 05:12:16 +08:00
|
|
|
import pytest
|
|
|
|
@pytest.mark.xfail(run=False, reason="noway")
|
2010-05-04 18:37:56 +08:00
|
|
|
def test_this():
|
|
|
|
assert 0
|
2010-11-18 05:12:16 +08:00
|
|
|
@pytest.mark.xfail("True", run=False)
|
2010-05-04 18:37:56 +08:00
|
|
|
def test_this_true():
|
|
|
|
assert 0
|
2010-11-18 05:12:16 +08:00
|
|
|
@pytest.mark.xfail("False", run=False, reason="huh")
|
2010-05-04 18:37:56 +08:00
|
|
|
def test_this_false():
|
|
|
|
assert 1
|
|
|
|
""")
|
|
|
|
result = testdir.runpytest(p, '--report=xfailed', )
|
|
|
|
result.stdout.fnmatch_lines([
|
2010-09-26 22:23:44 +08:00
|
|
|
"*test_one*test_this*",
|
|
|
|
"*NOTRUN*noway",
|
|
|
|
"*test_one*test_this_true*",
|
|
|
|
"*NOTRUN*condition:*True*",
|
2010-05-04 18:37:56 +08:00
|
|
|
"*1 passed*",
|
|
|
|
])
|
|
|
|
|
2010-06-08 08:34:51 +08:00
|
|
|
def test_xfail_not_run_no_setup_run(self, testdir):
|
|
|
|
p = testdir.makepyfile(test_one="""
|
2010-11-18 05:12:16 +08:00
|
|
|
import pytest
|
|
|
|
@pytest.mark.xfail(run=False, reason="hello")
|
2010-06-08 08:34:51 +08:00
|
|
|
def test_this():
|
|
|
|
assert 0
|
|
|
|
def setup_module(mod):
|
|
|
|
raise ValueError(42)
|
|
|
|
""")
|
|
|
|
result = testdir.runpytest(p, '--report=xfailed', )
|
|
|
|
result.stdout.fnmatch_lines([
|
2010-09-26 22:23:44 +08:00
|
|
|
"*test_one*test_this*",
|
|
|
|
"*NOTRUN*hello",
|
2010-06-08 08:34:51 +08:00
|
|
|
"*1 xfailed*",
|
|
|
|
])
|
|
|
|
|
2010-05-04 18:37:56 +08:00
|
|
|
def test_xfail_xpass(self, testdir):
|
|
|
|
p = testdir.makepyfile(test_one="""
|
2010-11-18 05:12:16 +08:00
|
|
|
import pytest
|
|
|
|
@pytest.mark.xfail
|
2010-05-04 18:37:56 +08:00
|
|
|
def test_that():
|
|
|
|
assert 1
|
|
|
|
""")
|
2010-05-20 20:35:13 +08:00
|
|
|
result = testdir.runpytest(p, '-rX')
|
2010-05-04 18:37:56 +08:00
|
|
|
result.stdout.fnmatch_lines([
|
2010-05-06 01:50:59 +08:00
|
|
|
"*XPASS*test_that*",
|
2010-05-04 18:37:56 +08:00
|
|
|
"*1 xpassed*"
|
|
|
|
])
|
2010-10-22 18:00:17 +08:00
|
|
|
assert result.ret == 0
|
2010-05-04 18:37:56 +08:00
|
|
|
|
2010-05-20 19:29:51 +08:00
|
|
|
def test_xfail_imperative(self, testdir):
|
|
|
|
p = testdir.makepyfile("""
|
2010-11-18 05:12:16 +08:00
|
|
|
import pytest
|
2010-05-20 19:29:51 +08:00
|
|
|
def test_this():
|
2010-11-18 05:12:16 +08:00
|
|
|
pytest.xfail("hello")
|
2010-05-20 19:29:51 +08:00
|
|
|
""")
|
|
|
|
result = testdir.runpytest(p)
|
|
|
|
result.stdout.fnmatch_lines([
|
|
|
|
"*1 xfailed*",
|
|
|
|
])
|
|
|
|
result = testdir.runpytest(p, "-rx")
|
|
|
|
result.stdout.fnmatch_lines([
|
2010-09-26 22:23:44 +08:00
|
|
|
"*XFAIL*test_this*",
|
|
|
|
"*reason:*hello*",
|
2010-05-20 19:29:51 +08:00
|
|
|
])
|
2010-05-22 23:08:49 +08:00
|
|
|
result = testdir.runpytest(p, "--runxfail")
|
2013-10-10 04:55:20 +08:00
|
|
|
result.stdout.fnmatch_lines("*1 pass*")
|
2010-05-20 19:29:51 +08:00
|
|
|
|
|
|
|
def test_xfail_imperative_in_setup_function(self, testdir):
|
|
|
|
p = testdir.makepyfile("""
|
2010-11-18 05:12:16 +08:00
|
|
|
import pytest
|
2010-05-20 19:29:51 +08:00
|
|
|
def setup_function(function):
|
2010-11-18 05:12:16 +08:00
|
|
|
pytest.xfail("hello")
|
2010-07-27 03:15:15 +08:00
|
|
|
|
2010-05-20 19:29:51 +08:00
|
|
|
def test_this():
|
|
|
|
assert 0
|
|
|
|
""")
|
|
|
|
result = testdir.runpytest(p)
|
|
|
|
result.stdout.fnmatch_lines([
|
|
|
|
"*1 xfailed*",
|
|
|
|
])
|
|
|
|
result = testdir.runpytest(p, "-rx")
|
|
|
|
result.stdout.fnmatch_lines([
|
2010-09-26 22:23:44 +08:00
|
|
|
"*XFAIL*test_this*",
|
|
|
|
"*reason:*hello*",
|
2010-05-20 19:29:51 +08:00
|
|
|
])
|
2010-05-22 23:08:49 +08:00
|
|
|
result = testdir.runpytest(p, "--runxfail")
|
2013-10-10 04:55:20 +08:00
|
|
|
result.stdout.fnmatch_lines("""
|
|
|
|
*def test_this*
|
|
|
|
*1 fail*
|
|
|
|
""")
|
2010-05-20 19:29:51 +08:00
|
|
|
|
2010-06-08 08:34:51 +08:00
|
|
|
def xtest_dynamic_xfail_set_during_setup(self, testdir):
|
|
|
|
p = testdir.makepyfile("""
|
2010-11-18 05:12:16 +08:00
|
|
|
import pytest
|
2010-06-08 08:34:51 +08:00
|
|
|
def setup_function(function):
|
2010-11-18 05:12:16 +08:00
|
|
|
pytest.mark.xfail(function)
|
2010-06-08 08:34:51 +08:00
|
|
|
def test_this():
|
|
|
|
assert 0
|
|
|
|
def test_that():
|
|
|
|
assert 1
|
|
|
|
""")
|
|
|
|
result = testdir.runpytest(p, '-rxX')
|
|
|
|
result.stdout.fnmatch_lines([
|
|
|
|
"*XFAIL*test_this*",
|
|
|
|
"*XPASS*test_that*",
|
|
|
|
])
|
2010-05-20 19:29:51 +08:00
|
|
|
|
2010-06-08 08:34:51 +08:00
|
|
|
def test_dynamic_xfail_no_run(self, testdir):
|
|
|
|
p = testdir.makepyfile("""
|
2010-11-18 05:12:16 +08:00
|
|
|
import pytest
|
2010-06-08 08:34:51 +08:00
|
|
|
def pytest_funcarg__arg(request):
|
2010-11-18 05:12:16 +08:00
|
|
|
request.applymarker(pytest.mark.xfail(run=False))
|
2010-06-08 08:34:51 +08:00
|
|
|
def test_this(arg):
|
|
|
|
assert 0
|
|
|
|
""")
|
|
|
|
result = testdir.runpytest(p, '-rxX')
|
|
|
|
result.stdout.fnmatch_lines([
|
2010-09-26 22:23:44 +08:00
|
|
|
"*XFAIL*test_this*",
|
|
|
|
"*NOTRUN*",
|
2010-06-08 08:34:51 +08:00
|
|
|
])
|
2010-05-20 19:29:51 +08:00
|
|
|
|
2010-06-08 08:34:51 +08:00
|
|
|
def test_dynamic_xfail_set_during_funcarg_setup(self, testdir):
|
|
|
|
p = testdir.makepyfile("""
|
2010-11-18 05:12:16 +08:00
|
|
|
import pytest
|
2010-06-08 08:34:51 +08:00
|
|
|
def pytest_funcarg__arg(request):
|
2010-11-18 05:12:16 +08:00
|
|
|
request.applymarker(pytest.mark.xfail)
|
2010-06-08 08:34:51 +08:00
|
|
|
def test_this2(arg):
|
|
|
|
assert 0
|
|
|
|
""")
|
|
|
|
result = testdir.runpytest(p)
|
|
|
|
result.stdout.fnmatch_lines([
|
|
|
|
"*1 xfailed*",
|
|
|
|
])
|
2010-05-20 19:29:51 +08:00
|
|
|
|
2014-07-26 21:11:05 +08:00
|
|
|
|
2014-07-27 00:19:27 +08:00
|
|
|
@pytest.mark.parametrize('expected, actual, matchline',
|
|
|
|
[('TypeError', 'TypeError', "*1 xfailed*"),
|
|
|
|
('(AttributeError, TypeError)', 'TypeError', "*1 xfailed*"),
|
|
|
|
('TypeError', 'IndexError', "*1 failed*"),
|
|
|
|
('(AttributeError, TypeError)', 'IndexError', "*1 failed*"),
|
|
|
|
])
|
|
|
|
def test_xfail_raises(self, expected, actual, matchline, testdir):
|
2014-07-26 21:11:05 +08:00
|
|
|
p = testdir.makepyfile("""
|
|
|
|
import pytest
|
2014-07-26 23:46:50 +08:00
|
|
|
@pytest.mark.xfail(raises=%s)
|
2014-07-26 21:11:05 +08:00
|
|
|
def test_raises():
|
2014-07-26 23:46:50 +08:00
|
|
|
raise %s()
|
|
|
|
""" % (expected, actual))
|
2014-07-26 21:11:05 +08:00
|
|
|
result = testdir.runpytest(p)
|
|
|
|
result.stdout.fnmatch_lines([
|
2014-07-26 23:46:50 +08:00
|
|
|
matchline,
|
2014-07-26 21:11:05 +08:00
|
|
|
])
|
|
|
|
|
|
|
|
|
2015-10-03 23:55:04 +08:00
|
|
|
class TestXFailwithSetupTeardown:
|
2010-12-07 01:20:47 +08:00
|
|
|
def test_failing_setup_issue9(self, testdir):
|
|
|
|
testdir.makepyfile("""
|
|
|
|
import pytest
|
|
|
|
def setup_function(func):
|
|
|
|
assert 0
|
|
|
|
|
|
|
|
@pytest.mark.xfail
|
|
|
|
def test_func():
|
|
|
|
pass
|
|
|
|
""")
|
|
|
|
result = testdir.runpytest()
|
|
|
|
result.stdout.fnmatch_lines([
|
|
|
|
"*1 xfail*",
|
|
|
|
])
|
|
|
|
|
|
|
|
def test_failing_teardown_issue9(self, testdir):
|
|
|
|
testdir.makepyfile("""
|
|
|
|
import pytest
|
|
|
|
def teardown_function(func):
|
|
|
|
assert 0
|
|
|
|
|
|
|
|
@pytest.mark.xfail
|
|
|
|
def test_func():
|
|
|
|
pass
|
|
|
|
""")
|
|
|
|
result = testdir.runpytest()
|
|
|
|
result.stdout.fnmatch_lines([
|
|
|
|
"*1 xfail*",
|
|
|
|
])
|
|
|
|
|
2010-05-20 19:29:51 +08:00
|
|
|
|
2015-10-03 23:55:04 +08:00
|
|
|
class TestSkip:
|
2015-09-21 22:47:11 +08:00
|
|
|
def test_skip_class(self, testdir):
|
|
|
|
testdir.makepyfile("""
|
|
|
|
import pytest
|
|
|
|
@pytest.mark.skip
|
|
|
|
class TestSomething(object):
|
|
|
|
def test_foo(self):
|
|
|
|
pass
|
|
|
|
def test_bar(self):
|
|
|
|
pass
|
|
|
|
|
|
|
|
def test_baz():
|
|
|
|
pass
|
|
|
|
""")
|
|
|
|
rec = testdir.inline_run()
|
|
|
|
rec.assertoutcome(skipped=2, passed=1)
|
|
|
|
|
2015-09-28 05:49:09 +08:00
|
|
|
def test_skips_on_false_string(self, testdir):
|
|
|
|
testdir.makepyfile("""
|
|
|
|
import pytest
|
|
|
|
@pytest.mark.skip('False')
|
|
|
|
def test_foo():
|
|
|
|
pass
|
|
|
|
""")
|
|
|
|
rec = testdir.inline_run()
|
|
|
|
rec.assertoutcome(skipped=1)
|
|
|
|
|
2015-10-02 05:35:38 +08:00
|
|
|
def test_arg_as_reason(self, testdir):
|
|
|
|
testdir.makepyfile("""
|
|
|
|
import pytest
|
|
|
|
@pytest.mark.skip('testing stuff')
|
|
|
|
def test_bar():
|
|
|
|
pass
|
|
|
|
""")
|
|
|
|
result = testdir.runpytest('-rs')
|
|
|
|
result.stdout.fnmatch_lines([
|
|
|
|
"*testing stuff*",
|
|
|
|
"*1 skipped*",
|
|
|
|
])
|
|
|
|
|
2015-09-21 19:20:49 +08:00
|
|
|
def test_skip_no_reason(self, testdir):
|
|
|
|
testdir.makepyfile("""
|
|
|
|
import pytest
|
|
|
|
@pytest.mark.skip
|
|
|
|
def test_foo():
|
|
|
|
pass
|
|
|
|
""")
|
2015-10-02 04:56:15 +08:00
|
|
|
result = testdir.runpytest('-rs')
|
|
|
|
result.stdout.fnmatch_lines([
|
2015-10-04 00:00:16 +08:00
|
|
|
"*unconditional skip*",
|
2015-10-02 04:56:15 +08:00
|
|
|
"*1 skipped*",
|
|
|
|
])
|
2015-09-21 19:20:49 +08:00
|
|
|
|
|
|
|
def test_skip_with_reason(self, testdir):
|
|
|
|
testdir.makepyfile("""
|
|
|
|
import pytest
|
|
|
|
@pytest.mark.skip(reason="for lolz")
|
|
|
|
def test_bar():
|
|
|
|
pass
|
|
|
|
""")
|
|
|
|
result = testdir.runpytest('-rs')
|
|
|
|
result.stdout.fnmatch_lines([
|
|
|
|
"*for lolz*",
|
|
|
|
"*1 skipped*",
|
|
|
|
])
|
|
|
|
|
|
|
|
def test_only_skips_marked_test(self, testdir):
|
|
|
|
testdir.makepyfile("""
|
|
|
|
import pytest
|
|
|
|
@pytest.mark.skip
|
|
|
|
def test_foo():
|
|
|
|
pass
|
2015-10-04 00:01:21 +08:00
|
|
|
@pytest.mark.skip(reason="nothing in particular")
|
2015-09-28 05:49:09 +08:00
|
|
|
def test_bar():
|
2015-09-21 19:20:49 +08:00
|
|
|
pass
|
|
|
|
def test_baz():
|
|
|
|
assert True
|
|
|
|
""")
|
2015-09-28 05:49:09 +08:00
|
|
|
result = testdir.runpytest('-rs')
|
|
|
|
result.stdout.fnmatch_lines([
|
2015-10-04 00:01:21 +08:00
|
|
|
"*nothing in particular*",
|
2015-09-28 05:49:09 +08:00
|
|
|
"*1 passed*2 skipped*",
|
|
|
|
])
|
2015-09-21 19:20:49 +08:00
|
|
|
|
2015-10-03 23:55:04 +08:00
|
|
|
class TestSkipif:
|
2010-05-04 18:37:56 +08:00
|
|
|
def test_skipif_conditional(self, testdir):
|
|
|
|
item = testdir.getitem("""
|
2010-11-18 05:12:16 +08:00
|
|
|
import pytest
|
|
|
|
@pytest.mark.skipif("hasattr(os, 'sep')")
|
2010-07-27 03:15:15 +08:00
|
|
|
def test_func():
|
2010-05-04 18:37:56 +08:00
|
|
|
pass
|
2013-10-12 21:39:22 +08:00
|
|
|
""") # noqa
|
|
|
|
x = pytest.raises(pytest.skip.Exception, lambda:
|
|
|
|
pytest_runtest_setup(item))
|
2010-05-04 18:37:56 +08:00
|
|
|
assert x.value.msg == "condition: hasattr(os, 'sep')"
|
|
|
|
|
|
|
|
|
|
|
|
def test_skipif_reporting(self, testdir):
|
2015-06-19 08:59:44 +08:00
|
|
|
p = testdir.makepyfile(test_foo="""
|
2010-11-18 05:12:16 +08:00
|
|
|
import pytest
|
|
|
|
@pytest.mark.skipif("hasattr(sys, 'platform')")
|
2010-05-04 18:37:56 +08:00
|
|
|
def test_that():
|
|
|
|
assert 0
|
|
|
|
""")
|
2010-05-06 01:50:59 +08:00
|
|
|
result = testdir.runpytest(p, '-s', '-rs')
|
2010-05-04 18:37:56 +08:00
|
|
|
result.stdout.fnmatch_lines([
|
2015-06-19 08:59:44 +08:00
|
|
|
"*SKIP*1*test_foo.py*platform*",
|
2010-05-04 18:37:56 +08:00
|
|
|
"*1 skipped*"
|
|
|
|
])
|
|
|
|
assert result.ret == 0
|
2010-05-03 04:13:16 +08:00
|
|
|
|
2015-07-19 04:16:27 +08:00
|
|
|
@pytest.mark.parametrize('marker, msg1, msg2', [
|
|
|
|
('skipif', 'SKIP', 'skipped'),
|
|
|
|
('xfail', 'XPASS', 'xpassed'),
|
|
|
|
])
|
|
|
|
def test_skipif_reporting_multiple(self, testdir, marker, msg1, msg2):
|
|
|
|
testdir.makepyfile(test_foo="""
|
|
|
|
import pytest
|
|
|
|
@pytest.mark.{marker}(False, reason='first_condition')
|
|
|
|
@pytest.mark.{marker}(True, reason='second_condition')
|
|
|
|
def test_foobar():
|
|
|
|
assert 1
|
|
|
|
""".format(marker=marker))
|
|
|
|
result = testdir.runpytest('-s', '-rsxX')
|
|
|
|
result.stdout.fnmatch_lines([
|
|
|
|
"*{msg1}*test_foo.py*second_condition*".format(msg1=msg1),
|
|
|
|
"*1 {msg2}*".format(msg2=msg2),
|
|
|
|
])
|
|
|
|
assert result.ret == 0
|
|
|
|
|
|
|
|
|
2009-10-17 23:42:40 +08:00
|
|
|
def test_skip_not_report_default(testdir):
|
|
|
|
p = testdir.makepyfile(test_one="""
|
2010-11-18 05:12:16 +08:00
|
|
|
import pytest
|
2009-10-17 23:42:40 +08:00
|
|
|
def test_this():
|
2010-11-18 05:12:16 +08:00
|
|
|
pytest.skip("hello")
|
2009-10-17 23:42:40 +08:00
|
|
|
""")
|
|
|
|
result = testdir.runpytest(p, '-v')
|
2010-04-29 06:12:38 +08:00
|
|
|
result.stdout.fnmatch_lines([
|
2010-05-06 01:50:59 +08:00
|
|
|
#"*HINT*use*-r*",
|
|
|
|
"*1 skipped*",
|
2009-10-17 23:42:40 +08:00
|
|
|
])
|
|
|
|
|
2009-10-15 22:18:57 +08:00
|
|
|
|
|
|
|
def test_skipif_class(testdir):
|
|
|
|
p = testdir.makepyfile("""
|
2010-11-18 05:12:16 +08:00
|
|
|
import pytest
|
2010-07-27 03:15:15 +08:00
|
|
|
|
2009-10-15 22:18:57 +08:00
|
|
|
class TestClass:
|
2010-11-18 05:12:16 +08:00
|
|
|
pytestmark = pytest.mark.skipif("True")
|
2009-10-15 22:18:57 +08:00
|
|
|
def test_that(self):
|
|
|
|
assert 0
|
|
|
|
def test_though(self):
|
|
|
|
assert 0
|
|
|
|
""")
|
|
|
|
result = testdir.runpytest(p)
|
2010-04-29 06:12:38 +08:00
|
|
|
result.stdout.fnmatch_lines([
|
2009-10-15 22:18:57 +08:00
|
|
|
"*2 skipped*"
|
|
|
|
])
|
|
|
|
|
2009-10-17 23:42:40 +08:00
|
|
|
|
|
|
|
def test_skip_reasons_folding():
|
2010-11-14 04:03:28 +08:00
|
|
|
path = 'xyz'
|
|
|
|
lineno = 3
|
|
|
|
message = "justso"
|
|
|
|
longrepr = (path, lineno, message)
|
2009-10-17 23:42:40 +08:00
|
|
|
|
2010-09-26 22:23:44 +08:00
|
|
|
class X:
|
|
|
|
pass
|
|
|
|
ev1 = X()
|
2009-10-17 23:42:40 +08:00
|
|
|
ev1.when = "execute"
|
|
|
|
ev1.skipped = True
|
2010-07-27 03:15:15 +08:00
|
|
|
ev1.longrepr = longrepr
|
|
|
|
|
2010-09-26 22:23:44 +08:00
|
|
|
ev2 = X()
|
|
|
|
ev2.longrepr = longrepr
|
2009-10-17 23:42:40 +08:00
|
|
|
ev2.skipped = True
|
|
|
|
|
|
|
|
l = folded_skips([ev1, ev2])
|
|
|
|
assert len(l) == 1
|
|
|
|
num, fspath, lineno, reason = l[0]
|
|
|
|
assert num == 2
|
2010-11-14 04:03:28 +08:00
|
|
|
assert fspath == path
|
|
|
|
assert lineno == lineno
|
|
|
|
assert reason == message
|
2009-10-17 23:42:40 +08:00
|
|
|
|
|
|
|
def test_skipped_reasons_functional(testdir):
|
|
|
|
testdir.makepyfile(
|
|
|
|
test_one="""
|
|
|
|
from conftest import doskip
|
|
|
|
def setup_function(func):
|
|
|
|
doskip()
|
|
|
|
def test_func():
|
|
|
|
pass
|
|
|
|
class TestClass:
|
|
|
|
def test_method(self):
|
|
|
|
doskip()
|
|
|
|
""",
|
|
|
|
test_two = """
|
|
|
|
from conftest import doskip
|
|
|
|
doskip()
|
|
|
|
""",
|
|
|
|
conftest = """
|
2010-11-18 05:12:16 +08:00
|
|
|
import pytest
|
2009-10-17 23:42:40 +08:00
|
|
|
def doskip():
|
2010-11-18 05:12:16 +08:00
|
|
|
pytest.skip('test')
|
2009-10-17 23:42:40 +08:00
|
|
|
"""
|
|
|
|
)
|
2010-07-27 03:15:15 +08:00
|
|
|
result = testdir.runpytest('--report=skipped')
|
2010-04-29 06:12:38 +08:00
|
|
|
result.stdout.fnmatch_lines([
|
2010-11-06 06:37:31 +08:00
|
|
|
"*SKIP*3*conftest.py:3: test",
|
2009-10-17 23:42:40 +08:00
|
|
|
])
|
|
|
|
assert result.ret == 0
|
|
|
|
|
2010-05-19 22:52:03 +08:00
|
|
|
def test_reportchars(testdir):
|
|
|
|
testdir.makepyfile("""
|
2010-11-18 05:12:16 +08:00
|
|
|
import pytest
|
2010-05-19 22:52:03 +08:00
|
|
|
def test_1():
|
|
|
|
assert 0
|
2010-11-18 05:12:16 +08:00
|
|
|
@pytest.mark.xfail
|
2010-05-19 22:52:03 +08:00
|
|
|
def test_2():
|
|
|
|
assert 0
|
2010-11-18 05:12:16 +08:00
|
|
|
@pytest.mark.xfail
|
2010-05-19 22:52:03 +08:00
|
|
|
def test_3():
|
|
|
|
pass
|
|
|
|
def test_4():
|
2010-11-18 05:12:16 +08:00
|
|
|
pytest.skip("four")
|
2010-05-19 22:52:03 +08:00
|
|
|
""")
|
2010-05-20 20:35:13 +08:00
|
|
|
result = testdir.runpytest("-rfxXs")
|
2010-05-19 22:52:03 +08:00
|
|
|
result.stdout.fnmatch_lines([
|
|
|
|
"FAIL*test_1*",
|
|
|
|
"XFAIL*test_2*",
|
|
|
|
"XPASS*test_3*",
|
|
|
|
"SKIP*four*",
|
|
|
|
])
|
2011-03-03 19:19:17 +08:00
|
|
|
|
2011-09-30 05:44:26 +08:00
|
|
|
def test_reportchars_error(testdir):
|
|
|
|
testdir.makepyfile(
|
|
|
|
conftest="""
|
|
|
|
def pytest_runtest_teardown():
|
|
|
|
assert 0
|
|
|
|
""",
|
|
|
|
test_simple="""
|
|
|
|
def test_foo():
|
|
|
|
pass
|
|
|
|
""")
|
|
|
|
result = testdir.runpytest('-rE')
|
|
|
|
result.stdout.fnmatch_lines([
|
|
|
|
'ERROR*test_foo*',
|
|
|
|
])
|
|
|
|
|
2015-09-11 14:54:45 +08:00
|
|
|
def test_reportchars_all(testdir):
|
|
|
|
testdir.makepyfile("""
|
|
|
|
import pytest
|
|
|
|
def test_1():
|
|
|
|
assert 0
|
|
|
|
@pytest.mark.xfail
|
|
|
|
def test_2():
|
|
|
|
assert 0
|
|
|
|
@pytest.mark.xfail
|
|
|
|
def test_3():
|
|
|
|
pass
|
|
|
|
def test_4():
|
|
|
|
pytest.skip("four")
|
|
|
|
""")
|
|
|
|
result = testdir.runpytest("-ra")
|
|
|
|
result.stdout.fnmatch_lines([
|
|
|
|
"FAIL*test_1*",
|
|
|
|
"SKIP*four*",
|
|
|
|
"XFAIL*test_2*",
|
|
|
|
"XPASS*test_3*",
|
|
|
|
])
|
|
|
|
|
|
|
|
def test_reportchars_all_error(testdir):
|
|
|
|
testdir.makepyfile(
|
|
|
|
conftest="""
|
|
|
|
def pytest_runtest_teardown():
|
|
|
|
assert 0
|
|
|
|
""",
|
|
|
|
test_simple="""
|
|
|
|
def test_foo():
|
|
|
|
pass
|
|
|
|
""")
|
|
|
|
result = testdir.runpytest('-ra')
|
|
|
|
result.stdout.fnmatch_lines([
|
|
|
|
'ERROR*test_foo*',
|
|
|
|
])
|
|
|
|
|
2011-03-05 21:59:06 +08:00
|
|
|
@pytest.mark.xfail("hasattr(sys, 'pypy_version_info')")
|
2011-03-03 19:19:17 +08:00
|
|
|
def test_errors_in_xfail_skip_expressions(testdir):
|
|
|
|
testdir.makepyfile("""
|
|
|
|
import pytest
|
|
|
|
@pytest.mark.skipif("asd")
|
|
|
|
def test_nameerror():
|
|
|
|
pass
|
|
|
|
@pytest.mark.xfail("syntax error")
|
|
|
|
def test_syntax():
|
|
|
|
pass
|
|
|
|
|
|
|
|
def test_func():
|
|
|
|
pass
|
|
|
|
""")
|
|
|
|
result = testdir.runpytest()
|
2011-09-25 13:40:43 +08:00
|
|
|
markline = " ^"
|
|
|
|
if sys.platform.startswith("java"):
|
|
|
|
# XXX report this to java
|
|
|
|
markline = "*" + markline[8:]
|
2011-03-03 19:19:17 +08:00
|
|
|
result.stdout.fnmatch_lines([
|
|
|
|
"*ERROR*test_nameerror*",
|
|
|
|
"*evaluating*skipif*expression*",
|
|
|
|
"*asd*",
|
|
|
|
"*ERROR*test_syntax*",
|
|
|
|
"*evaluating*xfail*expression*",
|
|
|
|
" syntax error",
|
2011-09-25 13:40:43 +08:00
|
|
|
markline,
|
2011-03-03 19:19:17 +08:00
|
|
|
"SyntaxError: invalid syntax",
|
|
|
|
"*1 pass*2 error*",
|
|
|
|
])
|
|
|
|
|
2011-03-04 06:22:55 +08:00
|
|
|
def test_xfail_skipif_with_globals(testdir):
|
|
|
|
testdir.makepyfile("""
|
|
|
|
import pytest
|
|
|
|
x = 3
|
|
|
|
@pytest.mark.skipif("x == 3")
|
|
|
|
def test_skip1():
|
|
|
|
pass
|
|
|
|
@pytest.mark.xfail("x == 3")
|
|
|
|
def test_boolean():
|
|
|
|
assert 0
|
|
|
|
""")
|
|
|
|
result = testdir.runpytest("-rsx")
|
|
|
|
result.stdout.fnmatch_lines([
|
|
|
|
"*SKIP*x == 3*",
|
|
|
|
"*XFAIL*test_boolean*",
|
|
|
|
"*x == 3*",
|
|
|
|
])
|
|
|
|
|
|
|
|
def test_direct_gives_error(testdir):
|
|
|
|
testdir.makepyfile("""
|
|
|
|
import pytest
|
|
|
|
@pytest.mark.skipif(True)
|
|
|
|
def test_skip1():
|
|
|
|
pass
|
|
|
|
""")
|
|
|
|
result = testdir.runpytest()
|
|
|
|
result.stdout.fnmatch_lines([
|
|
|
|
"*1 error*",
|
|
|
|
])
|
|
|
|
|
2011-03-03 19:19:17 +08:00
|
|
|
|
2011-11-12 06:56:11 +08:00
|
|
|
def test_default_markers(testdir):
|
|
|
|
result = testdir.runpytest("--markers")
|
|
|
|
result.stdout.fnmatch_lines([
|
2012-10-20 20:10:12 +08:00
|
|
|
"*skipif(*condition)*skip*",
|
2014-07-26 21:11:05 +08:00
|
|
|
"*xfail(*condition, reason=None, run=True, raises=None)*expected failure*",
|
2011-11-12 06:56:11 +08:00
|
|
|
])
|
|
|
|
|
2012-06-20 05:48:39 +08:00
|
|
|
def test_xfail_test_setup_exception(testdir):
|
|
|
|
testdir.makeconftest("""
|
|
|
|
def pytest_runtest_setup():
|
|
|
|
0 / 0
|
|
|
|
""")
|
|
|
|
p = testdir.makepyfile("""
|
|
|
|
import pytest
|
|
|
|
@pytest.mark.xfail
|
|
|
|
def test_func():
|
|
|
|
assert 0
|
|
|
|
""")
|
|
|
|
result = testdir.runpytest(p)
|
|
|
|
assert result.ret == 0
|
|
|
|
assert 'xfailed' in result.stdout.str()
|
|
|
|
assert 'xpassed' not in result.stdout.str()
|
2012-06-23 17:32:32 +08:00
|
|
|
|
|
|
|
def test_imperativeskip_on_xfail_test(testdir):
|
|
|
|
testdir.makepyfile("""
|
|
|
|
import pytest
|
|
|
|
@pytest.mark.xfail
|
|
|
|
def test_that_fails():
|
|
|
|
assert 0
|
|
|
|
|
|
|
|
@pytest.mark.skipif("True")
|
|
|
|
def test_hello():
|
|
|
|
pass
|
|
|
|
""")
|
|
|
|
testdir.makeconftest("""
|
|
|
|
import pytest
|
|
|
|
def pytest_runtest_setup(item):
|
|
|
|
pytest.skip("abc")
|
|
|
|
""")
|
|
|
|
result = testdir.runpytest("-rsxX")
|
|
|
|
result.stdout.fnmatch_lines_random("""
|
|
|
|
*SKIP*abc*
|
|
|
|
*SKIP*condition: True*
|
|
|
|
*2 skipped*
|
|
|
|
""")
|
|
|
|
|
2013-05-08 00:40:26 +08:00
|
|
|
class TestBooleanCondition:
|
|
|
|
def test_skipif(self, testdir):
|
|
|
|
testdir.makepyfile("""
|
|
|
|
import pytest
|
|
|
|
@pytest.mark.skipif(True, reason="True123")
|
|
|
|
def test_func1():
|
|
|
|
pass
|
|
|
|
@pytest.mark.skipif(False, reason="True123")
|
|
|
|
def test_func2():
|
|
|
|
pass
|
|
|
|
""")
|
|
|
|
result = testdir.runpytest()
|
|
|
|
result.stdout.fnmatch_lines("""
|
|
|
|
*1 passed*1 skipped*
|
|
|
|
""")
|
|
|
|
|
|
|
|
def test_skipif_noreason(self, testdir):
|
|
|
|
testdir.makepyfile("""
|
|
|
|
import pytest
|
|
|
|
@pytest.mark.skipif(True)
|
|
|
|
def test_func():
|
|
|
|
pass
|
|
|
|
""")
|
|
|
|
result = testdir.runpytest("-rs")
|
|
|
|
result.stdout.fnmatch_lines("""
|
|
|
|
*1 error*
|
|
|
|
""")
|
|
|
|
|
|
|
|
def test_xfail(self, testdir):
|
|
|
|
testdir.makepyfile("""
|
|
|
|
import pytest
|
|
|
|
@pytest.mark.xfail(True, reason="True123")
|
|
|
|
def test_func():
|
|
|
|
assert 0
|
|
|
|
""")
|
|
|
|
result = testdir.runpytest("-rxs")
|
|
|
|
result.stdout.fnmatch_lines("""
|
|
|
|
*XFAIL*
|
|
|
|
*True123*
|
|
|
|
*1 xfail*
|
|
|
|
""")
|
2014-09-24 06:55:26 +08:00
|
|
|
|
|
|
|
|
|
|
|
def test_xfail_item(testdir):
|
|
|
|
# Ensure pytest.xfail works with non-Python Item
|
|
|
|
testdir.makeconftest("""
|
|
|
|
import pytest
|
|
|
|
|
|
|
|
class MyItem(pytest.Item):
|
|
|
|
nodeid = 'foo'
|
|
|
|
def runtest(self):
|
|
|
|
pytest.xfail("Expected Failure")
|
|
|
|
|
|
|
|
def pytest_collect_file(path, parent):
|
|
|
|
return MyItem("foo", parent)
|
|
|
|
""")
|
|
|
|
result = testdir.inline_run()
|
|
|
|
passed, skipped, failed = result.listoutcomes()
|
|
|
|
assert not failed
|
|
|
|
xfailed = [r for r in skipped if hasattr(r, 'wasxfail')]
|
|
|
|
assert xfailed
|