cucumber-best-practices
Cucumber best practices, patterns, and anti-patterns
What this skill does
# Cucumber Best Practices
Master patterns and practices for effective Cucumber testing.
## Scenario Design Principles
### 1. Write Declarative Scenarios
Focus on **what** needs to happen, not **how** it happens.
❌ **Imperative** (implementation-focused):
```gherkin
Scenario: Add product to cart
Given I navigate to "http://shop.com/products"
When I find the element with CSS ".product[data-id='123']"
And I click the button with class "add-to-cart"
And I wait for the AJAX request to complete
Then the element ".cart-count" should contain "1"
```
✅ **Declarative** (business-focused):
```gherkin
Scenario: Add product to cart
Given I am browsing products
When I add "Wireless Headphones" to my cart
Then my cart should contain 1 item
```
### 2. One Scenario, One Behavior
Each scenario should test exactly one business rule or behavior.
❌ **Multiple behaviors in one scenario:**
```gherkin
Scenario: User registration and login and profile update
Given I register a new account
When I log in
And I update my profile
And I change my password
Then everything should work
```
✅ **Separate scenarios:**
```gherkin
Scenario: Register new account
When I register with valid details
Then I should receive a confirmation email
Scenario: Login with new account
Given I have registered an account
When I log in with my credentials
Then I should see my dashboard
Scenario: Update profile
Given I am logged in
When I update my profile information
Then my changes should be saved
```
### 3. Keep Scenarios Independent
Each scenario should set up its own preconditions.
❌ **Dependent scenarios:**
```gherkin
Scenario: Create order
When I create order #12345
Scenario: View order
When I view order #12345 # Depends on previous scenario!
```
✅ **Independent scenarios:**
```gherkin
Scenario: View order
Given an order exists with ID "12345"
When I view the order details
Then I should see the order information
```
### 4. Use Background Wisely
Use Background for common setup, but don't overuse it.
✅ **Good use of Background:**
```gherkin
Feature: Shopping Cart
Background:
Given I am logged in as a customer
Scenario: Add product to cart
When I add a product to my cart
Then my cart should contain 1 item
Scenario: Remove product from cart
Given I have a product in my cart
When I remove the product
Then my cart should be empty
```
❌ **Background doing too much:**
```gherkin
Background:
Given I am on the homepage
And I click the menu
And I navigate to products
And I filter by category "Electronics"
And I sort by price
# Too much setup! Not all scenarios need all of this
```
## Feature Organization
### Group Related Scenarios
```gherkin
Feature: User Authentication
Scenario: Successful login
...
Scenario: Failed login with wrong password
...
Scenario: Account lockout after multiple failures
...
```
### Use Tags Effectively
```gherkin
@smoke @critical
Scenario: Login with valid credentials
...
@slow @integration
Scenario: Password reset email workflow
...
@wip
Scenario: OAuth login
# Work in progress
...
```
Run specific tags:
```bash
# Run smoke tests
cucumber --tags "@smoke"
# Run all except WIP
cucumber --tags "not @wip"
# Run smoke AND critical
cucumber --tags "@smoke and @critical"
# Run smoke OR critical
cucumber --tags "@smoke or @critical"
```
## Writing Good Gherkin
### Use Domain Language
Write in the language of the business domain, not technical terms.
❌ **Technical language:**
```gherkin
Scenario: POST request to /api/users
When I send a POST to "/api/users" with JSON payload
And the response status is 201
```
✅ **Domain language:**
```gherkin
Scenario: Register new user
When I register a new user account
Then the user should be created successfully
```
### Keep Steps at the Same Level
Don't mix high-level and low-level details.
❌ **Mixed levels:**
```gherkin
Scenario: Purchase product
Given I am logged in
When I add a product to cart
And I click the element with ID "checkout-btn" # Too detailed!
And I enter credit card "4111111111111111" # Too detailed!
Then I complete the purchase
```
✅ **Consistent level:**
```gherkin
Scenario: Purchase product
Given I am logged in
And I have a product in my cart
When I checkout with a credit card
Then my order should be completed
And I should receive a confirmation email
```
### Avoid Conjunctive Steps
Don't use "And" to combine multiple distinct actions in prose.
❌ **Conjunctive step:**
```gherkin
When I log in and add a product to cart and checkout
```
✅ **Separate steps:**
```gherkin
When I log in
And I add a product to my cart
And I proceed to checkout
```
## Scenario Outlines
### Use for True Variations
Use Scenario Outlines when you need to test the same behavior with different data.
✅ **Good use:**
```gherkin
Scenario Outline: Login validation
When I log in with "<username>" and "<password>"
Then I should see "<message>"
Examples:
| username | password | message |
| valid | valid | Welcome |
| invalid | valid | Invalid username |
| valid | invalid | Invalid password |
| empty | empty | Username required |
```
❌ **Overusing Scenario Outline:**
```gherkin
# Don't use Scenario Outline for unrelated test cases
Scenario Outline: Multiple features
When I use feature "<feature>"
Then result is "<result>"
Examples:
| feature | result |
| login | success |
| registration | success |
| cart | empty | # These are different behaviors!
```
### Keep Examples Meaningful
```gherkin
Scenario Outline: Discount calculation
Given a customer with "<membership>" status
When they purchase items totaling $<amount>
Then they should receive a $<discount> discount
Examples: Standard discounts
| membership | amount | discount |
| silver | 100 | 5 |
| gold | 100 | 10 |
| platinum | 100 | 15 |
Examples: Minimum purchase thresholds
| membership | amount | discount |
| silver | 49 | 0 |
| silver | 50 | 2.50 |
```
## Step Definition Patterns
### Create Reusable Steps
```javascript
// Generic, reusable
When('I fill in {string} with {string}', async function(field, value) {
await this.page.fill(`[name="${field}"]`, value);
});
// Used in multiple scenarios:
When('I fill in "email" with "[email protected]"')
When('I fill in "password" with "secure123"')
When('I fill in "search" with "products"')
```
### Avoid Over-Generic Steps
Balance reusability with readability.
❌ **Too generic:**
```javascript
When('I do {string} with {string} and {string}', ...)
```
✅ **Specific and readable:**
```javascript
When('I log in with {string} and {string}', ...)
When('I search for {string} in {string}', ...)
```
## Data Management
### Use Factories for Test Data
```javascript
// support/factories.js
const faker = require('faker');
class UserFactory {
static create(overrides = {}) {
return {
firstName: faker.name.firstName(),
lastName: faker.name.lastName(),
email: faker.internet.email(),
password: 'Test123!',
...overrides
};
}
}
// Use in steps
Given('I register a new user', async function() {
const user = UserFactory.create();
this.currentUser = user;
await this.api.register(user);
});
```
### Avoid Hardcoded IDs
❌ **Hardcoded:**
```gherkin
Given user "12345" exists
When I view order "67890"
```
✅ **Named entities:**
```gherkin
Given a user "[email protected]" exists
When I view my most recent order
```
## Error Handling
### Test Happy and Unhappy Paths
```gherkin
@happy-path
Scenario: Successful checkout
Given I have items in my cart
When I complete the checkout process
Then my order should be confirmed
@error-handling
Scenario: CheckoRelated in General
modeling-omnistudio-epc-catalog
IncludedSalesforce Industries CME EPC product-modeling skill for Product2-based catalog creation. Use when creating EPC products, configuring product attributes, building offer bundles with Product Child Items, or reviewing EPC DataPack JSON metadata for product catalog changes. TRIGGER when: user creates or updates Product2 EPC records, AttributeAssignment payloads, AttributeMetadata/AttributeDefaultValues, Offer bundles, or ProductChildItem relationships. DO NOT TRIGGER when: designing OmniScripts/FlexCards/Integration Procedures (use building-omnistudio-omniscript, building-omnistudio-flexcard, or building-omnistudio-integration-procedure), implementing Apex business logic (use generating-apex), or troubleshooting deployment pipelines (use deploying-metadata).
relationship-science-coach
IncludedUse this skill for direct, practical adult relationship coaching: couples conflict, repair, trust, marriage, dating, flirting, attachment patterns, emotional connection, sex, desire differences, eroticism, kink negotiation, affection, love languages, breakups, and long-term passion. Draw on Gottman, EFT and Hold Me Tight, attachment science, modern sex research, Perel, Nagoski, Kerner, Schnarch, Love and Stosny, and flexible love-language tools. Be concrete and low-hedge. Redirect only for imminent danger, abuse, coercive control, minors, non-consent, self-harm, stalking, or medical/legal/psychiatric decisions.
building-sf-integrations
IncludedSalesforce integration architecture and runtime plumbing with 120-point scoring. Use this skill to set up Named Credentials, External Credentials, External Services, REST/SOAP callout patterns, Platform Events, and Change Data Capture. TRIGGER when: user sets up Named Credentials, External Services, REST/SOAP callouts, Platform Events, CDC, or touches .namedCredential-meta.xml files. DO NOT TRIGGER when: Connected App/OAuth config (use configuring-connected-apps), Apex-only logic (use generating-apex), or data import/export (use handling-sf-data).
venue-templates
IncludedAccess comprehensive LaTeX templates, formatting requirements, and submission guidelines for major scientific publication venues (Nature, Science, PLOS, IEEE, ACM), academic conferences (NeurIPS, ICML, CVPR, CHI), research posters, and grant proposals (NSF, NIH, DOE, DARPA). This skill should be used when preparing manuscripts for journal submission, conference papers, research posters, or grant proposals and need venue-specific formatting requirements and templates.
let-fate-decide
IncludedDraws the 12 Houses of the Zodiac Tarot spread to inject entropy into planning when prompts are vague, ambiguous, or casually delegated. Interprets the spread to guide next steps. Use when the user says 'let fate decide', 'YOLO', 'whatever', 'idk', or other nonchalant phrases, makes Yu-Gi-Oh references, or when you are about to arbitrarily pick between multiple reasonable approaches. Prefer over ask-questions-if-underspecified when the user's tone is casual or playful rather than precision-seeking.
net-ops
IncludedCross-platform network troubleshooting (Windows, macOS, Linux) via local or remote shell. Use for: DNS broken, can't resolve hostnames, nslookup/dig works but apps fail, NRPT, WFP, scutil, /etc/resolver, systemd-resolved, /etc/resolv.conf, NetworkManager, VPN DNS leak residue (ProtonVPN/Mullvad/WireGuard/AnyConnect), AV/firewall blocking DNS or DoH, Tailscale DNS interaction, intermittent connectivity, remote diagnostics over SSH.