get rid of the funccollector node, which nice-ifies names of funcarg-generated tests nodes, also test and fix one anomaly wrt to funcarg setups and instance uniqueness
--HG-- branch : trunk
This commit is contained in:
parent
ee2f292efa
commit
4a568f43fe
|
@ -11,4 +11,4 @@ def test_failure_demo_fails_properly(testdir):
|
||||||
assert failed == 20, failed
|
assert failed == 20, failed
|
||||||
colreports = reprec.getreports("pytest_collectreport")
|
colreports = reprec.getreports("pytest_collectreport")
|
||||||
failed = len([x.failed for x in colreports])
|
failed = len([x.failed for x in colreports])
|
||||||
assert failed == 4
|
assert failed == 3
|
||||||
|
|
|
@ -60,31 +60,6 @@ class Metafunc:
|
||||||
self._ids.add(id)
|
self._ids.add(id)
|
||||||
self._calls.append(CallSpec(funcargs, id, param))
|
self._calls.append(CallSpec(funcargs, id, param))
|
||||||
|
|
||||||
class FunctionCollector(py.test.collect.Collector):
|
|
||||||
def __init__(self, name, parent, calls):
|
|
||||||
super(FunctionCollector, self).__init__(name, parent)
|
|
||||||
self.calls = calls
|
|
||||||
self.obj = getattr(self.parent.obj, name)
|
|
||||||
|
|
||||||
def collect(self):
|
|
||||||
l = []
|
|
||||||
for callspec in self.calls:
|
|
||||||
name = "%s[%s]" %(self.name, callspec.id)
|
|
||||||
function = self.parent.Function(name=name, parent=self,
|
|
||||||
callspec=callspec, callobj=self.obj)
|
|
||||||
l.append(function)
|
|
||||||
return l
|
|
||||||
|
|
||||||
def reportinfo(self):
|
|
||||||
try:
|
|
||||||
return self._fslineno, self.name
|
|
||||||
except AttributeError:
|
|
||||||
pass
|
|
||||||
fspath, lineno = py.code.getfslineno(self.obj)
|
|
||||||
self._fslineno = fspath, lineno
|
|
||||||
return fspath, lineno, self.name
|
|
||||||
|
|
||||||
|
|
||||||
class FuncargRequest:
|
class FuncargRequest:
|
||||||
_argprefix = "pytest_funcarg__"
|
_argprefix = "pytest_funcarg__"
|
||||||
_argname = None
|
_argname = None
|
||||||
|
|
|
@ -89,8 +89,11 @@ class PyCollectorMixin(PyobjMixin, py.test.collect.Collector):
|
||||||
seen[name] = True
|
seen[name] = True
|
||||||
if name[0] != "_":
|
if name[0] != "_":
|
||||||
res = self.makeitem(name, obj)
|
res = self.makeitem(name, obj)
|
||||||
if res is not None:
|
if res is None:
|
||||||
l.append(res)
|
continue
|
||||||
|
if not isinstance(res, list):
|
||||||
|
res = [res]
|
||||||
|
l.extend(res)
|
||||||
l.sort(key=lambda item: item.reportinfo()[:2])
|
l.sort(key=lambda item: item.reportinfo()[:2])
|
||||||
return l
|
return l
|
||||||
|
|
||||||
|
@ -122,9 +125,13 @@ class PyCollectorMixin(PyobjMixin, py.test.collect.Collector):
|
||||||
gentesthook.pcall(plugins, metafunc=metafunc)
|
gentesthook.pcall(plugins, metafunc=metafunc)
|
||||||
if not metafunc._calls:
|
if not metafunc._calls:
|
||||||
return self.Function(name, parent=self)
|
return self.Function(name, parent=self)
|
||||||
return funcargs.FunctionCollector(name=name,
|
l = []
|
||||||
parent=self, calls=metafunc._calls)
|
for callspec in metafunc._calls:
|
||||||
|
subname = "%s[%s]" %(name, callspec.id)
|
||||||
|
function = self.Function(name=subname, parent=self,
|
||||||
|
callspec=callspec, callobj=funcobj)
|
||||||
|
l.append(function)
|
||||||
|
return l
|
||||||
|
|
||||||
class Module(py.test.collect.File, PyCollectorMixin):
|
class Module(py.test.collect.File, PyCollectorMixin):
|
||||||
def _getobj(self):
|
def _getobj(self):
|
||||||
|
@ -313,6 +320,13 @@ class Function(FunctionMixin, py.test.collect.Item):
|
||||||
self._obj = callobj
|
self._obj = callobj
|
||||||
self.function = getattr(self.obj, 'im_func', self.obj)
|
self.function = getattr(self.obj, 'im_func', self.obj)
|
||||||
|
|
||||||
|
def _getobj(self):
|
||||||
|
name = self.name
|
||||||
|
i = name.find("[") # parametrization
|
||||||
|
if i != -1:
|
||||||
|
name = name[:i]
|
||||||
|
return getattr(self.parent.obj, name)
|
||||||
|
|
||||||
def _isyieldedfunction(self):
|
def _isyieldedfunction(self):
|
||||||
return self._args is not None
|
return self._args is not None
|
||||||
|
|
||||||
|
|
|
@ -498,6 +498,24 @@ class TestGenfuncFunctional:
|
||||||
"*1 passed*"
|
"*1 passed*"
|
||||||
])
|
])
|
||||||
|
|
||||||
|
def test_two_functions_not_same_instance(self, testdir):
|
||||||
|
p = testdir.makepyfile("""
|
||||||
|
def pytest_generate_tests(metafunc):
|
||||||
|
metafunc.addcall({'arg1': 10})
|
||||||
|
metafunc.addcall({'arg1': 20})
|
||||||
|
|
||||||
|
class TestClass:
|
||||||
|
def test_func(self, arg1):
|
||||||
|
assert not hasattr(self, 'x')
|
||||||
|
self.x = 1
|
||||||
|
""")
|
||||||
|
result = testdir.runpytest("-v", p)
|
||||||
|
assert result.stdout.fnmatch_lines([
|
||||||
|
"*test_func*0*PASS*",
|
||||||
|
"*test_func*1*PASS*",
|
||||||
|
"*2 pass*",
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
def test_conftest_funcargs_only_available_in_subdir(testdir):
|
def test_conftest_funcargs_only_available_in_subdir(testdir):
|
||||||
sub1 = testdir.mkpydir("sub1")
|
sub1 = testdir.mkpydir("sub1")
|
||||||
|
|
Loading…
Reference in New Issue