2010-11-18 05:12:16 +08:00
|
|
|
import py, pytest
|
2010-11-13 18:10:45 +08:00
|
|
|
from _pytest.mark import MarkGenerator as Mark
|
2009-09-06 22:59:39 +08:00
|
|
|
|
2009-10-22 21:21:58 +08:00
|
|
|
class TestMark:
|
2010-11-18 21:56:16 +08:00
|
|
|
def test_pytest_exists_in_namespace_all(self):
|
|
|
|
assert 'mark' in py.test.__all__
|
|
|
|
assert 'mark' in pytest.__all__
|
|
|
|
|
2009-10-22 21:21:58 +08:00
|
|
|
def test_pytest_mark_notcallable(self):
|
|
|
|
mark = Mark()
|
2010-11-18 05:12:16 +08:00
|
|
|
pytest.raises((AttributeError, TypeError), "mark()")
|
2009-10-22 21:21:58 +08:00
|
|
|
|
|
|
|
def test_pytest_mark_bare(self):
|
|
|
|
mark = Mark()
|
2010-10-26 05:08:56 +08:00
|
|
|
def f():
|
|
|
|
pass
|
2009-10-22 21:21:58 +08:00
|
|
|
mark.hello(f)
|
|
|
|
assert f.hello
|
|
|
|
|
|
|
|
def test_pytest_mark_keywords(self):
|
|
|
|
mark = Mark()
|
2010-10-26 05:08:56 +08:00
|
|
|
def f():
|
|
|
|
pass
|
2009-10-22 21:21:58 +08:00
|
|
|
mark.world(x=3, y=4)(f)
|
2010-07-27 03:15:15 +08:00
|
|
|
assert f.world
|
2010-10-14 00:41:53 +08:00
|
|
|
assert f.world.kwargs['x'] == 3
|
|
|
|
assert f.world.kwargs['y'] == 4
|
2009-10-22 21:21:58 +08:00
|
|
|
|
|
|
|
def test_apply_multiple_and_merge(self):
|
|
|
|
mark = Mark()
|
2010-10-26 05:08:56 +08:00
|
|
|
def f():
|
|
|
|
pass
|
2009-10-22 21:21:58 +08:00
|
|
|
marker = mark.world
|
|
|
|
mark.world(x=3)(f)
|
2010-10-14 00:41:53 +08:00
|
|
|
assert f.world.kwargs['x'] == 3
|
2009-10-22 21:21:58 +08:00
|
|
|
mark.world(y=4)(f)
|
2010-10-14 00:41:53 +08:00
|
|
|
assert f.world.kwargs['x'] == 3
|
|
|
|
assert f.world.kwargs['y'] == 4
|
2009-10-22 21:21:58 +08:00
|
|
|
mark.world(y=1)(f)
|
2010-10-14 00:41:53 +08:00
|
|
|
assert f.world.kwargs['y'] == 1
|
2009-10-23 02:57:21 +08:00
|
|
|
assert len(f.world.args) == 0
|
2009-10-22 21:21:58 +08:00
|
|
|
|
|
|
|
def test_pytest_mark_positional(self):
|
|
|
|
mark = Mark()
|
2010-10-26 05:08:56 +08:00
|
|
|
def f():
|
|
|
|
pass
|
2009-10-22 21:21:58 +08:00
|
|
|
mark.world("hello")(f)
|
2009-10-23 02:57:21 +08:00
|
|
|
assert f.world.args[0] == "hello"
|
2009-10-22 21:21:58 +08:00
|
|
|
mark.world("world")(f)
|
|
|
|
|
2010-11-21 03:17:38 +08:00
|
|
|
def test_pytest_mark_reuse(self):
|
|
|
|
mark = Mark()
|
|
|
|
def f():
|
|
|
|
pass
|
|
|
|
w = mark.some
|
|
|
|
w("hello", reason="123")(f)
|
|
|
|
assert f.some.args[0] == "hello"
|
|
|
|
assert f.some.kwargs['reason'] == "123"
|
|
|
|
def g():
|
|
|
|
pass
|
|
|
|
w("world", reason2="456")(g)
|
|
|
|
assert g.some.args[0] == "world"
|
|
|
|
assert 'reason' not in g.some.kwargs
|
|
|
|
assert g.some.kwargs['reason2'] == "456"
|
|
|
|
|
2009-10-22 21:21:58 +08:00
|
|
|
class TestFunctional:
|
|
|
|
def test_mark_per_function(self, testdir):
|
|
|
|
p = testdir.makepyfile("""
|
2010-11-18 05:12:16 +08:00
|
|
|
import pytest
|
|
|
|
@pytest.mark.hello
|
2009-10-22 21:21:58 +08:00
|
|
|
def test_hello():
|
|
|
|
assert hasattr(test_hello, 'hello')
|
|
|
|
""")
|
|
|
|
result = testdir.runpytest(p)
|
2010-04-29 06:12:38 +08:00
|
|
|
result.stdout.fnmatch_lines(["*passed*"])
|
2009-10-22 21:21:58 +08:00
|
|
|
|
|
|
|
def test_mark_per_module(self, testdir):
|
|
|
|
item = testdir.getitem("""
|
2010-11-18 05:12:16 +08:00
|
|
|
import pytest
|
|
|
|
pytestmark = pytest.mark.hello
|
2009-10-22 21:21:58 +08:00
|
|
|
def test_func():
|
|
|
|
pass
|
|
|
|
""")
|
2010-06-08 08:34:51 +08:00
|
|
|
keywords = item.keywords
|
2009-10-22 21:21:58 +08:00
|
|
|
assert 'hello' in keywords
|
|
|
|
|
2010-05-22 00:11:47 +08:00
|
|
|
def test_marklist_per_class(self, testdir):
|
2010-10-26 05:08:56 +08:00
|
|
|
item = testdir.getitem("""
|
2010-11-18 05:12:16 +08:00
|
|
|
import pytest
|
2009-10-22 21:21:58 +08:00
|
|
|
class TestClass:
|
2010-11-18 05:12:16 +08:00
|
|
|
pytestmark = [pytest.mark.hello, pytest.mark.world]
|
2009-10-22 21:21:58 +08:00
|
|
|
def test_func(self):
|
2010-07-27 03:15:15 +08:00
|
|
|
assert TestClass.test_func.hello
|
2010-05-22 00:11:47 +08:00
|
|
|
assert TestClass.test_func.world
|
2009-10-22 21:21:58 +08:00
|
|
|
""")
|
2010-06-08 08:34:51 +08:00
|
|
|
keywords = item.keywords
|
2009-10-22 21:21:58 +08:00
|
|
|
assert 'hello' in keywords
|
|
|
|
|
2010-05-22 00:11:47 +08:00
|
|
|
def test_marklist_per_module(self, testdir):
|
2010-10-26 05:08:56 +08:00
|
|
|
item = testdir.getitem("""
|
2010-11-18 05:12:16 +08:00
|
|
|
import pytest
|
|
|
|
pytestmark = [pytest.mark.hello, pytest.mark.world]
|
2010-05-22 00:11:47 +08:00
|
|
|
class TestClass:
|
|
|
|
def test_func(self):
|
2010-07-27 03:15:15 +08:00
|
|
|
assert TestClass.test_func.hello
|
2010-05-22 00:11:47 +08:00
|
|
|
assert TestClass.test_func.world
|
|
|
|
""")
|
2010-06-08 08:34:51 +08:00
|
|
|
keywords = item.keywords
|
2010-05-22 00:11:47 +08:00
|
|
|
assert 'hello' in keywords
|
|
|
|
assert 'world' in keywords
|
|
|
|
|
2010-11-18 05:12:16 +08:00
|
|
|
@pytest.mark.skipif("sys.version_info < (2,6)")
|
2010-05-22 00:11:47 +08:00
|
|
|
def test_mark_per_class_decorator(self, testdir):
|
2010-10-26 05:08:56 +08:00
|
|
|
item = testdir.getitem("""
|
2010-11-18 05:12:16 +08:00
|
|
|
import pytest
|
|
|
|
@pytest.mark.hello
|
2010-05-22 00:11:47 +08:00
|
|
|
class TestClass:
|
|
|
|
def test_func(self):
|
2010-07-27 03:15:15 +08:00
|
|
|
assert TestClass.test_func.hello
|
2010-05-22 00:11:47 +08:00
|
|
|
""")
|
2010-06-08 08:34:51 +08:00
|
|
|
keywords = item.keywords
|
2010-05-22 00:11:47 +08:00
|
|
|
assert 'hello' in keywords
|
|
|
|
|
2010-11-18 05:12:16 +08:00
|
|
|
@pytest.mark.skipif("sys.version_info < (2,6)")
|
2010-05-22 00:11:47 +08:00
|
|
|
def test_mark_per_class_decorator_plus_existing_dec(self, testdir):
|
2010-10-26 05:08:56 +08:00
|
|
|
item = testdir.getitem("""
|
2010-11-18 05:12:16 +08:00
|
|
|
import pytest
|
|
|
|
@pytest.mark.hello
|
2010-05-22 00:11:47 +08:00
|
|
|
class TestClass:
|
2010-11-18 05:12:16 +08:00
|
|
|
pytestmark = pytest.mark.world
|
2010-05-22 00:11:47 +08:00
|
|
|
def test_func(self):
|
2010-07-27 03:15:15 +08:00
|
|
|
assert TestClass.test_func.hello
|
2010-05-22 00:11:47 +08:00
|
|
|
assert TestClass.test_func.world
|
|
|
|
""")
|
2010-06-08 08:34:51 +08:00
|
|
|
keywords = item.keywords
|
2010-05-22 00:11:47 +08:00
|
|
|
assert 'hello' in keywords
|
|
|
|
assert 'world' in keywords
|
|
|
|
|
2009-10-22 21:21:58 +08:00
|
|
|
def test_merging_markers(self, testdir):
|
|
|
|
p = testdir.makepyfile("""
|
2010-11-18 05:12:16 +08:00
|
|
|
import pytest
|
|
|
|
pytestmark = pytest.mark.hello("pos1", x=1, y=2)
|
2009-10-22 21:21:58 +08:00
|
|
|
class TestClass:
|
|
|
|
# classlevel overrides module level
|
2010-11-18 05:12:16 +08:00
|
|
|
pytestmark = pytest.mark.hello(x=3)
|
|
|
|
@pytest.mark.hello("pos0", z=4)
|
2009-10-22 21:21:58 +08:00
|
|
|
def test_func(self):
|
|
|
|
pass
|
|
|
|
""")
|
|
|
|
items, rec = testdir.inline_genitems(p)
|
|
|
|
item, = items
|
2010-06-08 08:34:51 +08:00
|
|
|
keywords = item.keywords
|
2009-10-22 21:21:58 +08:00
|
|
|
marker = keywords['hello']
|
2010-11-21 03:17:38 +08:00
|
|
|
assert marker.args == ("pos0", "pos1")
|
2009-10-23 02:57:21 +08:00
|
|
|
assert marker.kwargs == {'x': 3, 'y': 2, 'z': 4}
|
2009-10-22 21:21:58 +08:00
|
|
|
|
|
|
|
def test_mark_other(self, testdir):
|
2010-11-18 05:12:16 +08:00
|
|
|
pytest.raises(TypeError, '''
|
2010-10-26 05:08:56 +08:00
|
|
|
testdir.getitem("""
|
2010-11-18 05:12:16 +08:00
|
|
|
import pytest
|
2010-10-26 05:08:56 +08:00
|
|
|
class pytestmark:
|
|
|
|
pass
|
|
|
|
def test_func():
|
|
|
|
pass
|
|
|
|
""")
|
|
|
|
''')
|
2010-06-08 08:34:51 +08:00
|
|
|
|
|
|
|
def test_mark_dynamically_in_funcarg(self, testdir):
|
|
|
|
testdir.makeconftest("""
|
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.hello)
|
2010-06-08 08:34:51 +08:00
|
|
|
def pytest_terminal_summary(terminalreporter):
|
2010-07-27 03:15:15 +08:00
|
|
|
l = terminalreporter.stats['passed']
|
2010-06-08 08:34:51 +08:00
|
|
|
terminalreporter._tw.line("keyword: %s" % l[0].keywords)
|
|
|
|
""")
|
|
|
|
testdir.makepyfile("""
|
|
|
|
def test_func(arg):
|
|
|
|
pass
|
|
|
|
""")
|
|
|
|
result = testdir.runpytest()
|
|
|
|
result.stdout.fnmatch_lines([
|
|
|
|
"keyword: *hello*"
|
|
|
|
])
|
2010-10-12 19:05:29 +08:00
|
|
|
|
|
|
|
|
|
|
|
class Test_genitems:
|
|
|
|
def test_check_collect_hashes(self, testdir):
|
|
|
|
p = testdir.makepyfile("""
|
|
|
|
def test_1():
|
|
|
|
pass
|
|
|
|
|
|
|
|
def test_2():
|
|
|
|
pass
|
|
|
|
""")
|
|
|
|
p.copy(p.dirpath(p.purebasename + "2" + ".py"))
|
|
|
|
items, reprec = testdir.inline_genitems(p.dirpath())
|
|
|
|
assert len(items) == 4
|
|
|
|
for numi, i in enumerate(items):
|
|
|
|
for numj, j in enumerate(items):
|
|
|
|
if numj != numi:
|
|
|
|
assert hash(i) != hash(j)
|
|
|
|
assert i != j
|
|
|
|
|
|
|
|
def test_root_conftest_syntax_error(self, testdir):
|
|
|
|
# do we want to unify behaviour with
|
|
|
|
# test_subdir_conftest_error?
|
|
|
|
p = testdir.makepyfile(conftest="raise SyntaxError\n")
|
2010-11-18 05:12:16 +08:00
|
|
|
pytest.raises(SyntaxError, testdir.inline_genitems, p.dirpath())
|
2010-10-12 19:05:29 +08:00
|
|
|
|
|
|
|
def test_example_items1(self, testdir):
|
|
|
|
p = testdir.makepyfile('''
|
|
|
|
def testone():
|
|
|
|
pass
|
|
|
|
|
|
|
|
class TestX:
|
|
|
|
def testmethod_one(self):
|
|
|
|
pass
|
|
|
|
|
|
|
|
class TestY(TestX):
|
|
|
|
pass
|
|
|
|
''')
|
|
|
|
items, reprec = testdir.inline_genitems(p)
|
|
|
|
assert len(items) == 3
|
|
|
|
assert items[0].name == 'testone'
|
|
|
|
assert items[1].name == 'testmethod_one'
|
|
|
|
assert items[2].name == 'testmethod_one'
|
|
|
|
|
|
|
|
# let's also test getmodpath here
|
|
|
|
assert items[0].getmodpath() == "testone"
|
|
|
|
assert items[1].getmodpath() == "TestX.testmethod_one"
|
|
|
|
assert items[2].getmodpath() == "TestY.testmethod_one"
|
|
|
|
|
|
|
|
s = items[0].getmodpath(stopatmodule=False)
|
|
|
|
assert s.endswith("test_example_items1.testone")
|
|
|
|
print(s)
|
|
|
|
|
|
|
|
|
|
|
|
class TestKeywordSelection:
|
|
|
|
def test_select_simple(self, testdir):
|
|
|
|
file_test = testdir.makepyfile("""
|
2010-10-26 05:08:56 +08:00
|
|
|
def test_one():
|
|
|
|
assert 0
|
2010-10-12 19:05:29 +08:00
|
|
|
class TestClass(object):
|
|
|
|
def test_method_one(self):
|
|
|
|
assert 42 == 43
|
|
|
|
""")
|
|
|
|
def check(keyword, name):
|
|
|
|
reprec = testdir.inline_run("-s", "-k", keyword, file_test)
|
|
|
|
passed, skipped, failed = reprec.listoutcomes()
|
|
|
|
assert len(failed) == 1
|
|
|
|
assert failed[0].nodeid.split("::")[-1] == name
|
|
|
|
assert len(reprec.getcalls('pytest_deselected')) == 1
|
|
|
|
|
|
|
|
for keyword in ['test_one', 'est_on']:
|
|
|
|
#yield check, keyword, 'test_one'
|
|
|
|
check(keyword, 'test_one')
|
|
|
|
check('TestClass.test', 'test_method_one')
|
|
|
|
|
|
|
|
def test_select_extra_keywords(self, testdir):
|
|
|
|
p = testdir.makepyfile(test_select="""
|
|
|
|
def test_1():
|
|
|
|
pass
|
|
|
|
class TestClass:
|
|
|
|
def test_2(self):
|
|
|
|
pass
|
|
|
|
""")
|
|
|
|
testdir.makepyfile(conftest="""
|
2010-10-14 00:41:53 +08:00
|
|
|
def pytest_pycollect_makeitem(__multicall__, name):
|
|
|
|
if name == "TestClass":
|
|
|
|
item = __multicall__.execute()
|
|
|
|
item.keywords['xxx'] = True
|
|
|
|
return item
|
2010-10-12 19:05:29 +08:00
|
|
|
""")
|
|
|
|
for keyword in ('xxx', 'xxx test_2', 'TestClass', 'xxx -test_1',
|
|
|
|
'TestClass test_2', 'xxx TestClass test_2',):
|
|
|
|
reprec = testdir.inline_run(p.dirpath(), '-s', '-k', keyword)
|
|
|
|
py.builtin.print_("keyword", repr(keyword))
|
|
|
|
passed, skipped, failed = reprec.listoutcomes()
|
|
|
|
assert len(passed) == 1
|
|
|
|
assert passed[0].nodeid.endswith("test_2")
|
|
|
|
dlist = reprec.getcalls("pytest_deselected")
|
|
|
|
assert len(dlist) == 1
|
|
|
|
assert dlist[0].items[0].name == 'test_1'
|
|
|
|
|
|
|
|
def test_select_starton(self, testdir):
|
|
|
|
threepass = testdir.makepyfile(test_threepass="""
|
|
|
|
def test_one(): assert 1
|
|
|
|
def test_two(): assert 1
|
|
|
|
def test_three(): assert 1
|
|
|
|
""")
|
|
|
|
reprec = testdir.inline_run("-k", "test_two:", threepass)
|
|
|
|
passed, skipped, failed = reprec.listoutcomes()
|
|
|
|
assert len(passed) == 2
|
|
|
|
assert not failed
|
|
|
|
dlist = reprec.getcalls("pytest_deselected")
|
|
|
|
assert len(dlist) == 1
|
|
|
|
item = dlist[0].items[0]
|
|
|
|
assert item.name == "test_one"
|
|
|
|
|
|
|
|
|
|
|
|
def test_keyword_extra(self, testdir):
|
|
|
|
p = testdir.makepyfile("""
|
|
|
|
def test_one():
|
|
|
|
assert 0
|
|
|
|
test_one.mykeyword = True
|
|
|
|
""")
|
|
|
|
reprec = testdir.inline_run("-k", "-mykeyword", p)
|
|
|
|
passed, skipped, failed = reprec.countoutcomes()
|
|
|
|
assert passed + skipped + failed == 0
|
|
|
|
reprec = testdir.inline_run("-k", "mykeyword", p)
|
|
|
|
passed, skipped, failed = reprec.countoutcomes()
|
|
|
|
assert failed == 1
|