[java] Java Cucumber에서 스텝 인수 변환하기

Cucumber는 BDD (Behavior Driven Development) 도구로서, 개발자와 비개발자가 함께 협업하여 테스트 시나리오를 작성하고 실행할 수 있도록 돕는 도구입니다. Cucumber를 사용하여 스텝 인수 변환을 수행하면 사용자 정의 데이터 유형을 정의하고, 해당 데이터 유형을 테스트 시나리오에 적용할 수 있습니다.

스텝 인수 변환이란?

Cucumber에서는 테스트 스텝에 인수를 전달할 수 있습니다. 이 때 인수는 스텝 메서드의 인자로 사용됩니다. 하지만 Cucumber는 기본적으로 문자열 형태의 인수만 지원하는데, 이를 사용자 정의 데이터 유형으로 변환하여 사용할 수 있습니다. 예를 들어, “USD 10”과 같은 문자열을 Money 객체로 변환하고 싶다면, 스텝 인수 변환을 사용할 수 있습니다.

스텝 인수 변환 정의하기

Cucumber에서 스텝 인수 변환을 정의하기 위해서는 @Transform 어노테이션을 사용합니다. 이 어노테이션을 이용하여 변환을 정의하는 클래스를 생성한 뒤, 변환 메서드를 작성해야 합니다. 변환 메서드는 해당 데이터 유형으로 변환할 수 있는 문자열 값을 받아 해당 데이터 유형의 객체를 반환해야 합니다.

import io.cucumber.java.Transform;
import io.cucumber.java.en.Given;
import io.cucumber.java.en.Then;

public class StepDefinitions {

    @Given("I have {money} in my wallet")
    public void iHaveMoneyInMyWallet(@Transform(MoneyTransformer.class) Money money) {
        // money 객체를 사용하여 테스트 로직을 작성합니다.
    }

    @Then("I should have {money} left in my wallet")
    public void iShouldHaveMoneyLeftInMyWallet(@Transform(MoneyTransformer.class) Money money) {
        // money 객체를 사용하여 테스트 로직을 작성합니다.
    }
}

위의 예시에서 @Transform(MoneyTransformer.class) 어노테이션은 MoneyTransformer 클래스의 변환 로직을 적용한다는 의미입니다. MoneyTransformer 클래스는 실제로 “USD 10”을 Money 객체로 변환해주는 로직을 정의해야 합니다.

public class MoneyTransformer implements TypeTransformer<Money> {

    @Override
    public Money transform(String value) {
        // 문자열을 Money 객체로 변환하는 로직을 작성합니다.
        // 예를 들어, "USD 10"을 Money 객체로 변환하는 로직을 작성합니다.

        return new Money(value); // 변환된 Money 객체를 반환합니다.
    }
}

변환 로직을 작성한 MoneyTransformer 클래스는 TypeTransformer 인터페이스를 구현해야 합니다. TypeTransformer 인터페이스는 단일 메서드 transform을 가지고 있으며, 해당 메서드에서 문자열 값을 받아 변환된 객체를 반환합니다.

결론

Cucumber를 사용하여 스텝 인수 변환을 지원하면 사용자 정의 데이터 유형을 테스트 시나리오에 적용할 수 있어 테스트 코드의 가독성과 재사용성을 높일 수 있습니다. 스텝 인수 변환을 통해, 다양한 형태의 데이터를 테스트에 사용할 수 있으며, 더 효과적인 테스트 시나리오를 작성할 수 있습니다.

참고 자료