Home

Awesome

Gherkin lint

Run NodeJS Tests Coverage Status npm

Uses Gherkin to parse feature files and runs linting against the default rules, and the optional rules you specified in your .gherkin-lintrc file.

Installation

npm install gherkin-lint

Demo

To see the output for all the errors that the linter can detect run:

git clone https://github.com/gherkin-lint/gherkin-lint.git
npm run demo

Or check this: console

Available rules

NameFunctionality
no-tags-on-backgrounds *Disallows tags on Background
one-feature-per-file *Disallows multiple Feature definitions in the same file
up-to-one-background-per-file *Disallows multiple Background definition in the same file
no-multiline-steps *Disallows mutiline Steps
allowed-tagsJust the listed tags are allowed
file-nameRestrict feature file names to a commmon style
indentationAllows the user to specify indentation rules
max-scenarios-per-fileAllows the user to specify the max number of scenarios per feature file
name-lengthAllows restricting length of Feature/Scenario/Step names
new-line-at-eofDisallows/enforces new line at EOF
no-background-only-scenarioDisallows background when there is just one scenario
no-dupe-feature-namesDisallows duplicate Feature names
no-dupe-scenario-namesDisallows duplicate Scenario names
no-duplicate-tagsDisallows duplicate tags on the same Feature or Scenario
no-empty-backgroundDisallows features with backgrounds without steps
no-empty-fileDisallows empty feature files
no-examples-in-scenariosDisallow the use of "Examples" in Scenarios, only allowed in Scenario Outlines
no-files-without-scenariosDisallows files with no scenarios
no-homogenous-tagsDisallows tags present on every Scenario in a Feature, rather than on the Feature itself
no-multiple-empty-linesDisallows multiple empty lines
no-partially-commented-tag-linesDisallows partially commented tag lines
no-restricted-patternsA list of patterns to disallow globally, or specifically in features, backgrounds, scenarios, or scenario outlines
no-restricted-tagsDisallow use of particular @tags
no-scenario-outlines-without-examplesDisallows scenario outlines without examples
no-superfluous-tagsDisallows tags present on a Feature and a Scenario in that Feature
no-trailing-spacesDisallows trailing spaces
no-unnamed-featuresDisallows empty Feature name
no-unnamed-scenariosDisallows empty Scenario name
no-unused-variablesDisallows unused variables in scenario outlines
one-space-between-tagsTags on the same line must be separated by a single space
required-tagsRequire tags/patterns of tags on Scenarios
scenario-sizeAllows restricting the maximum number of steps in a scenario, scenario outline and background
use-andDisallows repeated step names requiring use of And instead
keywords-in-logical-orderRequires that Given, When and Then appear in logical sequence
only-one-whenRequires that there is at most one When step for each scenario

* These rules cannot be turned off because they detect undocumented cucumber functionality that causes the gherkin parser to crash.

Rule Configuration

The not-configurable rules are turned on by default and cannot be turned off. Configurable rules can be customized using a file.

The configurable rules are off by default. To turn them on, you will need to create a json file, where you specify the name of each rule and its desired state (which can be "on" or "off"). Eg:

{
  "no-unnamed-features": "on"
}

will turn on the no-unnamed-features rule.

allowed-tags

allowed-tags should be configured with the list of allowed tags and patterns:

{
  "allowed-tags": ["on", {"tags": ["@watch", "@wip"], "patterns": ["^@todo$"]}]
}

Any tag not included in this list won't be allowed.

file-name

file-name is configured with a style to enforce. The default is PascalCase:

{
  "file-name": ["on", {"style": "PascalCase"}]
}

The list of supported styles is:

no-restricted-patterns

no-restricted-patterns is a list of exact or partial patterns whose matches are dissallowed in feature name and description, and in background, scenario and scenario outline name, description and steps. All patterns are treated as case insensitive. The rule can be configured like this:

