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를 사용하여 스텝 인수 변환을 지원하면 사용자 정의 데이터 유형을 테스트 시나리오에 적용할 수 있어 테스트 코드의 가독성과 재사용성을 높일 수 있습니다. 스텝 인수 변환을 통해, 다양한 형태의 데이터를 테스트에 사용할 수 있으며, 더 효과적인 테스트 시나리오를 작성할 수 있습니다.
참고 자료
- Cucumber 공식 문서: https://cucumber.io/docs/cucumber/step-definitions/#transform
- Cucumber JVM 공식 문서: https://github.com/cucumber/cucumber-jvm