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