allure-python icon indicating copy to clipboard operation
allure-python copied to clipboard

KeyError when using Rule keyword with step data tables or DocStrings

Open hemz10 opened this issue 3 months ago • 0 comments

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

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 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

hemz10 avatar Dec 01 '25 07:12 hemz10