xiaohongshu
xiaohongshu
cucumber-gherkin
Comprehensive BDD testing with Cucumber and Gherkin syntax. Use when writing feature files (.feature), step definitions, hooks, or implementing Behaviour-Driven Development. Covers Gherkin keywords (Feature, Scenario, Given/When/Then, Background, Scenario Outline, Rule), step definition patterns ...
Full skill instructions
BDD testing framework with plain-text executable specifications. Gherkin syntax with step definitions in Ruby, JavaScript, Java, or Python.
Cucumber reads executable specifications in plain text and validates software behavior. Gherkin is the structured grammar making plain text machine-readable.
┌────────────┐ ┌──────────────┐ ┌───────────┐
│ Steps │ │ Step │ │ │
│ in Gherkin ├──matched with──>│ Definitions ├───manipulates──>│ System │
└────────────┘ └──────────────┘ └───────────┘
Feature: Short description
Optional multi-line description explaining the feature.
Background:
Given common setup steps for all scenarios
Rule: Business rule grouping (Gherkin 6+)
Scenario: Concrete example illustrating the rule
Given an initial context (past tense, setup)
When an action occurs (present tense, trigger)
Then expected outcome (assertion)
And additional step
But negative assertion
Scenario Outline: Parameterized scenario
Given there are <start> items
When I remove <remove> items
Then I should have <remaining> items
Examples:
| start | remove | remaining |
| 12 | 5 | 7 |
| 20 | 5 | 15 |
| Keyword | Purpose | Example |
|---|---|---|
Given | Setup/precondition | Given I am logged in as "admin" |
When | Action/trigger | When I click the submit button |
Then | Assertion/outcome | Then I should see "Success" |
And | Continue previous type | And I have 3 items in my cart |
But | Negative continuation | But I should not see "Error" |
* | Bullet-style step | * I have eggs |
Data Tables - tabular data:
Given the following users exist:
| name | email | role |
| Alice | [email protected] | admin |
| Bob | [email protected] | user |
Doc Strings - multi-line text:
Given a blog post with content:
"""markdown
# My Post Title
This is the content of my blog post.
"""
@smoke @critical
Feature: User authentication
@wip
Scenario: Login with valid credentials
...
@slow @database
Scenario: Bulk user import
...
Tag expressions: @smoke and not @slow, @gui or @api, (@smoke or @critical) and not @wip
Match Gherkin steps to code. Use Cucumber Expressions (preferred) or Regular Expressions.
Given('I have {int} cucumbers in my belly') do |count|
@belly = Belly.new
@belly.eat(count)
end
When('I wait {int} hour(s)') do |hours|
@belly.wait(hours)
end
Then('my belly should growl') do
expect(@belly.growling?).to be true
end
# With data table
Given('the following users exist:') do |table|
table.hashes.each do |row|
User.create!(row)
end
end
const { Given, When, Then } = require('@cucumber/cucumber');
Given('I have {int} cucumbers in my belly', function(count) {
this.belly = new Belly();
this.belly.eat(count);
});
When('I wait {int} hour(s)', async function(hours) {
await this.belly.wait(hours);
});
Then('my belly should growl', function() {
expect(this.belly.isGrowling()).toBe(true);
});
// With data table
Given('the following users exist:', async function(dataTable) {
for (const row of dataTable.hashes()) {
await User.create(row);
}
});
public class StepDefinitions {
@Given("I have {int} cucumbers in my belly")
public void iHaveCucumbersInMyBelly(int count) {
belly = new Belly();
belly.eat(count);
}
@When("I wait {int} hour(s)")
public void iWaitHours(int hours) {
belly.wait(hours);
}
@Then("my belly should growl")
public void myBellyShouldGrowl() {
assertTrue(belly.isGrowling());
}
}
Built-in parameter types: {int}, {float}, {word}, {string}, {} (anonymous)
Optional text: cucumber(s) matches "cucumber" or "cucumbers"
Alternative text: color/colour matches "color" or "colour"
# Ruby
Before do |scenario|
# runs before each scenario
end
After do |scenario|
# runs after each scenario
screenshot if scenario.failed?
end
// JavaScript
const { Before, After } = require('@cucumber/cucumber');
Before(async function(scenario) {
// runs before each scenario
});
After(async function(scenario) {
// runs after each scenario
if (scenario.result.status === 'FAILED') {
await this.screenshot();
}
});
Before('@database') do
DatabaseCleaner.start
end
After('@database') do
DatabaseCleaner.clean
end
Before({ tags: '@browser and not @headless' }, async function() {
this.browser = await launchBrowser();
});
BeforeAll do
# once before any scenario
end
AfterAll do
# once after all scenarios
end
Good (declarative):
When "Bob" logs in
Then he sees his dashboard
Avoid (imperative):
When I visit "/login"
And I enter "bob" in "username"
And I enter "secret" in "password"
And I click "Login"
Then I should see "Dashboard"
# Ruby
bundle exec cucumber
cucumber --tags "@smoke and not @wip"
cucumber features/login.feature:10 # specific line
# JavaScript
npx cucumber-js
npx cucumber-js --tags "@smoke"
# Java (with Maven)
mvn test -Dcucumber.filter.tags="@smoke"
For comprehensive details, see reference files:
references/gherkin-syntax.md - Complete Gherkin language referencereferences/step-definitions.md - Step definition patterns by languagereferences/hooks-config.md - Hooks, configuration, and runnersreferences/best-practices.md - Anti-patterns and advanced patternsxiaohongshu
technical spec
product ux expert
database patterns
Conduct multi-agent task orchestration and workflow coordination.
Initialize project with Conductor artifacts (product definition,
Expert in web animations, transitions, and motion design using Framer Motion and CSS
Creates Mermaid and ASCII diagrams for flowcharts, architecture, ERDs, state machines, mindmaps, and more. Use when user mentions diagram, flowchart, mermaid, ASCII diagram, text diagram, terminal diagram, visualize, C4, mindmap, architecture diagram, sequence diagram, ERD, or needs visual docume...
PostgreSQL bindings for H3 hexagonal grid system. Use when working with H3 cells in Postgres, including spatial indexing, geometry/geography integration, and raster analysis.
Context-Driven Development skill for projects using Conductor. Use this skill when you detect a `conductor/` directory in the project, when working on tasks defined in a `plan.md` file, or when the user asks about tracks, specs, or plans. Automatically applies TDD workflow, tracks task completion...
Display project status, active tracks, and next actions
Official Stakpak application containerization standard operating procedure, a step-by-step guidline to properly dockerize applications. This is a rule book curated by the Stakpak Team.
Generate, edit, and beat-sync AI video with leading models in one workspace.
The world's fastest calendar for remote work
Transform Your Design with AI Designer by ImgCreator.ai
Revolutionizing Video Production with AI-Powered Creativity
Extend an image past the frame and let AI fill the new aspect ratio.
Discover your celebrity doppelgänger with StarByFace!
ChainClarity explains 700+ crypto whitepapers in plain English, with layered summaries, comparisons, research tools, alerts, and a $4.99 Pro plan.
Opus.ai: Revolutionize Your Web Experience