{
  "no-restricted-patterns": ["on", {
    "Global": [
      "^globally restricted pattern"
    ],
    "Feature": [
      "poor description",
      "validate",
      "verify"
    ],
    "Background": [
      "show last response",
      "a debugging step"
    ],
    "Scenario": [
      "show last response",
      "a debugging step"
    ]
  }]
}

Notes:

indentation

indentation can be configured in a more granular level and uses following rules by default:

You can override the defaults for indentation like this:

{
  "indentation" : [
    "on", {
      "Feature": 0,
      "Background": 0,
      "Scenario": 0,
      "Step": 2,
      "Examples": 0,
      "example": 2,
      "given": 2,
      "when": 2,
      "then": 2,
      "and": 2,
      "but": 2,
      "feature tag": 0,
      "scenario tag": 0
    }
  ]
}

There is no need to override all the defaults, as is done above, instead they can be overriden only where required. Step will be used as a fallback if the keyword of the step, eg. 'given', is not specified. If feature tag is not set then Feature is used as a fallback, and if scenario tag is not set then Scenario is used as a fallback.

This feature is able to handle all localizations of the gherkin steps.

max-scenarios-per-file

The max-scenarios-per-file supports some configuration options:

The configuration looks like this (showing the defaults):

{
  "max-scenarios-per-file": ["on", {"maxScenarios": 10, "countOutlineExamples": true}]
}

name-length

name-length can be configured separately for Feature, Scenario and Step names. The default is 70 characters for each of these:

{
  "name-length" : ["on", { "Feature": 70, "Scenario": 70, "Step": 70 }]
}

new-line-at-eof

new-line-at-eof can be configured to enforce or disallow new lines at EOF.

{
  "new-line-at-eof": ["on", "yes"]
}
{
  "new-line-at-eof": ["on", "no"]
}

no-dupe-scenario-names

no-dupe-scenario-names can be configured to search for duplicates in each individual feature or amongst all feature files. To enable searching for duplicates in each individual feature (same scenario name in different features won't raise an error) you need to configure the rule like this:

{
  "no-dupe-scenario-names": ["on", "in-feature"]
}

The default case is testing against all the features (same scenario name in different features will raise an error). To get that behavor use the following configuration:

{
  "no-dupe-scenario-names": "on"
}

or

{
  "no-dupe-scenario-names": ["on", "anywhere"]
}

no-restricted-tags

no-restricted-tags should be configured with the list of restricted tags and patterns:

{
  "no-restricted-tags": ["on", {"tags": ["@watch", "@wip"], "patterns": ["^@todo$"]}]
}

required-tags

required-tags supports some configuration options:

{
  "required-tags": ["on", {"tags": ["^@issue:[1-9]\\d*$"], "ignoreUntagged": false}]
}

scenario-size

scenario-size lets you specify a maximum step length for scenarios and backgrounds. The Scenario configuration applies to both scenarios and scenario outlines:

{
  "scenario-size": ["on", { "steps-length": { "Background": 15, "Scenario": 15 }}]
}

Configuration File

The default name for the configuration file is .gherkin-lintrc and it's expected to be in your working directory.

The file contents must be valid JSON, though it does allow comments.

If you are using a file with a different name or a file in a different folder, you will need to specify the -c or --config option and pass in the relative path to your configuration file. Eg: gherkin-lint -c path/to/configuration/file.extention

You can find an example configuration file, that turns on all of the rules in the root of this repo (.gherkin-lintrc).

Ignoring Feature Files

There are 2 ways you can specify files that the linter should ignore:

  1. Add a .gherkin-lintignore file in your working directory and specify one glob pattern per file line
  2. Use the command line option-i or --ignore, pass in a comma separated list of glob patterns. If specified, the command line option will override the .gherkin-lintignore file.

Custom rules

You can specify one more more custom rules directories by using the -r or --rulesdir command line option. Rules in the given directories will be available additionally to the default rules.

Example:

gherkin-lint --rulesdir "/path/to/my/rulesdir" --rulesdir "from/cwd/rulesdir"

Paths can either be absolute or relative to the current working directory. Have a look at the src/rules/ directory for examples; The no-empty-file rule is a good example to start with.