commit
						c8d2873fb2
					
				
							
								
								
									
										1
									
								
								.hgtags
								
								
								
								
							
							
						
						
									
										1
									
								
								.hgtags
								
								
								
								
							| 
						 | 
					@ -6,3 +6,4 @@
 | 
				
			||||||
8cd6eb91eba313b012d6e568f37d844dc0751f2e 1.0.0b4
 | 
					8cd6eb91eba313b012d6e568f37d844dc0751f2e 1.0.0b4
 | 
				
			||||||
8cd6eb91eba313b012d6e568f37d844dc0751f2e 1.0.0b4
 | 
					8cd6eb91eba313b012d6e568f37d844dc0751f2e 1.0.0b4
 | 
				
			||||||
0000000000000000000000000000000000000000 1.0.0b4
 | 
					0000000000000000000000000000000000000000 1.0.0b4
 | 
				
			||||||
 | 
					2cc0507f117ffe721dff7ee026648cfce00ec92f 1.0.0b6
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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 
 | 
					* remove scope-argument from request.addfinalizer() because 
 | 
				
			||||||
  request.cached_setup has the scope arg. TOOWTDI. 
 | 
					  request.cached_setup has the scope arg. TOOWTDI. 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										1
									
								
								MANIFEST
								
								
								
								
							
							
						
						
									
										1
									
								
								MANIFEST
								
								
								
								
							| 
						 | 
					@ -325,6 +325,7 @@ py/test/plugin/pytest_execnetcleanup.py
 | 
				
			||||||
py/test/plugin/pytest_figleaf.py
 | 
					py/test/plugin/pytest_figleaf.py
 | 
				
			||||||
py/test/plugin/pytest_hooklog.py
 | 
					py/test/plugin/pytest_hooklog.py
 | 
				
			||||||
py/test/plugin/pytest_iocapture.py
 | 
					py/test/plugin/pytest_iocapture.py
 | 
				
			||||||
 | 
					py/test/plugin/pytest_keyword.py
 | 
				
			||||||
py/test/plugin/pytest_monkeypatch.py
 | 
					py/test/plugin/pytest_monkeypatch.py
 | 
				
			||||||
py/test/plugin/pytest_pdb.py
 | 
					py/test/plugin/pytest_pdb.py
 | 
				
			||||||
py/test/plugin/pytest_pocoo.py
 | 
					py/test/plugin/pytest_pocoo.py
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -237,13 +237,15 @@ keyword.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
By default, all filename parts and
 | 
					By default, all filename parts and
 | 
				
			||||||
class/function names of a test function are put into the set
 | 
					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::
 | 
					kewords like this::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @py.test.mark(webtest=True)
 | 
					    @py.test.mark(webtest=True)
 | 
				
			||||||
    def test_send_http():
 | 
					    def test_send_http():
 | 
				
			||||||
        ... 
 | 
					        ... 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					and then use those keywords to select tests. 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
disabling a test class
 | 
					disabling a test class
 | 
				
			||||||
