인수테스트의 개념과 Cucumber를 활용한 자동화 실습

728x90
반응형

인수 테스트란?

인수 테스트는 사용자의 요구 사항을 기반으로 시스템이 제대로 동작하는지 검증하는 과정이다.
웹 애플리케이션에서는 REST 웹 서비스의 블랙박스 테스트를 통해 이를 확인할 수 있다.
블랙박스 테스트란 내부 구현을 알지 못한 채 외부에서 입력과 출력만으로 시스템을 검증하는 테스트 방식으로, 모든 경우의 수와 경계값을 분석하는 것이 중요하다.


1. curl을 이용한 인수 테스트

기술적으로 REST 웹 서비스를 작성하면 curl 명령어를 사용하여 블랙박스 테스트를 수행할 수 있다. curl을 활용한 테스트는 간단한 HTTP 요청을 통해 시스템의 응답을 확인할 수 있다. 하지만 이 방식은 다음과 같은 단점이 있다:

  • 가독성 부족: 테스트 케이스를 파악하기 어렵다.
  • 유지보수 어려움: 테스트 변경 시 관리가 복잡해진다.

2. 사용자 대면 테스트

소프트웨어는 대부분 사용자에게 서비스를 제공하기 위해 개발된다. 따라서 인수 기준(acceptance criteria)은 사용자가 정의해야 한다. 이를 기반으로 자동화된 인수 테스트를 작성하면 다음과 같은 장점이 있다:

  • 테스트 자동화: 수작업 테스트를 줄이고 효율성을 높인다.
  • 사용자 요구사항 검증: 사용자 관점에서 기능이 올바르게 동작하는지 확인할 수 있다.

자동화 테스트 도구

  • Cucumber
  • FitNesse
  • JBehave

이 도구들은 사용자 친화적인 도메인 특화 언어(DSL)를 제공하여 비개발자도 쉽게 읽고 이해할 수 있는 테스트를 작성할 수 있게 한다.

시나리오 작성 예시

Given I have two numbers: 1 and 3  
When the calculator sums them  
Then I receive 4 as a result  

3. Cucumber를 활용한 인수 테스트 작성

Cucumber는 BDD(Behavior-Driven Development) 방식을 지원하는 테스트 도구로, 기능 사양을 시나리오 형태로 작성하고 이를 자동화할 수 있다.

1) 의존성 추가

build.gradle에 다음과 같이 Cucumber 라이브러리를 추가한다:

testImplementation("io.cucumber:cucumber-java:7.2.0")
testImplementation("io.cucumber:cucumber-junit:7.2.0")

2) Feature 파일 작성

src/test/resources/feature 디렉토리에 calculator.feature 파일을 생성하고 시나리오를 작성한다:

Feature: Calculator
  Scenario: Sum two numbers
    Given I have two numbers: 1 and 2
    When the calculator sums them
    Then I receive 3 as result

3) Step Definitions 작성

Cucumber 시나리오를 실행하기 위해 Java 바인딩을 작성한다. src/test/java/acceptance/StepDefinitions.java에 다음 코드를 추가한다:

package acceptance;

import io.cucumber.java.en.Given;
import io.cucumber.java.en.Then;
import io.cucumber.java.en.When;
import org.springframework.web.client.RestTemplate;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class StepDefinitions {

    private String server = System.getProperty("calculator.url");
    private RestTemplate restTemplate = new RestTemplate();
    private String a;
    private String b;
    private String result;

    @Given("^I have two numbers: (.*) and (.*)$")
    public void i_have_two_numbers(String a, String b) {
        this.a = a;
        this.b = b;
    }

    @When("^the calculator sums them$")
    public void the_calculator_sums_them() {
        String url = String.format("%s?num1=%s&num2=%s", server, a, b);
        result = restTemplate.getForObject(url, String.class);
    }

    @Then("^I receive (.*) as a result$")
    public void i_receive_as_a_result(String expectedResult) {
        assertEquals(expectedResult, result);
    }
}

4) Gradle 테스트 설정

build.gradle 파일에 다음 테스트 태스크를 추가한다:

tasks.register('acceptanceTest', Test) {
    include '**/acceptance/**'
    systemProperties System.getProperties()
}

test {
    exclude '**/acceptance/**'
}

5) JUnit 테스트 러너 추가

JUnit 기반의 Cucumber 테스트 러너를 src/test/java/acceptance/AcceptanceTest.java에 작성한다:

package acceptance;

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

@RunWith(Cucumber.class)
@CucumberOptions(features = "classpath:feature")
public class AcceptanceTest {
}

6) 테스트 실행

테스트는 다음 명령어로 실행할 수 있다:

./gradlew acceptanceTest -Dcalculator.url=http://54.180.146.200:8765

 


Cucumber를 활용하면 사용자 친화적인 방식으로 인수 테스트를 자동화할 수 있다. 이를 통해 사용자의 요구사항이 시스템에 올바르게 반영되었는지 효율적으로 검증할 수 있다.

728x90
반응형