[전통적인 방법론] 폭포수(Waterfall) 모델 - 5. 4단계 – 테스트 (Testing) (2. 단위 테스트 (Unit Testing))

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) 같은 테스트 프레임워크를 활용하여 자동화 가능
📌 테스트 코드 작성을 통해 코드 변경 시 예상치 못한 오류를 방지하고 유지보수성을 향상할 수 있음 🚀