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