majorly changing the unittest compatibility code, calling TestCase(name)(result)
This commit is contained in:
		
							parent
							
								
									53d1cfc3a1
								
							
						
					
					
						commit
						7d495cc250
					
				| 
						 | 
					@ -2,6 +2,8 @@ Changes between 1.3.4 and 2.0.0dev0
 | 
				
			||||||
----------------------------------------------
 | 
					----------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- pytest-2.0 is now its own package and depends on pylib-2.0
 | 
					- pytest-2.0 is now its own package and depends on pylib-2.0
 | 
				
			||||||
 | 
					- try harder to run unittest test suites in a more compatible manner
 | 
				
			||||||
 | 
					  by deferring setup/teardown semantics to the unittest package. 
 | 
				
			||||||
- introduce a new way to set config options via ini-style files,
 | 
					- introduce a new way to set config options via ini-style files,
 | 
				
			||||||
  by default setup.cfg and tox.ini files are searched.  The old
 | 
					  by default setup.cfg and tox.ini files are searched.  The old
 | 
				
			||||||
  ways (certain environment variables, dynamic conftest.py reading 
 | 
					  ways (certain environment variables, dynamic conftest.py reading 
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,7 +5,7 @@ see http://pytest.org for documentation and details
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(c) Holger Krekel and others, 2004-2010
 | 
					(c) Holger Krekel and others, 2004-2010
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
__version__ = '2.0.0.dev17'
 | 
					__version__ = '2.0.0.dev18'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
__all__ = ['config', 'cmdline']
 | 
					__all__ = ['config', 'cmdline']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -383,7 +383,8 @@ class Function(FunctionMixin, pytest.collect.Item):
 | 
				
			||||||
            config=config, collection=collection)
 | 
					            config=config, collection=collection)
 | 
				
			||||||
        self._args = args
 | 
					        self._args = args
 | 
				
			||||||
        if self._isyieldedfunction():
 | 
					        if self._isyieldedfunction():
 | 
				
			||||||
            assert not callspec, "yielded functions (deprecated) cannot have funcargs"
 | 
					            assert not callspec, (
 | 
				
			||||||
 | 
					                "yielded functions (deprecated) cannot have funcargs")
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            if callspec is not None:
 | 
					            if callspec is not None:
 | 
				
			||||||
                self.funcargs = callspec.funcargs or {}
 | 
					                self.funcargs = callspec.funcargs or {}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,52 +18,32 @@ def pytest_pycollect_makeitem(collector, name, obj):
 | 
				
			||||||
            return UnitTestCase(name, parent=collector)
 | 
					            return UnitTestCase(name, parent=collector)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class UnitTestCase(py.test.collect.Class):
 | 
					class UnitTestCase(py.test.collect.Class):
 | 
				
			||||||
    def collect(self):
 | 
					 | 
				
			||||||
        return [UnitTestCaseInstance("()", self)]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def setup(self):
 | 
					 | 
				
			||||||
        pass
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def teardown(self):
 | 
					 | 
				
			||||||
        pass
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
_dummy = object()
 | 
					 | 
				
			||||||
