allure-framework / allure-framework/allure-python

Allure step placeholder fails when accessing dataclass attribute `data.name`

未关闭
#896 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看
主要语言
Python
星标
814
派生
260
PR 合并指标
30 天内没有已合并 PR

描述

With the usage provided in [step_placeholder.rst](https://github.com/allure-framework/allure-python/blob/master/allure-pytest/examples/step/step_placeholder.rst), I used Allure step placeholders to reference a property on a Python `dataclass` passed as a function argument. Using `data.name` in the step title raises an `AttributeError` during step rendering.

#### Expected behavior

Allure should resolve `data.name` and display the value of the `name` attribute in the step title like Create opportunity: Auto QA Example

#### Actual behavior

Allure raises an exception before the step executes: `AttributeError: 'str' object has no attribute 'get('name)'`

MWE of dataclass used

```python

@dataclass
class OpportunityData:
"""Data class for opportunity test data."""

name: str
expected_revenue: str
email: Optional[str] = None
phone: Optional[str] = None
state: Optional[str] = None
street: Optional[str] = None
zip_code: Optional[str] = None
```

Factory function for Opportunity creation
```python
def create_opportunity_data() -> OpportunityData:
"""Factory function to create OpportunityData for tests."""


data = OpportunityData(
name=f"Auto QA {fake.company()}",
expected_revenue=_generate_expected_revenue(),
email = fake.email()
phone = fake.phone_number()
street = fake.street_address()
zip_code = fake.zipcode()
state=fake.random_element(STATE_OPTIONS),
)

return data
```
Test Opportunity file
```python
@allure.title("Test opportunity creation with all main fields")
@allure.testcase("CRM-002")
@pytest.mark.regression
def test_opportunity_creation_full(opportunity_page: OpportunityPage, app_instance: App) -> None:

# ARRANGE
data = create_opportunity_data(full=True, opportunity_type="CRM Multi-Year")

# ACT
opportunity_page.create_opportunity(data)

# ASSERT
opportunity_page.verify_opportunity_saved(data.name)

```
Opportunity Page class
```python
@allure.step("Create opportunity: {data.name}")
def create_opportunity(self, data: "OpportunityData", base_url: str) -> Self:
"""High-level method to create an opportunity with provided data."""


# Fill main form fields
self.fill_opportunity_name(data.name)
self.fill_expected_revenue(data.expected_revenue)

```

Call stack

```
app_instance =

@allure.title("Test opportunity creation with minimal fields")
@allure.testcase("CRM-001")
@pytest.mark.smoke
def test_opportunity_creation_flow(opportunity_page: OpportunityPage, app_instance: App) -> None:

# ARRANGE
data = create_opportunity_data(opportunity_type="Monitoring")

# ACT
> opportunity_page.create_opportunity(data, app_instance.base_url)
E AttributeError: 'str' object has no attribute 'get('name)'
```

#### Notes

* `data` is a dataclass instance, not a dict.
* Attribute access works inside the function body.
* The error occurs during Allure step title formatting.

#### Environment

* Python 3.12
* allure-pytest==2.15.2
* pytest==8.4.2
* pytest-playwright==0.7.2
* mypy==1.19.0
* mypy-extensions==1.1.0

Does allure step placeholders accept only strings?

贡献指南

打开贡献指南

调研方向

从 step_placeholder.rst 中的用法开始,使用 Python 3.12 和 allure-pytest 2.15.2 通过 dataclass 示例复现失败。跟踪 step-title 占位符的渲染,并为 dataclass 属性访问添加覆盖;当步骤显示解析后的名称且不引发 AttributeError 时,即表示完成。

由索引模型根据 Issue 内容生成。

评估

技术栈
python
领域
testing
Issue 类型
缺陷
难度
3/5
预计耗时
1-2 天
活跃度
停滞
描述清晰度
基本清楚
新手友好度
45/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。