allure-framework / allure-framework/allure-python

KeyError when using Rule keyword with step data tables or DocStrings

オープン
#886 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る
主要言語
Python
スター
814
フォーク
260
PR マージ指標
30日以内にマージされた PR はありません

説明

# Bug Report:

## Environment
- **OS**: Windows
- **Python version**: 3.12.10
- **behave version**: 1.3.1
- **allure-behave version**: 2.15.2
- **allure-commons version**: (auto-installed with allure-behave)
- **allure commandline version**: 2.35.1

## Description
When using the `Rule` keyword (introduced in Behave 1.2.6) in feature files, `allure-behave` formatter throws a `KeyError: None` exception when processing steps that contain:
1. Data tables (tables attached to steps)
2. DocStrings (multi-line text enclosed in triple quotes `"""`)

## Expected Behavior
The Allure formatter should successfully process scenarios under a `Rule` that contain steps with data tables or DocStrings, just as it does for scenarios without the `Rule` keyword.

## Actual Behavior
The formatter crashes with a `KeyError: None` traceback when attempting to attach step data (tables or text) to the Allure report.

## Steps to Reproduce

### 1. Create a feature file with Rule and data table
**File: `test/features/simple/tutorial.feature`**
```gherkin
Feature: showing off behave

Rule: Basic arithmetic operations

Scenario: Passing a table as a data through step
Given we have behave installed
When we pass a table as a data through step
| number1 | number2 | result |
| 2 | 3 | 5 |
| 4 | 5 | 9 |
Then behave should be able to read the table
```

### 2. Create step definitions
**File: `test/steps/steps_tutorial.py`**
```python
from behave import given, when, then

@given('we have behave installed')
def step_impl(context):
pass

@when('we pass a table as a data through step')
def step_impl(context):
assert context.table

@then('behave should be able to read the table')
def step_impl(context):
pass
```

### 3. Run with Allure formatter
```bash
behave -f allure_behave.formatter:AllureFormatter -o allure_result_folder
```

### 4. Observe the error
```
Exception KeyError: None
Traceback (most recent call last):
...
File "allure_behave/listener.py", line 147, in start_behave_step
self.logger.attach_data(uuid4(), step_table(step), name='.table', attachment_type=AttachmentType.CSV)
File "allure_commons/reporter.py", line 163, in attach_data
file_name = self._attach(uuid, name=name, attachment_type=attachment_type,
File "allure_commons/reporter.py", line 153, in _attach
self._items[last_uuid].attachments.append(attachment)
File "allure_commons/reporter.py", line 33, in __getitem__
return self.thread_context.__getitem__(item)
KeyError: None
```

## Additional Testing

### Works ✅
- Simple scenarios under `Rule` (no tables/DocStrings)
- Scenario Outlines with Examples tables under `Rule`
- All scenario types WITHOUT `Rule` keyword

### Fails ❌
- Steps with data tables under `Rule`
- Steps with DocStrings under `Rule`

### Test Results Matrix

| Scenario Type | Without Rule | With Rule |
|--------------|--------------|-----------|
| Simple scenario | ✅ Works | ✅ Works |
| Scenario Outline with Examples | ✅ Works | ✅ Works |
| Step with data table | ✅ Works | ❌ **Fails** |
| Step with DocString | ✅ Works | ❌ **Fails** |

## Root Cause Analysis
The issue appears to be in `allure_behave/listener.py` at line 147 (data tables) and line 144 (DocStrings). When processing scenarios under a `Rule`, the `last_uuid` is `None`, causing the attachment operation to fail when trying to access `self._items[last_uuid]`.

The `Rule` hierarchy creates a different context structure that the formatter doesn't handle correctly when attaching step data.

## Suggested Fix
The `start_behave_step` method in `allure_behave/listener.py` needs to properly handle the context hierarchy when scenarios are nested under a `Rule`. The `last_uuid` should be correctly resolved even when scenarios are children of a `Rule` element.

## Additional Context
- The `Rule` keyword is a valid Gherkin construct for organizing scenarios
- Behave 1.2.6+ fully supports the `Rule` keyword
- This issue prevents using Allure reporting with modern Gherkin best practices

## References
- Gherkin Rule keyword documentation: https://cucumber.io/docs/gherkin/reference/#rule
- Behave changelog (Rule support): https://github.com/behave/behave/blob/main/CHANGES.rst

コントリビューションガイド

コントリビューションガイドを開く

調査の方向性

allure_behave/listener.py の 144-147 行付近から始め、test/features/simple/tutorial.feature と test/steps/steps_tutorial.py を使って再現します。提供されている Behave Allure formatter コマンドを実行し、Rule 内の tables と DocStrings を含む steps が KeyError を発生させずに正常に完了し、それらの attachments が生成されることを確認します。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
python
領域
testing
issue の種類
バグ
難易度
3/5
見積もり時間
1〜2日
活発さ
停滞
明瞭さ
明確に書かれている
初心者へのやさしさ
50/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。