TDD(테스트 주도 개발)는 소프트웨어 개발 프로세스에서 테스트가 개발을 주도하는 방법론입니다. 이 접근 방식을 통해 개발자는 코드를 작성하기 전에 테스트 케이스를 먼저 작성하게 되며, 이는 더 깨끗하고 버그가 적은 코드로 이어질 수 있습니다. 여기서는 Java 프로젝트에서 TDD를 준비하는 방법을 소개합니다. Gradle을 사용하여 프로젝트를 설정하고, JUnit 5를 이용해 간단한 테스트 케이스를 작성하는 예를 들겠습니다.
1. 프로젝트 설정
Gradle 설정
Gradle은 Java 프로젝트의 빌드 및 의존성 관리를 위한 강력한 도구입니다. TDD를 위해 JUnit 5와 같은 테스트 프레임워크를 포함시키려면, build.gradle 파일에 몇 가지 설정 을 추가해야 합니다.
plugins {
id 'java'
}
sourceCompatibility = '1.8'
targetCompatibility = '1.8'
compileJava.options.encoding = 'UTF-8'
compileTestJava.options.encoding = 'UTF-8'
repositories {
mavenCentral()
}
dependencies {
testImplementation('org.junit.jupiter:junit-jupiter:5.5.0')
}
test {
useJUnitPlatform()
testLogging {
events "passed", "skipped", "failed"
}
}
이 설정에서 주목해야 할 부분은 dependencies 섹션입니다. 여기서 testImplementation('org.junit.jupiter:junit-jupiter:5.5.0') 는 JUnit 5를 테스트 의 존성으로 추가하고 있습니다. 이를 통해 TDD를 위한 테스트 환경을 구성할 수 있습니다.
2. 테스트 케이스 작성
TDD의 핵심은 개발 시작 전에 테스트 케이스를 먼저 작성하는 것입니다. 아래는 JUnit 5 를 사용한 간단한 테스트 케이스 예시입니다.
package chap01;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
public class StringTest {
@Test
void substring() {
String str = "abcde";
assertEquals("cd", str.substring(2, 4));
}
}
이 코드는 String 의 substring 메소드를 테스트합니다. 여기서 assertEquals 는 기대 하는 결과값("cd")과 실제 substring 메소드의 결과를 비교합니다. 이 테스트는 substring 메소드가 올바르게 작동하는지를 검증합니다.
3. TDD 사이클
TDD는 일반적으로 다음 세 단계로 진행됩니다:
- 실패하는 테스트 작성: 아직 구현되지 않은 기능에 대한 테스트를 먼저 작성합니다. 이 테스트는 당연히 실패할 것입니다.
- 테스트를 통과하기 위한 코드 작성: 테스트를 통과하기 위한 최소한의 코드를 작성합니다.
- 리팩토링: 코드를 개선하고 중복을 제거합니다. 이 과정에서도 모든 테스트가 통과해야 합니다.
이 사이클을 반복하면서 개발을 진행하게 되며, 이는 코드의 품질을 높이고 버그를 줄이 는 데 도움이 됩니다.
4. Calculator 예로 알아보는 TDD
TDD (Test-Driven Development) 접근 방식에 따라 코드를 작성하는 과정을 Calculator 클래스를 예로 들어 설명하겠습니다. TDD는 테스트를 먼저 작성하고, 그 테스트를 통과하는 코드를 이후에 작성하는 과정을 말합니다. 따라서, Calculator 클래스의 plus 메소드를 TDD 방식으로 개발하기 위해 다음 단계를 따릅니다.
1. 실패하는 테스트 작성
먼저, Calculator 클래스의 plus 메소드를 테스트할 테스트 케이스를 작성합니다. 이 단계에서는 Calculator 클래스가 아직 구현되지 않았거나, 메소드가 올바르게 작동하지 않는 것으로 가정합니다.
public class Calculator {
public static int plus(int a1, int a2) {
return 0;
}
}
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;
public class CalculatorTest {
@Test
public void testPlus() {
assertEquals(5, Calculator.plus(2, 3));
}
}
2. 테스트 실행과 실패 확인
작성한 테스트를 실행합니다. 이 시점에서는 Calculator 클래스 또는 plus 메소드가 정의되지 않았거나, 올바르게 구현되지 않았기 때문에 테스트가 실패합니다.
3. 테스트를 통과하기 위한 최소한의 코드 작성
테스트를 통과하기 위해 필요한 최소한의 코드를 Calculator 클래스에 구현합니다. 여기서는 plus 메소드를 간단히 구현합니다.
public class Calculator {
public static int plus(int a1, int a2) {
return a1 + a2; // 이 단계에서 실제로 메소드를 구현합니다.
}
}
4. 테스트 재실행과 통과 확인
수정한 코드로 테스트를 다시 실행합니다. 이제 plus 메소드가 올바르게 구현되었으므로 테스트가 성공해야 합니다.
5. 리팩토링
코드를 개선하고, 중복을 제거하며, 가독성을 높이는 등의 리팩토링을 수행할 수 있습니다. 이 단계에서는 필요한 경우에만 리팩토링을 진행합니다.
결론
TDD 방식으로 Calculator 클래스의 plus 메소드를 개발하는 과정은 테스트를 먼저 작성하고, 해당 테스트를 통과하는 실제 코드를 작성한 후, 필요에 따라 코드를 개선하는 순서로 이루어집니다. 이 방법은 개발 초기 단계에서 오류를 발견하고, 더 안정적이며 유지보수가 용이한 코드를 작성하는 데 도움이 됩니다.
'개념정리(JAVA)' 카테고리의 다른 글
| 자바 예약어 정리 (1) | 2024.03.28 |
|---|---|
| JUnit에 관하여 (0) | 2024.03.28 |
| 이진검색 (2) | 2024.03.27 |
| 검색 알고리즘 (0) | 2024.03.27 |
| 클래스 (0) | 2024.03.27 |