class UnitTestCaseInstance(py.test.collect.Instance):
 | 
					 | 
				
			||||||
    def collect(self):
 | 
					    def collect(self):
 | 
				
			||||||
        loader = py.std.unittest.TestLoader()
 | 
					        loader = py.std.unittest.TestLoader()
 | 
				
			||||||
        names = loader.getTestCaseNames(self.obj.__class__)
 | 
					        for name in loader.getTestCaseNames(self.obj):
 | 
				
			||||||
        l = []
 | 
					            yield TestCaseFunction(name, parent=self)
 | 
				
			||||||
        for name in names:
 | 
					 | 
				
			||||||
            callobj = getattr(self.obj, name)
 | 
					 | 
				
			||||||
            if py.builtin.callable(callobj):
 | 
					 | 
				
			||||||
                l.append(UnitTestFunction(name, parent=self))
 | 
					 | 
				
			||||||
        return l
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def _getobj(self):
 | 
					 | 
				
			||||||
        x = self.parent.obj
 | 
					 | 
				
			||||||
        return self.parent.obj(methodName='run')
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class UnitTestFunction(py.test.collect.Function):
 | 
					 | 
				
			||||||
    def __init__(self, name, parent, args=(), obj=_dummy, sort_value=None):
 | 
					 | 
				
			||||||
        super(UnitTestFunction, self).__init__(name, parent)
 | 
					 | 
				
			||||||
        self._args = args
 | 
					 | 
				
			||||||
        if obj is not _dummy:
 | 
					 | 
				
			||||||
            self._obj = obj
 | 
					 | 
				
			||||||
        self._sort_value = sort_value
 | 
					 | 
				
			||||||
        if hasattr(self.parent, 'newinstance'):
 | 
					 | 
				
			||||||
            self.parent.newinstance()
 | 
					 | 
				
			||||||
            self.obj = self._getobj()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def runtest(self):
 | 
					 | 
				
			||||||
        target = self.obj
 | 
					 | 
				
			||||||
        args = self._args
 | 
					 | 
				
			||||||
        target(*args)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def setup(self):
 | 
					    def setup(self):
 | 
				
			||||||
        instance = py.builtin._getimself(self.obj)
 | 
					        meth = getattr(self.obj, 'setUpClass', None)
 | 
				
			||||||
        instance.setUp()
 | 
					        if meth is not None:
 | 
				
			||||||
 | 
					            meth()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def teardown(self):
 | 
					    def teardown(self):
 | 
				
			||||||
        instance = py.builtin._getimself(self.obj)
 | 
					        meth = getattr(self.obj, 'tearDownClass', None)
 | 
				
			||||||
        instance.tearDown()
 | 
					        if meth is not None:
 | 
				
			||||||
 | 
					            meth()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class TestCaseFunction(py.test.collect.Function):
 | 
				
			||||||
 | 
					    def startTest(self, testcase):
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					    def addError(self, testcase, rawexcinfo):
 | 
				
			||||||
 | 
					        py.builtin._reraise(*rawexcinfo)
 | 
				
			||||||
 | 
					    def addFailure(self, testcase, rawexcinfo):
 | 
				
			||||||
 | 
					        py.builtin._reraise(*rawexcinfo)
 | 
				
			||||||
 | 
					    def addSuccess(self, testcase):
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					    def stopTest(self, testcase):
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					    def runtest(self):
 | 
				
			||||||
 | 
					        testcase = self.parent.obj(self.name)
 | 
				
			||||||
 | 
					        testcase(result=self)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										2
									
								
								setup.py
								
								
								
								
							
							
						
						
									
										2
									
								
								setup.py
								
								
								
								
							| 
						 | 
					@ -22,7 +22,7 @@ def main():
 | 
				
			||||||
        name='pytest',
 | 
					        name='pytest',
 | 
				
			||||||
        description='py.test: simple powerful testing with Python',
 | 
					        description='py.test: simple powerful testing with Python',
 | 
				
			||||||
        long_description = long_description,
 | 
					        long_description = long_description,
 | 
				
			||||||
        version='2.0.0.dev17',
 | 
					        version='2.0.0.dev18',
 | 
				
			||||||
        url='http://pytest.org',
 | 
					        url='http://pytest.org',
 | 
				
			||||||
        license='MIT license',
 | 
					        license='MIT license',
 | 
				
			||||||
        platforms=['unix', 'linux', 'osx', 'cygwin', 'win32'],
 | 
					        platforms=['unix', 'linux', 'osx', 'cygwin', 'win32'],
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -81,3 +81,25 @@ def test_module_level_pytestmark(testdir):
 | 
				
			||||||
    """)
 | 
					    """)
 | 
				
			||||||
    reprec = testdir.inline_run(testpath, "-s")
 | 
					    reprec = testdir.inline_run(testpath, "-s")
 | 
				
			||||||
    reprec.assertoutcome(skipped=1)
 | 
					    reprec.assertoutcome(skipped=1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def test_class_setup(testdir):
 | 
				
			||||||
 | 
					    testpath = testdir.makepyfile("""
 | 
				
			||||||
 | 
					        import unittest
 | 
				
			||||||
 | 
					        import py
 | 
				
			||||||
 | 
					        class MyTestCase(unittest.TestCase):
 | 
				
			||||||
 | 
					            x = 0
 | 
				
			||||||
 | 
					            @classmethod
 | 
				
			||||||
 | 
					            def setUpClass(cls):
 | 
				
			||||||
 | 
					                cls.x += 1
 | 
				
			||||||
 | 
					            def test_func1(self):
 | 
				
			||||||
 | 
					                assert self.x == 1
 | 
				
			||||||
 | 
					            def test_func2(self):
 | 
				
			||||||
 | 
					                assert self.x == 1
 | 
				
			||||||
 | 
					            @classmethod
 | 
				
			||||||
 | 
					            def tearDownClass(cls):
 | 
				
			||||||
 | 
					                cls.x -= 1
 | 
				
			||||||
 | 
					        def test_teareddown():
 | 
				
			||||||
 | 
					            assert MyTestCase.x == 0
 | 
				
			||||||
 | 
					    """)
 | 
				
			||||||
 | 
					    reprec = testdir.inline_run(testpath)
 | 
				
			||||||
 | 
					    reprec.assertoutcome(passed=3)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue