Collect tests from __init__.py files if they match 'python_files'
Fix #3773
This commit is contained in:
		
							parent
							
								
									be4b359c74
								
							
						
					
					
						commit
						de6f2c0336
					
				|  | @ -0,0 +1 @@ | ||||||
|  | Fix collection of tests from ``__init__.py`` files if they match the ``python_files`` configuration option. | ||||||
|  | @ -672,7 +672,9 @@ class Testdir(object): | ||||||
|             example_path.copy(result) |             example_path.copy(result) | ||||||
|             return result |             return result | ||||||
|         else: |         else: | ||||||
|             raise LookupError("example is not found as a file or directory") |             raise LookupError( | ||||||
|  |                 'example "{}" is not found as a file or directory'.format(example_path) | ||||||
|  |             ) | ||||||
| 
 | 
 | ||||||
|     Session = Session |     Session = Session | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -201,15 +201,19 @@ def pytest_collect_file(path, parent): | ||||||
|     ext = path.ext |     ext = path.ext | ||||||
|     if ext == ".py": |     if ext == ".py": | ||||||
|         if not parent.session.isinitpath(path): |         if not parent.session.isinitpath(path): | ||||||
|             for pat in parent.config.getini("python_files") + ["__init__.py"]: |             if not path_matches_patterns( | ||||||
|                 if path.fnmatch(pat): |                 path, parent.config.getini("python_files") + ["__init__.py"] | ||||||
|                     break |             ): | ||||||
|             else: |  | ||||||
|                 return |                 return | ||||||
|         ihook = parent.session.gethookproxy(path) |         ihook = parent.session.gethookproxy(path) | ||||||
|         return ihook.pytest_pycollect_makemodule(path=path, parent=parent) |         return ihook.pytest_pycollect_makemodule(path=path, parent=parent) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | def path_matches_patterns(path, patterns): | ||||||
|  |     """Returns True if the given py.path.local matches one of the patterns in the list of globs given""" | ||||||
|  |     return any(path.fnmatch(pattern) for pattern in patterns) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| def pytest_pycollect_makemodule(path, parent): | def pytest_pycollect_makemodule(path, parent): | ||||||
|     if path.basename == "__init__.py": |     if path.basename == "__init__.py": | ||||||
|         return Package(path, parent) |         return Package(path, parent) | ||||||
|  | @ -590,6 +594,11 @@ class Package(Module): | ||||||
|                 self.session.config.pluginmanager._duplicatepaths.remove(path) |                 self.session.config.pluginmanager._duplicatepaths.remove(path) | ||||||
| 
 | 
 | ||||||
|         this_path = self.fspath.dirpath() |         this_path = self.fspath.dirpath() | ||||||
|  |         init_module = this_path.join("__init__.py") | ||||||
|  |         if init_module.check(file=1) and path_matches_patterns( | ||||||
|  |             init_module, self.config.getini("python_files") | ||||||
|  |         ): | ||||||
|  |             yield Module(init_module, self) | ||||||
|         pkg_prefixes = set() |         pkg_prefixes = set() | ||||||
|         for path in this_path.visit(rec=self._recurse, bf=True, sort=True): |         for path in this_path.visit(rec=self._recurse, bf=True, sort=True): | ||||||
|             # we will visit our own __init__.py file, in which case we skip it |             # we will visit our own __init__.py file, in which case we skip it | ||||||
|  |  | ||||||
|  | @ -0,0 +1,2 @@ | ||||||
|  | [pytest] | ||||||
|  | python_files = *.py | ||||||
|  | @ -0,0 +1,2 @@ | ||||||
|  | def test_init(): | ||||||
|  |     pass | ||||||
|  | @ -0,0 +1,2 @@ | ||||||
|  | def test_foo(): | ||||||
|  |     pass | ||||||
|  | @ -938,3 +938,17 @@ def test_fixture_scope_sibling_conftests(testdir): | ||||||
|             "*1 passed, 1 error*", |             "*1 passed, 1 error*", | ||||||
|         ] |         ] | ||||||
|     ) |     ) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def test_collect_init_tests(testdir): | ||||||
|  |     """Check that we collect files from __init__.py files when they patch the 'python_files' (#3773)""" | ||||||
|  |     p = testdir.copy_example("collect/collect_init_tests") | ||||||
|  |     result = testdir.runpytest(p, "--collect-only") | ||||||
|  |     result.stdout.fnmatch_lines( | ||||||
|  |         [ | ||||||
|  |             "*<Module '__init__.py'>", | ||||||
|  |             "*<Function 'test_init'>", | ||||||
|  |             "*<Module 'test_foo.py'>", | ||||||
|  |             "*<Function 'test_foo'>", | ||||||
|  |         ] | ||||||
|  |     ) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue