Merge pull request #4722 from fetzerch/ignore_wildcards
Add ability to use globs when using --ignore
This commit is contained in:
		
						commit
						fc8800c71f
					
				
							
								
								
									
										1
									
								
								AUTHORS
								
								
								
								
							
							
						
						
									
										1
									
								
								AUTHORS
								
								
								
								
							|  | @ -51,6 +51,7 @@ Charles Cloud | ||||||
| Charnjit SiNGH (CCSJ) | Charnjit SiNGH (CCSJ) | ||||||
| Chris Lamb | Chris Lamb | ||||||
| Christian Boelsen | Christian Boelsen | ||||||
|  | Christian Fetzer | ||||||
| Christian Theunert | Christian Theunert | ||||||
| Christian Tismer | Christian Tismer | ||||||
| Christopher Gilling | Christopher Gilling | ||||||
|  |  | ||||||
|  | @ -0,0 +1,2 @@ | ||||||
|  | Add the ``--ignore-glob`` parameter to exclude test-modules with Unix shell-style wildcards. | ||||||
|  | Add the ``collect_ignore_glob`` for ``conftest.py`` to exclude test-modules with Unix shell-style wildcards. | ||||||
|  | @ -41,6 +41,9 @@ you will see that ``pytest`` only collects test-modules, which do not match the | ||||||
| 
 | 
 | ||||||
|     ========================= 5 passed in 0.02 seconds ========================= |     ========================= 5 passed in 0.02 seconds ========================= | ||||||
| 
 | 
 | ||||||
|  | The ``--ignore-glob`` option allows to ignore test file paths based on Unix shell-style wildcards. | ||||||
|  | If you want to exclude test-modules that end with ``_01.py``, execute ``pytest`` with ``--ignore-glob='*_01.py'``. | ||||||
|  | 
 | ||||||
| Deselect tests during test collection | Deselect tests during test collection | ||||||
| ------------------------------------- | ------------------------------------- | ||||||
| 
 | 
 | ||||||
|  | @ -266,3 +269,17 @@ file will be left out: | ||||||
|     collected 0 items |     collected 0 items | ||||||
| 
 | 
 | ||||||
|     ======================= no tests ran in 0.12 seconds ======================= |     ======================= no tests ran in 0.12 seconds ======================= | ||||||
|  | 
 | ||||||
|  | It's also possible to ignore files based on Unix shell-style wildcards by adding | ||||||
|  | patterns to ``collect_ignore_glob``. | ||||||
|  | 
 | ||||||
|  | The following example ``conftest.py`` ignores the file ``setup.py`` and in | ||||||
|  | addition all files that end with ``*_py2.py`` when executed with a Python 3 | ||||||
|  | interpreter:: | ||||||
|  | 
 | ||||||
|  |     # content of conftest.py | ||||||
|  |     import sys | ||||||
|  | 
 | ||||||
|  |     collect_ignore = ["setup.py"] | ||||||
|  |     if sys.version_info[0] > 2: | ||||||
|  |         collect_ignore_glob = ["*_py2.py"] | ||||||
|  |  | ||||||
|  | @ -797,6 +797,33 @@ Special Variables | ||||||
| pytest treats some global variables in a special manner when defined in a test module. | pytest treats some global variables in a special manner when defined in a test module. | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | collect_ignore | ||||||
|  | ~~~~~~~~~~~~~~ | ||||||
|  | 
 | ||||||
|  | **Tutorial**: :ref:`customizing-test-collection` | ||||||
|  | 
 | ||||||
|  | Can be declared in *conftest.py files* to exclude test directories or modules. | ||||||
|  | Needs to be ``list[str]``. | ||||||
|  | 
 | ||||||
|  | .. code-block:: python | ||||||
|  | 
 | ||||||
|  |   collect_ignore = ["setup.py"] | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | collect_ignore_glob | ||||||
|  | ~~~~~~~~~~~~~~~~~~~ | ||||||
|  | 
 | ||||||
|  | **Tutorial**: :ref:`customizing-test-collection` | ||||||
|  | 
 | ||||||
|  | Can be declared in *conftest.py files* to exclude test directories or modules | ||||||
|  | with Unix shell-style wildcards. Needs to be ``list[str]`` where ``str`` can | ||||||
|  | contain glob patterns. | ||||||
|  | 
 | ||||||
|  | .. code-block:: python | ||||||
|  | 
 | ||||||
|  |   collect_ignore_glob = ["*_ignore.py"] | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| pytest_plugins | pytest_plugins | ||||||
| ~~~~~~~~~~~~~~ | ~~~~~~~~~~~~~~ | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -4,6 +4,7 @@ from __future__ import division | ||||||
| from __future__ import print_function | from __future__ import print_function | ||||||
| 
 | 
 | ||||||
| import contextlib | import contextlib | ||||||
|  | import fnmatch | ||||||
| import functools | import functools | ||||||
| import os | import os | ||||||
| import pkgutil | import pkgutil | ||||||
|  | @ -117,6 +118,12 @@ def pytest_addoption(parser): | ||||||
|         metavar="path", |         metavar="path", | ||||||
|         help="ignore path during collection (multi-allowed).", |         help="ignore path during collection (multi-allowed).", | ||||||
|     ) |     ) | ||||||
|  |     group.addoption( | ||||||
|  |         "--ignore-glob", | ||||||
|  |         action="append", | ||||||
|  |         metavar="path", | ||||||
|  |         help="ignore path pattern during collection (multi-allowed).", | ||||||
|  |     ) | ||||||
|     group.addoption( |     group.addoption( | ||||||
|         "--deselect", |         "--deselect", | ||||||
|         action="append", |         action="append", | ||||||
|  | @ -296,6 +303,20 @@ def pytest_ignore_collect(path, config): | ||||||
|     if py.path.local(path) in ignore_paths: |     if py.path.local(path) in ignore_paths: | ||||||
|         return True |         return True | ||||||
| 
 | 
 | ||||||
|  |     ignore_globs = config._getconftest_pathlist( | ||||||
|  |         "collect_ignore_glob", path=path.dirpath() | ||||||
|  |     ) | ||||||
|  |     ignore_globs = ignore_globs or [] | ||||||
|  |     excludeglobopt = config.getoption("ignore_glob") | ||||||
|  |     if excludeglobopt: | ||||||
|  |         ignore_globs.extend([py.path.local(x) for x in excludeglobopt]) | ||||||
|  | 
 | ||||||
|  |     if any( | ||||||
|  |         fnmatch.fnmatch(six.text_type(path), six.text_type(glob)) | ||||||
|  |         for glob in ignore_globs | ||||||
|  |     ): | ||||||
|  |         return True | ||||||
|  | 
 | ||||||
|     allow_in_venv = config.getoption("collect_in_virtualenv") |     allow_in_venv = config.getoption("collect_in_virtualenv") | ||||||
|     if not allow_in_venv and _in_venv(path): |     if not allow_in_venv and _in_venv(path): | ||||||
|         return True |         return True | ||||||
|  |  | ||||||
|  | @ -374,6 +374,26 @@ class TestCustomConftests(object): | ||||||
|         assert result.ret == 0 |         assert result.ret == 0 | ||||||
|         assert "passed" in result.stdout.str() |         assert "passed" in result.stdout.str() | ||||||
| 
 | 
 | ||||||
|  |     def test_collectignoreglob_exclude_on_option(self, testdir): | ||||||
|  |         testdir.makeconftest( | ||||||
|  |             """ | ||||||
|  |             collect_ignore_glob = ['*w*l[dt]*'] | ||||||
|  |             def pytest_addoption(parser): | ||||||
|  |                 parser.addoption("--XX", action="store_true", default=False) | ||||||
|  |             def pytest_configure(config): | ||||||
|  |                 if config.getvalue("XX"): | ||||||
|  |                     collect_ignore_glob[:] = [] | ||||||
|  |         """ | ||||||
|  |         ) | ||||||
|  |         testdir.makepyfile(test_world="def test_hello(): pass") | ||||||
|  |         testdir.makepyfile(test_welt="def test_hallo(): pass") | ||||||
|  |         result = testdir.runpytest() | ||||||
|  |         assert result.ret == EXIT_NOTESTSCOLLECTED | ||||||
|  |         result.stdout.fnmatch_lines("*collected 0 items*") | ||||||
|  |         result = testdir.runpytest("--XX") | ||||||
|  |         assert result.ret == 0 | ||||||
|  |         result.stdout.fnmatch_lines("*2 passed*") | ||||||
|  | 
 | ||||||
|     def test_pytest_fs_collect_hooks_are_seen(self, testdir): |     def test_pytest_fs_collect_hooks_are_seen(self, testdir): | ||||||
|         testdir.makeconftest( |         testdir.makeconftest( | ||||||
|             """ |             """ | ||||||
|  |  | ||||||
|  | @ -253,6 +253,21 @@ def test_exclude(testdir): | ||||||
|     result.stdout.fnmatch_lines(["*1 passed*"]) |     result.stdout.fnmatch_lines(["*1 passed*"]) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | def test_exclude_glob(testdir): | ||||||
|  |     hellodir = testdir.mkdir("hello") | ||||||
|  |     hellodir.join("test_hello.py").write("x y syntaxerror") | ||||||
|  |     hello2dir = testdir.mkdir("hello2") | ||||||
|  |     hello2dir.join("test_hello2.py").write("x y syntaxerror") | ||||||
|  |     hello3dir = testdir.mkdir("hallo3") | ||||||
|  |     hello3dir.join("test_hello3.py").write("x y syntaxerror") | ||||||
|  |     subdir = testdir.mkdir("sub") | ||||||
|  |     subdir.join("test_hello4.py").write("x y syntaxerror") | ||||||
|  |     testdir.makepyfile(test_ok="def test_pass(): pass") | ||||||
|  |     result = testdir.runpytest("--ignore-glob=*h[ea]llo*") | ||||||
|  |     assert result.ret == 0 | ||||||
|  |     result.stdout.fnmatch_lines(["*1 passed*"]) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| def test_deselect(testdir): | def test_deselect(testdir): | ||||||
|     testdir.makepyfile( |     testdir.makepyfile( | ||||||
|         test_a=""" |         test_a=""" | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue