Skip to content

KeyError when using Rule keyword with step data tables or DocStrings #886

@hemz10

Description

@hemz10

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions