Skip to content

Add pytest ParameterSet.id placeholder for @allure.title formatter #787

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

Merged
merged 7 commits into from
Feb 16, 2024
Merged
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
5 changes: 5 additions & 0 deletions allure-pytest/examples/display_name/display_name.rst
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,8 @@ Titles support placeholders for arguments.
... @pytest.mark.parametrize('param', [False])
... def test_display_name_template(param):
... assert param

>>> @allure.title("A test title with ParameterSet id {param_id}")
... @pytest.mark.parametrize('param', [False], ids=["some_id"])
... def test_display_name_parameter_set_id(param):
... assert param
7 changes: 6 additions & 1 deletion allure-pytest/src/listener.py
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,8 @@ def pytest_runtest_setup(self, item):
uuid = self._cache.get(item.nodeid)
test_result = self.allure_logger.get_test(uuid)
params = self.__get_pytest_params(item)
test_result.name = allure_name(item, params)
param_id = self.__get_pytest_param_id(item)
test_result.name = allure_name(item, params, param_id)
full_name = allure_full_name(item)
test_result.fullName = full_name
test_result.testCaseId = md5(full_name)
Expand Down Expand Up @@ -307,6 +308,10 @@ def add_parameter(self, name, value, excluded, mode: ParameterMode):
def __get_pytest_params(item):
return item.callspec.params if hasattr(item, 'callspec') else {}

@staticmethod
def __get_pytest_param_id(item):
return item.callspec.id if hasattr(item, 'callspec') else None

def __apply_default_suites(self, item, test_result):
default_suites = allure_suite_labels(item)
existing_suites = {
Expand Down
10 changes: 8 additions & 2 deletions allure-pytest/src/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -110,12 +110,18 @@ def allure_package(item):
return path.replace('/', '.')


def allure_name(item, parameters):
def allure_name(item, parameters, param_id=None):
name = item.name
title = allure_title(item)
param_id_kwargs = {}
if param_id:
# if param_id is an ASCII string, it could have been encoded by pytest (_pytest.compat.ascii_escaped)
if param_id.isascii():
param_id = param_id.encode().decode("unicode-escape")
param_id_kwargs["param_id"] = param_id
return SafeFormatter().format(
title,
**{**parameters, **item.funcargs}
**{**param_id_kwargs, **parameters, **item.funcargs}
) if title else name


Expand Down
88 changes: 88 additions & 0 deletions tests/allure_pytest/acceptance/display_name/display_name_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,3 +105,91 @@ def test_failed_fixture_value_in_display_name(allure_pytest_runner: AllurePytest
has_title("title with {fix}")
)
)


def test_param_id_in_display_name(allure_pytest_runner: AllurePytestRunner):
"""
>>> import allure
>>> import pytest

>>> @pytest.mark.parametrize("name", [pytest.param("value", id="some id")])
... @allure.title('Title with id - {param_id}')
... def test_param_id(name):
... pass
"""

allure_results = allure_pytest_runner.run_docstring()

assert_that(
allure_results,
has_test_case(
"test_param_id",
has_title("Title with id - some id")
)
)


def test_no_param_id_in_display_name(allure_pytest_runner: AllurePytestRunner):
"""
>>> import allure
>>> import pytest

>>> @pytest.mark.parametrize("param1, param2", [pytest.param("value1", "value2")])
... @allure.title('Title with id - {param_id}')
... def test_no_param_id(param1, param2):
... pass
"""

allure_results = allure_pytest_runner.run_docstring()

assert_that(
allure_results,
has_test_case(
"test_no_param_id",
has_title("Title with id - value1-value2")
)
)


def test_non_ascii_id_in_display_name(allure_pytest_runner: AllurePytestRunner):
"""
>>> import allure
>>> import pytest

>>> @pytest.mark.parametrize("name", [pytest.param("value", id="Ид,本我,पहचान,بطاقة تعريف")])
... @allure.title('Title with non-ASCII id - {param_id}')
... def test_non_ascii_param_id(name):
... pass
"""

allure_results = allure_pytest_runner.run_docstring()

assert_that(
allure_results,
has_test_case(
"test_non_ascii_param_id",
has_title("Title with non-ASCII id - Ид,本我,पहचान,بطاقة تعريف")
)
)


def test_explicit_parameter_called_param_id_in_display_name(allure_pytest_runner: AllurePytestRunner):
"""
>>> import allure
>>> import pytest

>>> @pytest.mark.parametrize("param_id", [pytest.param("param value", id="some id")])
... @allure.title('Title with id - {param_id}')
... def test_explicit_parameter_called_param_id(param_id):
... pass
"""

allure_results = allure_pytest_runner.run_docstring()

assert_that(
allure_results,
has_test_case(
"test_explicit_parameter_called_param_id",
has_title("Title with id - param value")
)
)