1
"""Machinery to make py.test interpret standard unittest.TestCase classes."""
3
from unittest import TestCase, TestResult
9
class PyTestResult(TestResult):
11
def addFailure(self, test, exc_info):
12
traceback = exc_info[2]
13
while traceback.tb_next:
14
traceback = traceback.tb_next
15
locals = traceback.tb_frame.f_locals
16
if "msg" in locals or "excClass" in locals:
17
locals["__tracebackhide__"] = True
18
msg = str(exc_info[1])
20
if "expr" in locals and "msg" in locals:
21
msg = repr(locals["expr"])
24
raise py.test.Item.Failed, py.test.Item.Failed(msg=msg), exc_info[2]
29
class PyTestCase(TestCase):
31
def __init__(self, methodName="setUp"):
32
super(PyTestCase, self).__init__(methodName)
34
class Function(py.test.Function):
36
def execute(self, target, *args):
37
__tracebackhide__ = True
39
self.__init__(target.__name__)
40
self.run(PyTestResult())
43
class PyDocTest(py.test.collect.Module):
45
def __init__(self, fspath, parent=None):
46
super(PyDocTest, self).__init__(fspath.basename, parent)
54
return self.Function(name, parent=self, obj=self.fspath)
56
class Function(py.test.Function):
58
def getpathlineno(self):
59
code = py.code.Code(self.failed)
60
return code.path, code.firstlineno
62
def failed(self, msg):
63
raise self.Failed(msg)
65
def execute(self, fspath):
66
failures, total = doctest.testfile(str(fspath),
67
module_relative=False,
68
optionflags=doctest.ELLIPSIS)
70
__tracebackhide__ = True
71
self.failed("%d doctest cases" % failures)
74
class UnitTestModule(py.test.collect.Module):
76
def buildname2items(self):
78
for name in dir(self.obj):
80
obj = getattr(self.obj, name)
83
if (obj is not TestCase and
84
issubclass(obj, (TestCase, PyTestCase))):
90
d[name] = self.Class(name, parent=self)
91
if not issubclass(testclass, PyTestCase):
94
testclass = queue.pop(0)
95
if TestCase in testclass.__bases__:
96
bases = list(testclass.__bases__)
97
bases[bases.index(TestCase)] = PyTestCase
98
testclass.__bases__ = tuple(bases)
100
queue.extend(testclass.__bases__)
104
class UnitTestDirectory(py.test.collect.Directory):
106
def __init__(self, *args, **kwargs):
107
if getattr(self.__class__, "__first_run__", True):
108
self.__class__.__first_run__ = False
109
super(UnitTestDirectory, self).__init__(*args, **kwargs)
111
def filefilter(self, path):
112
return path.check(fnmatch="*.py") and path.basename != "conftest.py"
114
def makeitem(self, basename, filefilter=None, recfilter=None):
115
path = self.fspath.join(basename)
116
if path.check(fnmatch="*.txt"):
117
return PyDocTest(path, parent=self)
118
return super(UnitTestDirectory, self).makeitem(basename,
119
filefilter, recfilter)
122
Module = UnitTestModule
123
Directory = UnitTestDirectory