pytest-dev / pytest-bdd

BDD library for the pytest runner
https://pytest-bdd.readthedocs.io/en/latest/
MIT License
1.32k stars 221 forks source link

Request for Supporting Dynamic Import in pytest_bdd_before_scenario #750

Open ktzoulas opened 18 hours ago

ktzoulas commented 18 hours ago

I would like to request support for dynamically importing step definitions in the pytest_bdd_before_scenario hook. This feature would greatly enhance the flexibility and modularity of test setups, especially in large projects with multiple feature files and step definitions.

Current Behavior: Currently, pytest-bdd does not provide a straightforward way to dynamically import step definitions based on the feature file being executed. While it is possible to use importlib to import modules dynamically, the step definitions are not registered correctly, leading to issues where steps are not found during test execution.

Proposed Enhancement: Enhance the pytest_bdd_before_scenario hook to support dynamic import and registration of step definitions. This could involve:

  1. Allowing dynamic import of step definition modules based on the feature file path or tags.
  2. Ensuring that dynamically imported step definitions are correctly registered and recognized by pytest-bdd.

Use Case: In large projects with multiple feature files and step definitions, it is often necessary to organize step definitions into separate modules. Dynamically importing and registering these step definitions based on the feature file being executed would:

Example Scenario: Consider a project with the following structure:

project_root/
    tests/
        features/
            feature_a/
                feature_a.feature
            feature_b/
                feature_b.feature
        steps/
            test_feature_a.py
            test_feature_b.py
        conftest.py
        hooks.py

In the hooks.py file, we would like to dynamically import and register the appropriate step definitions based on the feature file being executed:

import importlib
from pytest_bdd import before_scenario

def pytest_bdd_before_scenario(request, feature, scenario):
    feature_path = feature.filename
    if 'feature_a' in feature_path:
        importlib.import_module('tests.steps.test_feature_a')
    elif 'feature_b' in feature_path:
        importlib.import_module('tests.steps.test_feature_b')

With the proposed enhancement, pytest-bdd would ensure that the dynamically imported step definitions are correctly registered and recognized during test execution.

Thank you for considering this enhancement request. I look forward to your feedback and hope to see this feature implemented in a future release.