allure-framework / allure-framework/allure-python

Attribute error in @allure.title when using @pytest.fixture(params=[...]

Open
#873 0 comments 0 reactions 0 assignees View on GitHub
theme:pytest
Dominant language
Python
Stars
814
Forks
260
PR merge metrics
No merged PRs in 30d

Description

@allure.title decorator doesn't correctly formats a title string when using a parametrized fixture and having that fixture skip a test or raise an error:

```
import pytest
import allure

class TestClass:
@pytest.fixture(params=[1, 2]) # <-- causes AttributeError: 'int' object has no attribute 'one'
# @pytest.fixture()
def params(self):
# will cause AttributeError in allure.title
# if this fixture is skipping tests
pytest.skip('skip')

# or raising an error
raise ValueError('aa')

class _Params:
"""some params every test needs"""
one = 1
two = 2

# but no error if it returns a value
return _Params()

@allure.title('should display "1" {params.one}')
def test_func(self, params): # <-- causes AttributeError: 'int' object has no attribute 'one'
assert params.one == 1
```
```
self = , field_name = 'params.one', args = (), kwargs = {'param_id': '2', 'params': 2}

def get_field(self, field_name, args, kwargs):
first, rest = _string.formatter_field_name_split(field_name)

obj = self.get_value(first, args, kwargs)

# loop through the rest of the field_name, doing
# getattr or getitem as needed
for is_attr, i in rest:
if is_attr:
> obj = getattr(obj, i)
^^^^^^^^^^^^^^^
E AttributeError: 'int' object has no attribute 'one'

/usr/lib64/python3.12/string.py:305: AttributeError
=================================================================== short test summary info ====================================================================
ERROR p.py::TestClass::test_func[1] - AttributeError: 'int' object has no attribute 'one'
ERROR p.py::TestClass::test_func[2] - AttributeError: 'int' object has no attribute 'one'
====================================================================== 2 errors in 0.14s =======================================================================
```

This is shadowing the real error or skip in the fixture and is similar to #670

```
allure-pytest==2.15.0
pytest==8.4.1
```

Contributor guide

Open the contributing guide

Research direction

Start at the @allure.title formatting path and allure_commons.utils.SafeFormatter.get_field shown in the traceback; compare it with the behavior described in #670. Reproduce the parametrized-fixture skip and error cases, then verify that the original pytest skip or ValueError is reported instead of an AttributeError.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
testing
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.