extend and refine test marking
- allow to mark tests via a "pytestmark" name at class/module level. - make combined positional args of marker calls available via an _args argument --HG-- branch : trunk
This commit is contained in:
@@ -1,30 +1,105 @@
|
||||
import py
|
||||
from _py.test.plugin.pytest_keyword import Mark
|
||||
|
||||
def test_pytest_mark_api():
|
||||
mark = Mark()
|
||||
py.test.raises(TypeError, "mark(x=3)")
|
||||
class TestMark:
|
||||
def test_pytest_mark_notcallable(self):
|
||||
mark = Mark()
|
||||
py.test.raises(TypeError, "mark()")
|
||||
|
||||
def f(): pass
|
||||
mark.hello(f)
|
||||
assert f.hello
|
||||
def test_pytest_mark_bare(self):
|
||||
mark = Mark()
|
||||
def f(): pass
|
||||
mark.hello(f)
|
||||
assert f.hello
|
||||
|
||||
mark.world(x=3, y=4)(f)
|
||||
assert f.world
|
||||
assert f.world.x == 3
|
||||
assert f.world.y == 4
|
||||
def test_pytest_mark_keywords(self):
|
||||
mark = Mark()
|
||||
def f(): pass
|
||||
mark.world(x=3, y=4)(f)
|
||||
assert f.world
|
||||
assert f.world.x == 3
|
||||
assert f.world.y == 4
|
||||
|
||||
mark.world("hello")(f)
|
||||
assert f.world._0 == "hello"
|
||||
def test_apply_multiple_and_merge(self):
|
||||
mark = Mark()
|
||||
def f(): pass
|
||||
marker = mark.world
|
||||
mark.world(x=3)(f)
|
||||
assert f.world.x == 3
|
||||
mark.world(y=4)(f)
|
||||
assert f.world.x == 3
|
||||
assert f.world.y == 4
|
||||
mark.world(y=1)(f)
|
||||
assert f.world.y == 1
|
||||
assert len(f.world._args) == 0
|
||||
|
||||
py.test.raises(TypeError, "mark.some(x=3)(f=5)")
|
||||
def test_pytest_mark_positional(self):
|
||||
mark = Mark()
|
||||
def f(): pass
|
||||
mark.world("hello")(f)
|
||||
assert f.world._args[0] == "hello"
|
||||
mark.world("world")(f)
|
||||
|
||||
def test_mark_plugin(testdir):
|
||||
p = testdir.makepyfile("""
|
||||
import py
|
||||
@py.test.mark.hello
|
||||
def test_hello():
|
||||
assert hasattr(test_hello, 'hello')
|
||||
""")
|
||||
result = testdir.runpytest(p)
|
||||
assert result.stdout.fnmatch_lines(["*passed*"])
|
||||
class TestFunctional:
|
||||
def test_mark_per_function(self, testdir):
|
||||
p = testdir.makepyfile("""
|
||||
import py
|
||||
@py.test.mark.hello
|
||||
def test_hello():
|
||||
assert hasattr(test_hello, 'hello')
|
||||
""")
|
||||
result = testdir.runpytest(p)
|
||||
assert result.stdout.fnmatch_lines(["*passed*"])
|
||||
|
||||
def test_mark_per_module(self, testdir):
|
||||
item = testdir.getitem("""
|
||||
import py
|
||||
pytestmark = py.test.mark.hello
|
||||
def test_func():
|
||||
pass
|
||||
""")
|
||||
keywords = item.readkeywords()
|
||||
assert 'hello' in keywords
|
||||
|
||||
def test_mark_per_class(self, testdir):
|
||||
modcol = testdir.getmodulecol("""
|
||||
import py
|
||||
class TestClass:
|
||||
pytestmark = py.test.mark.hello
|
||||
def test_func(self):
|
||||
assert TestClass.test_func.hello
|
||||
""")
|
||||
clscol = modcol.collect()[0]
|
||||
item = clscol.collect()[0].collect()[0]
|
||||
keywords = item.readkeywords()
|
||||
assert 'hello' in keywords
|
||||
|
||||
def test_merging_markers(self, testdir):
|
||||
p = testdir.makepyfile("""
|
||||
import py
|
||||
pytestmark = py.test.mark.hello("pos1", x=1, y=2)
|
||||
class TestClass:
|
||||
# classlevel overrides module level
|
||||
pytestmark = py.test.mark.hello(x=3)
|
||||
@py.test.mark.hello("pos0", z=4)
|
||||
def test_func(self):
|
||||
pass
|
||||
""")
|
||||
items, rec = testdir.inline_genitems(p)
|
||||
item, = items
|
||||
keywords = item.readkeywords()
|
||||
marker = keywords['hello']
|
||||
assert marker._args == ["pos0", "pos1"]
|
||||
assert marker.x == 3
|
||||
assert marker.y == 2
|
||||
assert marker.z == 4
|
||||
|
||||
def test_mark_other(self, testdir):
|
||||
item = testdir.getitem("""
|
||||
import py
|
||||
class pytestmark:
|
||||
pass
|
||||
def test_func():
|
||||
pass
|
||||
""")
|
||||
keywords = item.readkeywords()
|
||||
|
||||
Reference in New Issue
Block a user