2025. 3. 12. 15:48ㆍ개발/개발 방법론
2. 단위 테스트 (Unit Testing)
1️⃣ 단위 테스트(Unit Testing) 개요
📌 단위 테스트란?
✅ 소프트웨어의 개별 모듈, 함수, 클래스가 정상적으로 동작하는지 검증하는 테스트
✅ 코드의 작은 단위를 독립적으로 실행하여 기능이 예상대로 동작하는지 확인
✅ 일반적으로 자동화 테스트 프레임워크(JUnit, pytest, Mocha 등)를 활용하여 수행
📌 단위 테스트의 특징
✅ 독립적인 테스트 수행 – 하나의 테스트가 실패해도 다른 테스트에는 영향을 주지 않음
✅ 빠른 피드백 제공 – 코드 변경 시 즉각적인 검증 가능
✅ 디버깅 및 유지보수 용이 – 오류 발생 시 원인을 쉽게 파악할 수 있음
📌 단위 테스트가 필요한 이유
✅ 버그를 조기에 발견하여 개발 비용 절감
✅ 코드 변경 시 기존 기능이 정상적으로 동작하는지 보장
✅ 반복적인 테스트를 자동화하여 생산성을 향상
2️⃣ 단위 테스트 프레임워크 소개
🔹 JUnit (Java)
📌 JUnit 개요
✅ Java에서 가장 널리 사용되는 단위 테스트 프레임워크
✅ 간결한 문법과 어노테이션(@Test, @Before, @After 등)을 활용한 테스트 환경 제공
✅ Spring Boot, Android 개발에서도 필수적으로 사용
📌 JUnit 기본 테스트 코드 예제
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;
public class MathTest {
@Test
public void testAddition() {
int result = Math.addExact(2, 3);
assertEquals(5, result);
}
}
✅ @Test 어노테이션을 사용하여 테스트 메서드 실행
📌 JUnit 주요 어노테이션
어노테이션 | 설명 |
@Test | 테스트 메서드 정의 |
@BeforeEach | 각 테스트 실행 전 초기 설정 수행 |
@AfterEach | 각 테스트 실행 후 정리 작업 수행 |
@BeforeAll | 모든 테스트 실행 전 초기화 작업 |
@AfterAll | 모든 테스트 실행 후 정리 작업 |
🔹 pytest (Python)
📌 pytest 개요
✅ Python에서 가장 널리 사용되는 단위 테스트 프레임워크
✅ 코드가 간결하고 직관적인 문법 제공
✅ assert 문을 사용하여 기본적인 테스트를 쉽게 작성 가능
📌 pytest 기본 테스트 코드 예제
import pytest
def add_numbers(a, b):
return a + b
def test_add_numbers():
assert add_numbers(2, 3) == 5
✅ pytest는 assert 문을 사용하여 간결한 테스트 코드 작성 가능
📌 pytest 실행 방법
pytest test_math.py # 단위 테스트 실행
pytest --maxfail=2 # 최대 2개의 실패까지 실행 후 중단
pytest -v # 자세한 테스트 결과 출력
📌 pytest 주요 기능 ✅ 함수 단위 테스트 지원 (클래스 없이도 테스트 가능)
✅ 테스트 결과를 명확하게 출력
✅ fixture 기능을 제공하여 반복적인 설정을 자동화
📌 pytest의 fixture 기능 활용 예제
import pytest
@pytest.fixture
def sample_data():
return {"name": "Alice", "age": 30}
def test_sample_data(sample_data):
assert sample_data["name"] == "Alice"
assert sample_data["age"] == 30
✅ @pytest.fixture를 사용하여 테스트 데이터를 미리 설정 가능
🔹 Mocha (JavaScript)
📌 Mocha 개요
✅ JavaScript(Node.js) 환경에서 사용되는 테스트 프레임워크
✅ 비동기 코드 테스트 지원
✅ Chai와 같은 Assertion 라이브러리와 함께 사용
📌 Mocha 기본 테스트 코드 예제
const assert = require('chai').assert;
function addNumbers(a, b) {
return a + b;
}
describe('Math Functions', function() {
it('should return 5 when adding 2 and 3', function() {
assert.equal(addNumbers(2, 3), 5);
});
});
✅ describe()와 it() 블록을 사용하여 테스트 그룹화 가능
📌 Mocha 실행 방법
mocha test.js --reporter spec
3️⃣ 실습: 간단한 테스트 코드 작성
🔹 요구사항
📌 숫자의 절대값을 반환하는 함수의 단위 테스트를 작성
✅ 입력값이 양수이면 그대로 반환해야 함
✅ 입력값이 음수이면 양수로 변환하여 반환해야 함
✅ 입력값이 0이면 0을 반환해야 함
📌 Python (pytest)로 구현
def absolute_value(n):
return abs(n)
def test_absolute_value():
assert absolute_value(5) == 5
assert absolute_value(-5) == 5
assert absolute_value(0) == 0
✅ pytest를 실행하여 함수가 정상 동작하는지 검증 가능
📌 Java (JUnit)로 구현
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;
public class MathTest {
public static int absoluteValue(int n) {
return Math.abs(n);
}
@Test
public void testAbsoluteValue() {
assertEquals(5, absoluteValue(5));
assertEquals(5, absoluteValue(-5));
assertEquals(0, absoluteValue(0));
}
}
✅ JUnit을 실행하여 절대값 함수가 예상대로 동작하는지 검증 가능
📌 JavaScript (Mocha + Chai)로 구현
const assert = require('chai').assert;
function absoluteValue(n) {
return Math.abs(n);
}
describe('Absolute Value Function', function() {
it('should return absolute value', function() {
assert.equal(absoluteValue(5), 5);
assert.equal(absoluteValue(-5), 5);
assert.equal(absoluteValue(0), 0);
});
});
✅ Mocha를 실행하여 절대값 함수가 정상적으로 동작하는지 확인 가능
📌 결론
📌 단위 테스트는 개별 모듈이 올바르게 동작하는지 확인하는 중요한 과정
📌 JUnit(Java), pytest(Python), Mocha(Node.js) 같은 테스트 프레임워크를 활용하여 자동화 가능
📌 테스트 코드 작성을 통해 코드 변경 시 예상치 못한 오류를 방지하고 유지보수성을 향상할 수 있음 🚀