add ini option to disable string escape for parametrization

This commit is contained in:
ApaDoctor 2017-10-11 18:11:50 +02:00 committed by Jeong YunWon
parent 69a55d334a
commit cf6e2ceafd
4 changed files with 35 additions and 1 deletions

View File

@ -242,6 +242,7 @@ Vidar T. Fauske
Virgil Dupras Virgil Dupras
Vitaly Lashmanov Vitaly Lashmanov
Vlad Dragos Vlad Dragos
Volodymyr Piskun
Wil Cooley Wil Cooley
William Lee William Lee
Wim Glenn Wim Glenn

1
changelog/2482.feature Normal file
View File

@ -0,0 +1 @@
Include new ``disable_test_id_escaping_and_forfeit_all_rights_to_community_support`` option to disable ascii-escaping in parametrized values. This may cause a series of problems and as the name makes clear, use at your own risk.

View File

@ -81,6 +81,21 @@ them in turn:
test_expectation.py:8: AssertionError test_expectation.py:8: AssertionError
==================== 1 failed, 2 passed in 0.12 seconds ==================== ==================== 1 failed, 2 passed in 0.12 seconds ====================
.. note::
pytest by default escapes any non-ascii characters used in unicode strings
for the parametrization because it has several downsides.
If however you would like to use unicode strings in parametrization, use this option in your ``pytest.ini``:
.. code-block:: ini
[pytest]
disable_test_id_escaping_and_forfeit_all_rights_to_community_support = True
to disable this behavior, but keep in mind that this might cause unwanted side effects and
even bugs depending on the OS used and plugins currently installed, so use it at your own risk.
As designed in this example, only one pair of input/output values fails As designed in this example, only one pair of input/output values fails
the simple test function. And as usual with test function arguments, the simple test function. And as usual with test function arguments,
you can see the ``input`` and ``output`` values in the traceback. you can see the ``input`` and ``output`` values in the traceback.

View File

@ -102,6 +102,13 @@ def pytest_addoption(parser):
default=["test"], default=["test"],
help="prefixes or glob names for Python test function and method discovery", help="prefixes or glob names for Python test function and method discovery",
) )
parser.addini(
"disable_test_id_escaping_and_forfeit_all_rights_to_community_support",
type="bool",
default=False,
help="disable string escape non-ascii characters, might cause unwanted "
"side effects(use at your own risk)",
)
group.addoption( group.addoption(
"--import-mode", "--import-mode",
@ -1156,6 +1163,16 @@ def _find_parametrized_scope(argnames, arg2fixturedefs, indirect):
return "function" return "function"
def _disable_escaping(val, config=None):
if config is None:
escape_option = False
else:
escape_option = config.getini(
"disable_test_id_escaping_and_forfeit_all_rights_to_community_support"
)
return val if escape_option else ascii_escaped(val)
def _idval(val, argname, idx, idfn, item, config): def _idval(val, argname, idx, idfn, item, config):
if idfn: if idfn:
try: try:
@ -1177,7 +1194,7 @@ def _idval(val, argname, idx, idfn, item, config):
return hook_id return hook_id
if isinstance(val, STRING_TYPES): if isinstance(val, STRING_TYPES):
return ascii_escaped(val) return _disable_escaping(val)
elif isinstance(val, (float, int, bool, NoneType)): elif isinstance(val, (float, int, bool, NoneType)):
return str(val) return str(val)
elif isinstance(val, REGEX_TYPE): elif isinstance(val, REGEX_TYPE):