인수 테스트란?
인수 테스트는 사용자의 요구 사항을 기반으로 시스템이 제대로 동작하는지 검증하는 과정이다.
웹 애플리케이션에서는 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를 활용하면 사용자 친화적인 방식으로 인수 테스트를 자동화할 수 있다. 이를 통해 사용자의 요구사항이 시스템에 올바르게 반영되었는지 효율적으로 검증할 수 있다.