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

Uploaded Python 3

File details

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

File metadata

  • Download URL: bdd_lint-0.1.3.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.3.tar.gz
Algorithm Hash digest
SHA256 0f5efacd348495877e9ae69f9722af6cf1c5bc047089289caca1772d0128986a
MD5 ce4f27438300e848a9fc200798413dae
BLAKE2b-256 32d4e9d03475b1abbc68d11ca0e5d6a8f8368e521798067bbb30d6587d0898e1

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bdd_lint-0.1.3-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.3-py3-none-any.whl
Algorithm Hash digest
SHA256 e672f0a44f788daac5eaddd2a2a253b92b1723bf3a3ada74ca4fb4ca7ba1073d
MD5 5ce754e681b2a25890a08390b281f4e0
BLAKE2b-256 bb7c003d7e721f038b9c52bd4eff4d91dc360b5bbe4baf4732e74f1fc91939da

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