Intermediate
Chapter 13 · 9 min read
Custom Parameter Types & Transformers
Create custom parameter types to convert Gherkin text into objects — dates, enums, currencies, and domain-specific types.
Custom Parameter Types
Built-in types like {string} and {int} cover basics, but real-world scenarios deal with dates, currencies, enums, and domain objects. Custom parameter types convert Gherkin text directly into typed objects.
ParameterTypes.java
package com.bdd.course.stepdefinitions;
import io.cucumber.java.ParameterType;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class ParameterTypes {
// Custom type: convert "2026-01-15" to LocalDate
@ParameterType("\\d{4}-\\d{2}-\\d{2}")
public LocalDate date(String dateString) {
return LocalDate.parse(dateString,
DateTimeFormatter.ISO_LOCAL_DATE);
}
// Custom type: convert "$99.99" to double
@ParameterType("\\$[\\d,]+\\.?\\d*")
public double currency(String amount) {
return Double.parseDouble(
amount.replace("$", "").replace(",", ""));
}
// Custom enum type
public enum UserRole { ADMIN, MANAGER, TESTER, DEVELOPER }
@ParameterType("admin|manager|tester|developer")
public UserRole role(String value) {
return UserRole.valueOf(value.toUpperCase());
}
}
// Usage in step definitions:
// @Given("the deadline is {date}")
// public void setDeadline(LocalDate date) { ... }
//
// @Then("the price should be {currency}")
// public void verifyPrice(double price) { ... }
//
// @Given("the user has {role} permissions")
// public void setRole(UserRole role) { ... }
custom_types.py
# features/steps/custom_types.py
from behave import register_type
from datetime import datetime
import parse
# Custom type: date parsing
@parse.with_pattern(r"\d{4}-\d{2}-\d{2}")
def parse_date(text):
return datetime.strptime(text, "%Y-%m-%d").date()
register_type(Date=parse_date)
# Custom type: currency
@parse.with_pattern(r"\$[\d,]+\.?\d*")
def parse_currency(text):
return float(text.replace("$", "").replace(",", ""))
register_type(Currency=parse_currency)
# Usage in step definitions:
# @given('the deadline is {deadline:Date}')
# def step_deadline(context, deadline):
# print(f"Deadline: {deadline}") # datetime.date object
#
# @then('the price should be {price:Currency}')
# def step_price(context, price):
# print(f"Price: {price}") # float: 99.99
# For enums, Behave uses simple string matching:
# @given('the user has "{role}" permissions')
# def step_role(context, role):
# roles = {'admin': 'ADMIN', 'manager': 'MANAGER'}
# context.role = roles.get(role.lower(), role.upper())
Cucumber BDD
Intermediate
Custom Parameter Types & Transformers
Written by PV
© 2026 All Rights Reserved