Pickle
Browse step definitions from your project and insert them into .feature files with correct indentation, placeholders, tables, and doc strings.
Works with Cucumber, SpecFlow, and other BDD setups that use a pickle.steps.json catalog.
Features
- Steps sidebar — grouped list of available step definitions from your workspace
- One-click insert — click a step to add it at the cursor in the active feature file
- Smart placeholders — scalar parameters use examples or named placeholders; tables and doc strings are expanded automatically
- C# doc comments —
/// <summary> becomes the step description; /// <example> supplies table columns and rows
- Live reload — changes to
pickle.steps.json refresh the list automatically
Requirements
- VS Code 1.85+ or Cursor
- A workspace with
pickle.steps.json in the project root (or a custom path via settings)
- Gherkin syntax support for
.feature files (e.g. the Cucumber extension)
Getting started
- Install Pickle from the marketplace.
- Add
pickle.steps.json to your workspace root. See pickle.steps.example.json in this repo for the schema.
- Open the Pickle activity bar icon and use the Steps view.
- Open a
.feature file, place the cursor where you want a step, and click a step in the sidebar.
Configuration
| Setting |
Default |
Description |
pickle.stepsConfigFile |
pickle.steps.json |
Steps catalog file name, relative to the workspace root |
{
"version": 1,
"stepDefinitions": [
{
"group": "Login",
"steps": [
{
"keyword": "Given",
"text": "I am logged in as {string}",
"description": "Optional help text shown in the sidebar.",
"parameters": [
{ "name": "userName", "type": "string", "example": "admin@example.com" }
]
}
]
}
]
}
Parameter types: string, int, float, bool, table, docstring
Groups can use dot notation (e.g. Checkout.Cart) for nested display.
Generating from C#
Use Pickle: Refresh Steps from C# to scan step definition classes and rebuild pickle.steps.json.
Group names follow the file name: OrderSteps.cs → Order, OrderSteps.Shipping.cs → Order.Shipping.
Descriptions come from /// <summary> on the step method:
/// <summary>
/// Places an order using the values provided in the scenario table.
/// </summary>
[When(@"I place an order with details:")]
public void WhenIPlaceAnOrderWithDetails(Table details) { }
Table columns and rows can be taken from a /// <example> block on the same method:
/// <summary>
/// Places an order using the values provided in the scenario table.
/// </summary>
/// <example>
/// When I place an order with details:
/// | Field | Value |
/// | product | Widget A |
/// | quantity | 3 |
/// | priority | high |
/// </example>
[When(@"I place an order with details:")]
public void WhenIPlaceAnOrderWithDetails(Table details) { }
On refresh, Pickle extracts the table into pickle.steps.json:
{
"keyword": "When",
"text": "I place an order with details:",
"description": "Places an order using the values provided in the scenario table.",
"parameters": [
{
"name": "details",
"type": "table",
"columns": ["Field", "Value"],
"rows": [
["product", "Widget A"],
["quantity", "3"],
["priority", "high"]
]
}
]
}
If a method has an <example> table, that table replaces any existing columns/rows in the JSON. Without an example, manually edited table data in pickle.steps.json is preserved on refresh.
Commands
| Command |
Description |
Pickle: Refresh Steps |
Reload the steps catalog |
Pickle: Show Descriptions |
Show step descriptions in the sidebar |
Pickle: Hide Descriptions |
Hide step descriptions |
Feedback
Questions, bugs, or suggestions: godandag@gmail.com
License
MIT