[java] Java Cucumber 테스트 러너

Cucumber는 BDD(Behavior Driven Development) 스타일로 소프트웨어를 개발할 수 있도록 도와주는 도구입니다. Java를 기반으로 작성된 Cucumber는 Java 언어를 사용하여 테스트 시나리오를 자연어로 작성하고 실행할 수 있습니다. 이번 포스트에서는 Java Cucumber 테스트 러너를 작성하는 방법에 대해 알아보겠습니다.

1. Cucumber와 JUnit 설정

Java 프로젝트에서 Cucumber와 JUnit을 함께 사용하기 위해서는 Maven 또는 Gradle과 같은 빌드 도구를 사용하여 의존성을 추가해야 합니다. 다음은 Maven을 사용하는 경우 pom.xml 파일에 필요한 의존성을 추가하는 예시입니다.

<dependency>
    <groupId>io.cucumber</groupId>
    <artifactId>cucumber-java</artifactId>
    <version>6.9.1</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>io.cucumber</groupId>
    <artifactId>cucumber-junit</artifactId>
    <version>6.9.1</version>
    <scope>test</scope>
</dependency>

JUnit은 Cucumber 테스트 러너에서 테스트를 실행하는 데 사용됩니다. 따라서 JUnit 의존성도 추가해야 합니다.

2. 테스트 러너 작성

import io.cucumber.junit.Cucumber;
import org.junit.runner.RunWith;

@RunWith(Cucumber.class)
@CucumberOptions(
        features = "classpath:features", // Feature 파일이 위치한 경로
        plugin = {"pretty", "html:target/reports/cucumber"}, // 보고서 출력 방식 설정
        glue = "com.example.stepdefinitions" // Step Definitions 클래스가 위치한 패키지
)
public class TestRunner {
}

위의 코드는 테스트 러너 클래스의 기본 구조를 보여줍니다. @RunWith 애노테이션은 JUnit에게 Cucumber를 사용하여 테스트를 실행하도록 지시합니다. @CucumberOptions 애노테이션은 Cucumber 옵션을 설정하는 데 사용됩니다. 여기에서는 features, plugin, glue 등의 옵션을 지정합니다.

3. 테스트 시나리오 작성

Cucumber는 자연어로 작성된 테스트 시나리오를 사용하기 때문에 테스트 스텝을 작성할 때 자연어를 사용할 수 있습니다. 예를 들어 다음과 같은 Feature 파일을 작성할 수 있습니다.

Feature: 계산기 기능 테스트
  Scenario: 덧셈 테스트
    Given 계산기가 준비되어 있다
    When 2와 3을 더한다
    Then 결과는 5이다

  Scenario: 뺄셈 테스트
    Given 계산기가 준비되어 있다
    When 5에서 2를 뺀다
    Then 결과는 3이다

위의 Feature 파일에서는 계산기의 덧셈과 뺄셈 기능을 테스트하는 두 가지 시나리오를 정의하였습니다. 각각의 시나리오는 Given, When, Then으로 시작하는 스텝으로 구성되어 있습니다.

4. Step Definitions 작성

Feature 파일에 정의된 스텝을 구현하기 위해 Step Definitions 클래스를 작성해야 합니다. 아래는 Step Definitions 클래스의 예시입니다.

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

public class CalculatorStepDefinitions {
  
    @Given("계산기가 준비되어 있다")
    public void calculatorIsReady() {
        // 계산기 준비 로직 구현
    }

    @When("{int}와 {int}을 더한다")
    public void addNumbers(int num1, int num2) {
        // 덧셈 로직 구현
    }

    @When("{int}에서 {int}를 뺀다")
    public void subtractNumbers(int num1, int num2) {
        // 뺄셈 로직 구현
    }

    @Then("결과는 {int}이다")
    public void verifyResult(int expected) {
        // 결과 검증 로직 구현
    }
}

Step Definitions 클래스는 @Given, @When, @Then 등의 애노테이션을 사용하여 특정 스텝의 구현을 나타냅니다. 위의 코드에서는 각각의 스텝에 대한 구현을 작성해야 합니다.

5. 테스트 실행

이제 테스트를 실행할 준비가 모두 끝났습니다. TestRunner 클래스를 실행하여 Cucumber 테스트를 실행합니다. 실행 결과는 설정한 보고서 출력 방식에 따라 표시됩니다.

이상으로 Java Cucumber 테스트 러너 작성 방법에 대해 알아보았습니다. Cucumber를 사용하면 테스트 코드를 자연어로 작성하여 가독성과 유지보수성을 높일 수 있으며, BDD 개발 방식을 적용하여 소프트웨어 개발의 효율성을 높일 수 있습니다.

참고 자료