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
|
||||
colreports = reprec.getreports("pytest_collectreport")
|
||||
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._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:
|
||||
_argprefix = "pytest_funcarg__"
|
||||
_argname = None
|
||||
|
|
|
@ -89,8 +89,11 @@ class PyCollectorMixin(PyobjMixin, py.test.collect.Collector):
|
|||
seen[name] = True
|
||||
if name[0] != "_":
|
||||
res = self.makeitem(name, obj)
|
||||
if res is not None:
|
||||
l.append(res)
|
||||
if res is None:
|
||||
continue
|
||||
if not isinstance(res, list):
|
||||
res = [res]
|
||||
l.extend(res)
|
||||
l.sort(key=lambda item: item.reportinfo()[:2])
|
||||
return l
|
||||
|
||||
|
@ -122,9 +125,13 @@ class PyCollectorMixin(PyobjMixin, py.test.collect.Collector):
|
|||
gentesthook.pcall(plugins, metafunc=metafunc)
|
||||
if not metafunc._calls:
|
||||
return self.Function(name, parent=self)
|
||||
return funcargs.FunctionCollector(name=name,
|
||||
parent=self, calls=metafunc._calls)
|
||||
|
||||
l = []
|
||||
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):
|
||||
def _getobj(self):
|
||||
|
@ -313,6 +320,13 @@ class Function(FunctionMixin, py.test.collect.Item):
|
|||
self._obj = callobj
|
||||
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):
|
||||
return self._args is not None
|
||||
|
||||
|
|
|
@ -498,6 +498,24 @@ class TestGenfuncFunctional:
|
|||
"*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):
|
||||
sub1 = testdir.mkpydir("sub1")
|
||||
|
|
Loading…
Reference in New Issue