Skip to main content

A standalone linter for Gherkin feature files to enforce grammar and best practices

Project description

bdd-lint

A linter for Behave BDD scenarios to enforce grammar and best practices.

Features

  • All major rules from gherkin-lint
  • Custom configuration via .bdd-lint.yml
  • Enable/disable rules and set options
  • Support for custom user-defined rules in custom_rules/
  • CLI config selection: bdd-lint <feature-file> [--config <config-file>]

Supported Rules

GivenPastTenseRule: Enforces past tense for 'Given' steps.

  • WhenPresentTenseRule: Enforces present tense for 'When' steps.
  • ThenFutureTenseRule: Enforces future verbs (should, will, shall) for 'Then' steps.
  • OneWhenThenRule: Restricts each scenario to exactly one When and one Then step.
  • ThirdPersonRule: Enforces third-person perspective in steps.
  • TenseConsistencyRule: Ensures consistent tense usage across Given/When/Then.
  • NoEmptyScenariosRule: Flags scenarios with no steps.
  • NoUnnamedFeaturesRule: Flags features without a name.
  • NoUnnamedScenariosRule: Flags scenarios without a name.
  • NoDuplicateScenariosRule: Flags duplicate scenario names.
  • NoDuplicateStepRule: Flags duplicate steps within a scenario.
  • NoScenarioOutlinesWithoutExamplesRule: Flags scenario outlines missing Examples.
  • NoStepKeywordInStepTextRule: Flags steps containing step keywords in their text.
  • NoMultilineStepRule: Flags steps that span multiple lines.
  • NoTagsOnBackgroundsRule: Flags tags on Background sections.
  • ConsistentStepKeywordOrderRule: Ensures step keywords appear in the order: Given, When, Then.
  • LowerCaseFeatureNameRule: Enforces feature names to be lower case.
  • LowerCaseScenarioNameRule: Enforces scenario names to be lower case.
  • MaxScenariosPerFileRule: Flags if the number of scenarios in a file exceeds a threshold.
  • MaxStepsPerScenarioRule: Flags if the number of steps in a scenario exceeds a threshold.
  • RequiredTagsRule: Flags scenarios missing required tags.
  • TagsFormatRule: Flags tags that do not match a required format.

Usage

bdd-lint path/to/feature_file.feature
bdd-lint path/to/feature_file.feature --config custom_config.yml
# Example: output as JSON
bdd-lint path/to/feature_file.feature --json

Testing

Run the unit test suite with pytest:

pytest -q

The project includes a set of unit tests under tests/unit/ that exercise the parser, each rule, the NLP helper heuristics and the configuration verifier.

Configuration

Create a .bdd-lint.yml file in your project root:

rules:
  GivenPastTenseRule: true
  MaxScenariosPerFileRule: true
options:
  MaxScenariosPerFileRule:
    max_scenarios: 5

Custom Rules

Place your custom rule Python files in the custom_rules/ directory. Each file should define a class named in CamelCase matching the filename, inheriting from BaseRule.

Example: custom_rules/my_custom_rule.py

from bdd_lint.rules.base_rule import BaseRule
class MyCustomRule(BaseRule):
    def check(self, scenario):
        # Custom logic
        return []

Requirements

  • Python 3.7+
  • textblob, spacy, nltk, pytest, pytest-bdd, gherkin-official
  • NLTK/TextBlob corpora and spaCy model are auto-downloaded on install

Notes:

  • The library ships with a lightweight NLP helper in bdd_lint.utils.nlp which falls back to fast heuristics when TextBlob/spaCy are not available. This keeps tests fast and deterministic.
  • Use the bdd_lint.config_verifier.verify_config helper to validate .bdd-lint.yml files programmatically.
  • The CLI returns human-readable messages by default or a JSON array of issue objects when --json is used. Each issue is represented by the bdd_lint.models.issue.Issue dataclass and includes rule, message, scenario, line, and severity keys.

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

bdd_lint-0.1.1.tar.gz (12.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

bdd_lint-0.1.1-py3-none-any.whl (19.5 kB view details)

Uploaded Python 3

File details

Details for the file bdd_lint-0.1.1.tar.gz.

File metadata

  • Download URL: bdd_lint-0.1.1.tar.gz
  • Upload date:
  • Size: 12.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.14

File hashes

Hashes for bdd_lint-0.1.1.tar.gz
Algorithm Hash digest
SHA256 6f378d91a387b9758be06d442eb84cc793ae8ab6ee1579ebe716f81b4c014e2f
MD5 35092fd6a7cdb0abeb526d67fd82abfc
BLAKE2b-256 e5ee08394708ba82091927ace57be035f8c27c3e2c6dd121b981854c0f18e490

See more details on using hashes here.

File details

Details for the file bdd_lint-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: bdd_lint-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 19.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.14

File hashes

Hashes for bdd_lint-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 7e22f4a88faa143c26d8794e3d63c1fd6731248fb859f69a58a737b59644d004
MD5 a581ed2a83da6af531b4056a293f4fcf
BLAKE2b-256 b0e79801deaa577552d808202ad83de4c9d59a6dbadc52f53a4e8936f0ddb93e

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page