add --override-ini option to overrides ini values
Signed-off-by: Ted Xiao <xiao.xj@gmail.com>
This commit is contained in:
		
							parent
							
								
									13a188fe37
								
							
						
					
					
						commit
						856e6cab75
					
				
							
								
								
									
										1
									
								
								AUTHORS
								
								
								
								
							
							
						
						
									
										1
									
								
								AUTHORS
								
								
								
								
							|  | @ -100,6 +100,7 @@ Samuele Pedroni | ||||||
| Steffen Allner | Steffen Allner | ||||||
| Stephan Obermann | Stephan Obermann | ||||||
| Tareq Alayan | Tareq Alayan | ||||||
|  | Ted Xiao | ||||||
| Simon Gomizelj | Simon Gomizelj | ||||||
| Stefano Taschini | Stefano Taschini | ||||||
| Stefan Farmbauer | Stefan Farmbauer | ||||||
|  |  | ||||||
|  | @ -79,6 +79,10 @@ | ||||||
|   finalizer and has access to the fixture's result cache. |   finalizer and has access to the fixture's result cache. | ||||||
|   Thanks `@d6e`_, `@sallner`_ |   Thanks `@d6e`_, `@sallner`_ | ||||||
| 
 | 
 | ||||||
|  | * New cli flag ``--override-ini`` or ``-o`` that overrides values from the ini file. | ||||||
|  |   Example '-o xfail_strict=True'. A complete ini-options can be viewed | ||||||
|  |   by py.test --help. Thanks `@blueyed`_ and `@fengxx`_ for the PR | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| **Changes** | **Changes** | ||||||
| 
 | 
 | ||||||
|  | @ -155,6 +159,8 @@ | ||||||
| .. _@nikratio: https://github.com/nikratio | .. _@nikratio: https://github.com/nikratio | ||||||
| .. _@RedBeardCode: https://github.com/RedBeardCode | .. _@RedBeardCode: https://github.com/RedBeardCode | ||||||
| .. _@Vogtinator: https://github.com/Vogtinator | .. _@Vogtinator: https://github.com/Vogtinator | ||||||
|  | .. _@blueyed: https://github.com/blueyed | ||||||
|  | .. _@fengxx: https://github.com/fengxx | ||||||
| 
 | 
 | ||||||
| * Fix `#1421`_: Exit tests if a collection error occurs and add | * Fix `#1421`_: Exit tests if a collection error occurs and add | ||||||
|   ``--continue-on-collection-errors`` option to restore previous behaviour. |   ``--continue-on-collection-errors`` option to restore previous behaviour. | ||||||
|  |  | ||||||
|  | @ -1003,6 +1003,8 @@ class Config(object): | ||||||
|             description, type, default = self._parser._inidict[name] |             description, type, default = self._parser._inidict[name] | ||||||
|         except KeyError: |         except KeyError: | ||||||
|             raise ValueError("unknown configuration value: %r" %(name,)) |             raise ValueError("unknown configuration value: %r" %(name,)) | ||||||
|  |         value = self._get_override_ini_value(name) | ||||||
|  |         if value is None: | ||||||
|             try: |             try: | ||||||
|                 value = self.inicfg[name] |                 value = self.inicfg[name] | ||||||
|             except KeyError: |             except KeyError: | ||||||
|  | @ -1041,6 +1043,20 @@ class Config(object): | ||||||
|             l.append(relroot) |             l.append(relroot) | ||||||
|         return l |         return l | ||||||
| 
 | 
 | ||||||
|  |     def _get_override_ini_value(self, name): | ||||||
|  |         value = None | ||||||
|  |         # override_ini is a list of list, to support both -o foo1=bar1 foo2=bar2 and | ||||||
|  |         # and -o foo1=bar1 -o foo2=bar2 options | ||||||
|  |         # always use the last item if multiple value set for same ini-name, | ||||||
|  |         # e.g. -o foo=bar1 -o foo=bar2 will set foo to bar2 | ||||||
|  |         if self.getoption("override_ini", None): | ||||||
|  |             for ini_config_list in self.option.override_ini: | ||||||
|  |                 for ini_config in ini_config_list: | ||||||
|  |                     (key, user_ini_value) = ini_config.split("=", 1) | ||||||
|  |                     if key == name: | ||||||
|  |                         value = user_ini_value | ||||||
|  |         return value | ||||||
|  | 
 | ||||||
|     def getoption(self, name, default=notset, skip=False): |     def getoption(self, name, default=notset, skip=False): | ||||||
|         """ return command line option value. |         """ return command line option value. | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -20,6 +20,10 @@ def pytest_addoption(parser): | ||||||
|     group.addoption('--debug', |     group.addoption('--debug', | ||||||
|                action="store_true", dest="debug", default=False, |                action="store_true", dest="debug", default=False, | ||||||
|                help="store internal tracing debug information in 'pytestdebug.log'.") |                help="store internal tracing debug information in 'pytestdebug.log'.") | ||||||
|  |     # support for "--overwrite-ini ININAME=INIVALUE" to override values from the ini file | ||||||
|  |     # Example '-o xfail_strict=True'. | ||||||
|  |     group._addoption('-o', '--override-ini', nargs='*', dest="override_ini", action="append", | ||||||
|  |                help="overrides ini values which do not have a separate command-line flag") | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @pytest.hookimpl(hookwrapper=True) | @pytest.hookimpl(hookwrapper=True) | ||||||
|  |  | ||||||
|  | @ -583,3 +583,92 @@ class TestRootdir: | ||||||
|         inifile = tmpdir.ensure("pytest.ini") |         inifile = tmpdir.ensure("pytest.ini") | ||||||
|         rootdir, inifile, inicfg = determine_setup(inifile, [tmpdir]) |         rootdir, inifile, inicfg = determine_setup(inifile, [tmpdir]) | ||||||
|         assert rootdir == tmpdir |         assert rootdir == tmpdir | ||||||
|  | 
 | ||||||
|  | class TestOverrideIniArgs: | ||||||
|  |     """ test --override-ini """ | ||||||
|  |     @pytest.mark.parametrize("name", "setup.cfg tox.ini pytest.ini".split()) | ||||||
|  |     def test_override_ini_names(self, testdir, name): | ||||||
|  |         testdir.tmpdir.join(name).write(py.std.textwrap.dedent(""" | ||||||
|  |             [pytest] | ||||||
|  |             custom = 1.0 | ||||||
|  |         """)) | ||||||
|  |         testdir.makeconftest(""" | ||||||
|  |             def pytest_addoption(parser): | ||||||
|  |                 parser.addini("custom", "") | ||||||
|  |         """) | ||||||
|  |         testdir.makepyfile(""" | ||||||
|  |             def test_pass(pytestconfig): | ||||||
|  |                 ini_val = pytestconfig.getini("custom") | ||||||
|  |                 print('\\ncustom_option:%s\\n' % ini_val) | ||||||
|  |         """) | ||||||
|  | 
 | ||||||
|  |         result = testdir.runpytest("--override-ini", "custom=2.0", "-s") | ||||||
|  |         assert result.ret == 0 | ||||||
|  |         result.stdout.fnmatch_lines([ | ||||||
|  |             "custom_option:2.0" | ||||||
|  |         ]) | ||||||
|  | 
 | ||||||
|  |         result = testdir.runpytest("--override-ini", "custom=2.0", | ||||||
|  |                                    "--override-ini=custom=3.0", "-s") | ||||||
|  |         assert result.ret == 0 | ||||||
|  |         result.stdout.fnmatch_lines([ | ||||||
|  |             "custom_option:3.0" | ||||||
|  |         ]) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     def test_override_ini_pathlist(self, testdir): | ||||||
|  |         testdir.makeconftest(""" | ||||||
|  |                 def pytest_addoption(parser): | ||||||
|  |                     parser.addini("paths", "my new ini value", type="pathlist") | ||||||
|  |         """) | ||||||
|  |         testdir.makeini(""" | ||||||
|  |                 [pytest] | ||||||
|  |                 paths=blah.py | ||||||
|  |         """) | ||||||
|  |         testdir.makepyfile(""" | ||||||
|  |                 import py.path | ||||||
|  |                 def test_pathlist(pytestconfig): | ||||||
|  |                     config_paths = pytestconfig.getini("paths") | ||||||
|  |                     print(config_paths) | ||||||
|  |                     for cpf in config_paths: | ||||||
|  |                         print('\\nuser_path:%s' % cpf.basename) | ||||||
|  |         """) | ||||||
|  |         result = testdir.runpytest("--override-ini", 'paths=foo/bar1.py foo/bar2.py', "-s") | ||||||
|  |         result.stdout.fnmatch_lines([ | ||||||
|  |             "user_path:bar1.py", | ||||||
|  |             "user_path:bar2.py" | ||||||
|  |         ]) | ||||||
|  | 
 | ||||||
|  |     def test_override_multiple_and_default(self, testdir): | ||||||
|  |         testdir.makeconftest(""" | ||||||
|  |                 def pytest_addoption(parser): | ||||||
|  |                     parser.addini("custom_option_1", "", default="o1") | ||||||
|  |                     parser.addini("custom_option_2", "", default="o2") | ||||||
|  |                     parser.addini("custom_option_3", "", default=False, type="bool") | ||||||
|  |                     parser.addini("custom_option_4", "", default=True, type="bool") | ||||||
|  | 
 | ||||||
|  |         """) | ||||||
|  |         testdir.makeini(""" | ||||||
|  |                 [pytest] | ||||||
|  |                 custom_option_1=custom_option_1 | ||||||
|  |                 custom_option_2=custom_option_2 | ||||||
|  |         """) | ||||||
|  |         testdir.makepyfile(""" | ||||||
|  |                 def test_multiple_options(pytestconfig): | ||||||
|  |                     prefix="custom_option" | ||||||
|  |                     for x in range(1,5): | ||||||
|  |                         ini_value=pytestconfig.getini("%s_%d" % (prefix, x)) | ||||||
|  |                         print('\\nini%d:%s' % (x, ini_value)) | ||||||
|  |         """) | ||||||
|  |         result = testdir.runpytest("--override-ini", | ||||||
|  |                                    'custom_option_1=fulldir=/tmp/user1', | ||||||
|  |                                    'custom_option_2=url=/tmp/user2?a=b&d=e', | ||||||
|  |                                    "-o", 'custom_option_3=True', | ||||||
|  |                                    "-o", 'custom_option_4=no', | ||||||
|  |                                    "-s") | ||||||
|  |         result.stdout.fnmatch_lines([ | ||||||
|  |             "ini1:fulldir=/tmp/user1", | ||||||
|  |             "ini2:url=/tmp/user2?a=b&d=e", | ||||||
|  |             "ini3:True", | ||||||
|  |             "ini4:False" | ||||||
|  |         ]) | ||||||
		Loading…
	
		Reference in New Issue