allure-framework / allure-framework/allure-python
allure-behave: extend scenario_history_id to use optional environment variable
- 主要语言
- Python
- 星标
- 815
- 派生
- 260
- PR 合并指标
- 30 天内没有已合并 PR
描述
### Context
# allure-behave: extend scenario_history_id to use optional environment variable
We have a problem where we want to run the same test-suite in different environments. For example:
1. **Execute Test-Suite for Different Browser:** Firefox, Chrome, ... (i.e. 'BROWSER=firefox behave' 'BROWSER=chromium behave' etc.)
2. **Execute Test-Suite for Different Systems:** Linux armx64, Linux amd64, Win amd64, ...
If we collect all JSON allure-results and generate an allure report we only see **one** result for each test-scenario. Other executions are shown only in the "retries" section. We need to change the history ID so that each execution appears as a separate test.
We want to solve this by adding additional information into the historyId. It would have been nice to use additional user-modifiable information from the Scenario object, but this is not possible since scenario_history_id() is called before the before_scenario() hook (environment.py). Therefore not action in the before_scenario hook function (like changing scenario name or adding other information, can impact the historyId.
Thus, we designed a solution that uses an environment variable to pass this information. Our proposal is to the set an environment variable in `environment.py` that is used to influence the `historyId`.
In `allure-python/allure-behave/src/utils.py`:
```python
def scenario_history_id(scenario) -> str:
"""
Create a historyId for a scenario.
- Always based on feature name and scenario name
- Optional: can append a value from an environment variable
"""
parts = [scenario.feature.name, scenario.name]
if hasattr(scenario, "_row") and scenario._row:
row = scenario._row
parts.extend([f"{name}={value}" for name, value in zip(row.headings, row.cells)])
# Optional: append environment variable to differentiate runs
history_id = os.getenv("ALLURE_HISTORY_ID")
if history_id:
parts.append(history_id)
return md5(*parts)
```
To use this feature, add the environment variable in `environment.py`:
```python
from enum import Enum
import os
class Option(str, Enum):
OPTION_A = "Option A"
OPTION_B = "Option B"
def before_all(context):
os.environ["ALLURE_HISTORY_ID"] = Option.OPTION_B.name
```
Pull Request: #879
贡献指南
调研方向
从 allure-behave/src/utils.py 中的 scenario_history_id(scenario) 开始,然后检查收集 Allure 结果时如何使用其返回的历史 ID。当可选的 ALLURE_HISTORY_ID 值能够区分不同执行,而变量不存在时仍由现有的 feature、scenario 和 scenario-row 输入确定 ID,即表示完成。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- python
- 领域
- testing-qa
- Issue 类型
- 功能
- 难度
- 2/5
- 预计耗时
- 1-3 小时
- 活跃度
- 停滞
- 描述清晰度
- 描述清楚
- 新手友好度
- 48/100