---------------------- 
 | 
					---------------------- 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -543,7 +543,7 @@ class TestPopenGateway(PopenGatewayTestSetup, BasicRemoteExecution):
 | 
				
			||||||
            ret = channel.receive()
 | 
					            ret = channel.receive()
 | 
				
			||||||
            assert ret == 42
 | 
					            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):
 | 
					    def test_waitclose_on_remote_killed(self):
 | 
				
			||||||
        gw = py.execnet.PopenGateway()
 | 
					        gw = py.execnet.PopenGateway()
 | 
				
			||||||
        channel = gw.remote_exec("""
 | 
					        channel = gw.remote_exec("""
 | 
				
			||||||
| 
						 | 
					@ -616,12 +616,12 @@ class TestSshGateway(BasicRemoteExecution):
 | 
				
			||||||
    def test_sshaddress(self):
 | 
					    def test_sshaddress(self):
 | 
				
			||||||
        assert self.gw.remoteaddress == self.sshhost
 | 
					        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):
 | 
					    def test_connexion_failes_on_non_existing_hosts(self):
 | 
				
			||||||
        py.test.raises(IOError, 
 | 
					        py.test.raises(IOError, 
 | 
				
			||||||
            "py.execnet.SshGateway('nowhere.codespeak.net')")
 | 
					            "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):
 | 
					    def test_deprecated_identity(self):
 | 
				
			||||||
        py.test.deprecated_call(
 | 
					        py.test.deprecated_call(
 | 
				
			||||||
            py.test.raises, IOError, 
 | 
					            py.test.raises, IOError, 
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10,5 +10,5 @@ Generator = py.test.collect.Generator
 | 
				
			||||||
Function = py.test.collect.Function
 | 
					Function = py.test.collect.Function
 | 
				
			||||||
Instance = py.test.collect.Instance
 | 
					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()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -367,7 +367,7 @@ class TestDSession:
 | 
				
			||||||
        assert node.gateway.spec.popen
 | 
					        assert node.gateway.spec.popen
 | 
				
			||||||
        #XXX eq.geteventargs("pytest_sessionfinish")
 | 
					        #XXX eq.geteventargs("pytest_sessionfinish")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @py.test.xfail
 | 
					    @py.test.mark.xfail
 | 
				
			||||||
    def test_collected_function_causes_remote_skip_at_module_level(self, testdir):
 | 
					    def test_collected_function_causes_remote_skip_at_module_level(self, testdir):
 | 
				
			||||||
        p = testdir.makepyfile("""
 | 
					        p = testdir.makepyfile("""
 | 
				
			||||||
            import py
 | 
					            import py
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -11,7 +11,7 @@ class pytest_funcarg__mysetup:
 | 
				
			||||||
        request.getfuncargvalue("_pytest")
 | 
					        request.getfuncargvalue("_pytest")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class TestNodeManager:
 | 
					class TestNodeManager:
 | 
				
			||||||
    @py.test.xfail
 | 
					    @py.test.mark.xfail
 | 
				
			||||||
    def test_rsync_roots_no_roots(self, mysetup):
 | 
					    def test_rsync_roots_no_roots(self, mysetup):
 | 
				
			||||||
        mysetup.source.ensure("dir1", "file1").write("hello")
 | 
					        mysetup.source.ensure("dir1", "file1").write("hello")
 | 
				
			||||||
        config = py.test.config._reparse([source])
 | 
					        config = py.test.config._reparse([source])
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -90,7 +90,7 @@ def pytest_runtest_protocol(item):
 | 
				
			||||||
pytest_runtest_protocol.firstresult = True
 | 
					pytest_runtest_protocol.firstresult = True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def pytest_runtest_makereport(item, call):
 | 
					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
 | 
					pytest_runtest_makereport.firstresult = True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def pytest_runtest_logreport(rep):
 | 
					def pytest_runtest_logreport(rep):
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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*"])
 | 
				
			||||||
| 
						 | 
					@ -3,13 +3,15 @@ mark tests as expected-to-fail and report them separately.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
example: 
 | 
					example: 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @py.test.xfail
 | 
					    @py.test.mark.xfail
 | 
				
			||||||
    def test_hello():
 | 
					    def test_hello():
 | 
				
			||||||
        ...
 | 
					        ...
 | 
				
			||||||
        assert 0
 | 
					        assert 0
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
import py
 | 
					import py
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pytest_plugins = ['keyword']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def pytest_runtest_makereport(__call__, item, call):
 | 
					def pytest_runtest_makereport(__call__, item, call):
 | 
				
			||||||
    if call.when != "call":
 | 
					    if call.when != "call":
 | 
				
			||||||
        return
 | 
					        return
 | 
				
			||||||
| 
						 | 
					@ -52,12 +54,6 @@ def pytest_terminal_summary(terminalreporter):
 | 
				
			||||||
        for event in xpassed:
 | 
					        for event in xpassed:
 | 
				
			||||||
            tr._tw.line("%s: xpassed" %(event.item,))
 | 
					            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):
 | 
					def test_xfail(testdir, linecomp):
 | 
				
			||||||
    p = testdir.makepyfile(test_one="""
 | 
					    p = testdir.makepyfile(test_one="""
 | 
				
			||||||
        import py
 | 
					        import py
 | 
				
			||||||
        @py.test.xfail
 | 
					        @py.test.mark.xfail
 | 
				
			||||||
        def test_this():
 | 
					        def test_this():
 | 
				
			||||||
            assert 0
 | 
					            assert 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        @py.test.xfail
 | 
					        @py.test.mark.xfail
 | 
				
			||||||
        def test_that():
 | 
					        def test_that():
 | 
				
			||||||
            assert 1
 | 
					            assert 1
 | 
				
			||||||
    """)
 | 
					    """)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -221,7 +221,7 @@ class TestPytestPluginInteractions:
 | 
				
			||||||
        assert not pluginmanager.listattr("hello")
 | 
					        assert not pluginmanager.listattr("hello")
 | 
				
			||||||
        assert pluginmanager.listattr("x") == [42]
 | 
					        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):
 | 
					    def test_call_setup_participants(self, testdir):
 | 
				
			||||||
        testdir.makepyfile(
 | 
					        testdir.makepyfile(
 | 
				
			||||||
            conftest="""
 | 
					            conftest="""
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue