Skip to content

add ini option to disable string escape for parametrization #2830

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions AUTHORS
Original file line number Diff line number Diff line change
Expand Up @@ -163,5 +163,6 @@ Victor Uriarte
Vidar T. Fauske
Vitaly Lashmanov
Vlad Dragos
Volodymyr Piskun
Wouter van Ackooy
Xuecong Liao
14 changes: 13 additions & 1 deletion _pytest/python.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,10 @@ def pytest_addoption(parser):
parser.addini("python_functions", type="args", default=["test",],
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("--import-mode", default="prepend",
choices=["prepend", "append"], dest="importmode",
Expand Down Expand Up @@ -888,6 +892,14 @@ def _find_parametrized_scope(argnames, arg2fixturedefs, indirect):
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 _escape_strings(val)


def _idval(val, argname, idx, idfn, config=None):
if idfn:
s = None
Expand All @@ -909,7 +921,7 @@ def _idval(val, argname, idx, idfn, config=None):
return hook_id

if isinstance(val, STRING_TYPES):
return _escape_strings(val)
return _disable_escaping(val, config)
elif isinstance(val, (float, int, bool, NoneType)):
return str(val)
elif isinstance(val, REGEX_TYPE):
Expand Down
1 change: 1 addition & 0 deletions changelog/2482.feature
Original file line number Diff line number Diff line change
@@ -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.
15 changes: 15 additions & 0 deletions doc/en/parametrize.rst
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,21 @@ them in turn::
test_expectation.py:8: AssertionError
======= 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
the simple test function. And as usual with test function arguments,
you can see the ``input`` and ``output`` values in the traceback.
Expand Down