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
|
||||
- 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,
|
||||
by default setup.cfg and tox.ini files are searched. The old
|
||||
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
|
||||
"""
|
||||
__version__ = '2.0.0.dev17'
|
||||
__version__ = '2.0.0.dev18'
|
||||
|
||||
__all__ = ['config', 'cmdline']
|
||||
|
||||
|
|
|
@ -383,7 +383,8 @@ class Function(FunctionMixin, pytest.collect.Item):
|
|||
config=config, collection=collection)
|
||||
self._args = args
|
||||
if self._isyieldedfunction():
|
||||
assert not callspec, "yielded functions (deprecated) cannot have funcargs"
|
||||
assert not callspec, (
|
||||
"yielded functions (deprecated) cannot have funcargs")
|
||||
else:
|
||||
if callspec is not None:
|
||||
self.funcargs = callspec.funcargs or {}
|
||||
|
|
|
@ -18,52 +18,32 @@ def pytest_pycollect_makeitem(collector, name, obj):
|
|||
return UnitTestCase(name, parent=collector)
|
||||
|
||||
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):
|
||||
loader = py.std.unittest.TestLoader()
|
||||
names = loader.getTestCaseNames(self.obj.__class__)
|
||||
l = []
|
||||
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)
|
||||
for name in loader.getTestCaseNames(self.obj):
|
||||
yield TestCaseFunction(name, parent=self)
|
||||
|
||||
def setup(self):
|
||||
instance = py.builtin._getimself(self.obj)
|
||||
instance.setUp()
|
||||
meth = getattr(self.obj, 'setUpClass', None)
|
||||
if meth is not None:
|
||||
meth()
|
||||
|
||||
def teardown(self):
|
||||
instance = py.builtin._getimself(self.obj)
|
||||
instance.tearDown()
|
||||
meth = getattr(self.obj, 'tearDownClass', None)
|
||||
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',
|
||||
description='py.test: simple powerful testing with Python',
|
||||
long_description = long_description,
|
||||
version='2.0.0.dev17',
|
||||
version='2.0.0.dev18',
|
||||
url='http://pytest.org',
|
||||
license='MIT license',
|
||||
platforms=['unix', 'linux', 'osx', 'cygwin', 'win32'],
|
||||
|
|
|
@ -81,3 +81,25 @@ def test_module_level_pytestmark(testdir):
|
|||
""")
|
||||
reprec = testdir.inline_run(testpath, "-s")
|
||||
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