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.2.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.2-py3-none-any.whl (19.5 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: bdd_lint-0.1.2.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.2.tar.gz
Algorithm Hash digest
SHA256 26b8f2b8c60397ce0c3464b26ea0bd24d8e837feb1ceaf9add36aa10698ad880
MD5 bb2e425e9c5331f004784d63bbaac78d
BLAKE2b-256 2b5c0011a5558ee0d840b5b540a2358a9381cd9fafd2bead863e1d2d51c84f52

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bdd_lint-0.1.2-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.2-py3-none-any.whl
Algorithm Hash digest
SHA256 1a9a8653e93aca6ebbce5e6ae12746ae816b1ed709e65ca198e3799f84539ad7
MD5 8efcb3bb4e1c9b30eaa121d5cbfb2ca7
BLAKE2b-256 7f2eb7c4c6cac362526431f88d1d077eb508959172b1cde9772fa0c3afcb72b5

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