KeyError when using Rule keyword with step data tables or DocStrings
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Idoneità per principianti
- 50/100
Direzione di ricerca
Inizia in allure_behave/listener.py, intorno alle righe 144-147, quindi riproduci il problema con test/features/simple/tutorial.feature e test/steps/steps_tutorial.py. Esegui il comando fornito di Behave Allure formatter e verifica che gli step con tables e DocStrings all'interno di una Rule vengano completati correttamente senza generare un KeyError e producano i relativi allegati.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
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:
- Data tables (tables attached to steps)
- 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
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
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
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
Rulekeyword
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
Rulekeyword is a valid Gherkin construct for organizing scenarios - Behave 1.2.6+ fully supports the
Rulekeyword - 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
- Lingua principale
- Python
- Stelle
- 817
- Fork
- 262
- Merge medio
- 3h 20m
- PR unite (30g)
- 3
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di allure-framework/allure-python
-
[allure-behave] Steps from tag-excluded scenarios bleed into the next matching scenario's result when hide_excluded=trueForse già presa @liuyaohui666 l’ha presa 45 giorni fa. Aperta
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 84/100
-
Added CategoriesAperta
Difficoltà 3/5 1-2 giorni Idoneità per principianti 55/100
-
Phantom <lambda> teardown entries with unknown status when using pytest 9.1+Forse già presa @Mohanad49 l’ha presa 49 giorni fa. Aperta
Difficoltà 3/5 1-2 giorni Idoneità per principianti 58/100
allure-framework/allure-python#918 · 1 reazione ·
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 45/100
allure-framework/allure-python#903 · 1 commento ·
-
Allure step placeholder fails when accessing dataclass attribute `data.name`Forse già presa @golikovichev l’ha presa 154 giorni fa. Aperta
Difficoltà 3/5 1-2 giorni Idoneità per principianti 45/100
Tutte le issue di allure-framework/allure-python
Issue simili
-
feature:LinkChecker
Difficoltà 2/5 1-3 ore Idoneità per principianti 66/100
digitalfabrik/integreat-cms#4594 ·
I maintainer di solito rispondono entro 5 giorni
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
EleutherAI/lm-evaluation-harness#4319 ·
I maintainer di solito rispondono entro 1 giorno
-
needs triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
I maintainer di solito rispondono entro 1 giorno
-
json_params_matcher fails on falsy top-level JSON primitives (0, False, "")Forse già presa @mayureshsonawane17 l’ha presa oggi. ApertaWaiting for: Product Owner
Difficoltà 2/5 1-3 ore Idoneità per principianti 84/100
I maintainer di solito rispondono entro 5 giorni