merge 1.0.x branch

--HG--
branch : trunk
This commit is contained in:
holger krekel 2009-06-29 11:50:02 +01:00
commit c8d2873fb2
12 changed files with 104 additions and 19 deletions

View File

@ -6,3 +6,4 @@
8cd6eb91eba313b012d6e568f37d844dc0751f2e 1.0.0b4
8cd6eb91eba313b012d6e568f37d844dc0751f2e 1.0.0b4
0000000000000000000000000000000000000000 1.0.0b4
2cc0507f117ffe721dff7ee026648cfce00ec92f 1.0.0b6

View File

@ -1,6 +1,12 @@
Changes between 1.0.0b3 and 1.0.0
Changes between 1.0.0b3 and 1.0.0b6
=============================================
* renamed py.test.xfail back to py.test.mark.xfail to avoid
two ways to decorate for xfail
* re-added py.test.mark decorator for setting keywords on functions
(it was actually documented so removing it was not nice)
* remove scope-argument from request.addfinalizer() because
request.cached_setup has the scope arg. TOOWTDI.

View File

@ -325,6 +325,7 @@ py/test/plugin/pytest_execnetcleanup.py
py/test/plugin/pytest_figleaf.py
py/test/plugin/pytest_hooklog.py
py/test/plugin/pytest_iocapture.py
py/test/plugin/pytest_keyword.py
py/test/plugin/pytest_monkeypatch.py
py/test/plugin/pytest_pdb.py
py/test/plugin/pytest_pocoo.py

View File

@ -237,13 +237,15 @@ keyword.
By default, all filename parts and
class/function names of a test function are put into the set
of keywords for a given test. You may specify additional
of keywords for a given test. You can specify additional
kewords like this::
@py.test.mark(webtest=True)
def test_send_http():
...
and then use those keywords to select tests.
disabling a test class
----------------------

View File

@ -543,7 +543,7 @@ class TestPopenGateway(PopenGatewayTestSetup, BasicRemoteExecution):
ret = channel.receive()
assert ret == 42
@py.test.xfail # "fix needed: dying remote process does not cause waitclose() to fail"
@py.test.mark.xfail # "fix needed: dying remote process does not cause waitclose() to fail"
def test_waitclose_on_remote_killed(self):
gw = py.execnet.PopenGateway()
channel = gw.remote_exec("""
@ -616,12 +616,12 @@ class TestSshGateway(BasicRemoteExecution):
def test_sshaddress(self):
assert self.gw.remoteaddress == self.sshhost
@py.test.xfail # XXX ssh-gateway error handling
@py.test.mark.xfail # XXX ssh-gateway error handling
def test_connexion_failes_on_non_existing_hosts(self):
py.test.raises(IOError,
"py.execnet.SshGateway('nowhere.codespeak.net')")
@py.test.xfail # "XXX ssh-gateway error handling"
@py.test.mark.xfail # "XXX ssh-gateway error handling"
def test_deprecated_identity(self):
py.test.deprecated_call(
py.test.raises, IOError,

View File

@ -10,5 +10,5 @@ Generator = py.test.collect.Generator
Function = py.test.collect.Function
Instance = py.test.collect.Instance
pytest_plugins = "default runner terminal xfail tmpdir execnetcleanup monkeypatch recwarn pdb".split()
pytest_plugins = "default runner terminal keyword xfail tmpdir execnetcleanup monkeypatch recwarn pdb".split()

View File

@ -367,7 +367,7 @@ class TestDSession:
assert node.gateway.spec.popen
#XXX eq.geteventargs("pytest_sessionfinish")
@py.test.xfail
@py.test.mark.xfail
def test_collected_function_causes_remote_skip_at_module_level(self, testdir):
p = testdir.makepyfile("""
import py

View File

@ -11,7 +11,7 @@ class pytest_funcarg__mysetup:
request.getfuncargvalue("_pytest")
class TestNodeManager:
@py.test.xfail
@py.test.mark.xfail
def test_rsync_roots_no_roots(self, mysetup):
mysetup.source.ensure("dir1", "file1").write("hello")
config = py.test.config._reparse([source])

View File

@ -90,7 +90,7 @@ def pytest_runtest_protocol(item):
pytest_runtest_protocol.firstresult = True
def pytest_runtest_makereport(item, call):
""" make ItemTestReport for the specified test outcome. """
""" make ItemTestReport for the given item and call outcome. """
pytest_runtest_makereport.firstresult = True
def pytest_runtest_logreport(rep):

View File

@ -0,0 +1,79 @@
"""
py.test.mark / keyword plugin
"""
import py
def pytest_namespace(config):
mark = KeywordDecorator({})
return {'mark': mark}
class KeywordDecorator:
""" decorator for setting function attributes. """
def __init__(self, keywords, lastname=None):
self._keywords = keywords
self._lastname = lastname
def __call__(self, func=None, **kwargs):
if func is None:
kw = self._keywords.copy()
kw.update(kwargs)
return KeywordDecorator(kw)
elif not hasattr(func, 'func_dict'):
kw = self._keywords.copy()
name = self._lastname
if name is None:
name = "mark"
kw[name] = func
return KeywordDecorator(kw)
func.func_dict.update(self._keywords)
return func
def __getattr__(self, name):
if name[0] == "_":
raise AttributeError(name)
kw = self._keywords.copy()
kw[name] = True
return self.__class__(kw, lastname=name)
def test_pytest_mark_getattr():
mark = KeywordDecorator({})
def f(): pass
mark.hello(f)
assert f.hello == True
mark.hello("test")(f)
assert f.hello == "test"
py.test.raises(AttributeError, "mark._hello")
py.test.raises(AttributeError, "mark.__str__")
def test_pytest_mark_call():
mark = KeywordDecorator({})
def f(): pass
mark(x=3)(f)
assert f.x == 3
def g(): pass
mark(g)
assert not g.func_dict
mark.hello(f)
assert f.hello == True
mark.hello("test")(f)
assert f.hello == "test"
mark("x1")(f)
assert f.mark == "x1"
def test_mark_plugin(testdir):
p = testdir.makepyfile("""
import py
pytest_plugins = "keyword"
@py.test.mark.hello
def test_hello():
assert hasattr(test_hello, 'hello')
""")
result = testdir.runpytest(p)
assert result.stdout.fnmatch_lines(["*passed*"])

View File

@ -3,13 +3,15 @@ mark tests as expected-to-fail and report them separately.
example:
@py.test.xfail
@py.test.mark.xfail
def test_hello():
...
assert 0
"""
import py
pytest_plugins = ['keyword']
def pytest_runtest_makereport(__call__, item, call):
if call.when != "call":
return
@ -52,12 +54,6 @@ def pytest_terminal_summary(terminalreporter):
for event in xpassed:
tr._tw.line("%s: xpassed" %(event.item,))
def xfail_decorator(func):
func.xfail = True
return func
def pytest_namespace(config):
return dict(xfail=xfail_decorator)
# ===============================================================================
#
@ -68,11 +64,11 @@ def pytest_namespace(config):
def test_xfail(testdir, linecomp):
p = testdir.makepyfile(test_one="""
import py
@py.test.xfail
@py.test.mark.xfail
def test_this():
assert 0
@py.test.xfail
@py.test.mark.xfail
def test_that():
assert 1
""")

View File

@ -221,7 +221,7 @@ class TestPytestPluginInteractions:
assert not pluginmanager.listattr("hello")
assert pluginmanager.listattr("x") == [42]
@py.test.xfail # setup call methods
@py.test.mark.xfail # setup call methods
def test_call_setup_participants(self, testdir):
testdir.makepyfile(
conftest="""