본문 바로가기
카테고리 없음

파이썬으로 배우는 테스트 주도 개발의 실전 팁

by nextdoorped 2025. 3. 18.

테스트 주도 개발(TDD) 소개

테스트 주도 개발(Test-Driven Development, TDD)은 소프트웨어 개발 방법론 중 하나로, 개발자가 코드를 작성하기 전에 테스트 케이스를 먼저 작성하는 방식을 말합니다. 이 방법론은 코드 품질을 향상시키고 버그를 조기에 발견할 수 있도록 도와줍니다. 본 글에서는 파이썬을 활용한 TDD의 실습 과정을 beginner가 쉽게 이해할 수 있도록 설명하겠습니다.

TDD의 기본 원칙

  • 테스트 우선: 코드를 작성하기 전에 먼저 테스트를 작성합니다.
  • 리팩토링: 테스트가 통과한 후, 코드를 개선하는 과정을 포함합니다.
  • 작은 단위의 개발: 기능을 작은 단위로 나누어 테스트합니다.

TDD의 장점

  • 코드 품질 향상: 테스트를 통해 코드의 정확성을 높일 수 있습니다.
  • 버그 감소: 개발 초기 단계에서부터 버그를 발견할 수 있습니다.
  • 엔지니어링 효율성 증가: 코드 변경 시에도 기존 기능이 제대로 작동하는지 쉽게 확인할 수 있습니다.

파이썬에서 TDD 시작하기

파이썬은 TDD를 실행하기에 적합한 언어로, 다양한 테스트 라이브러리를 제공합니다. 본 절에서는 파이썬에서 TDD를 시작하기 위한 환경 세팅 및 유용한 도구에 대해 설명하겠습니다.

환경 세팅

테스트 주도 개발을 진행하기 위해서는 파이썬과 필요한 라이브러리들을 설치해야 합니다. 기본적으로 아래의 단계를 따라 진행합니다.

  1. 파이썬 설치: 최신 버전의 파이썬을 설치합니다.
  2. 테스트 라이브러리 설치: 대표적으로 unittestpytest 라이브러리를 사용할 수 있습니다. 터미널에서 아래의 명령어로 설치합니다.
pip install pytest

기본 테스트 케이스 작성하기

테스트 코드를 작성하기 전에, 구현할 기능을 정의합니다. 예시로, 두 숫자를 더하는 add 함수를 구현해 보겠습니다.

def add(a, b):
    return a + b

이제 위의 add 함수에 대한 테스트 케이스를 작성합니다.

import pytest

def test_add():
    assert add(1, 2) == 3
    assert add(-1, 1) == 0
    assert add(0, 0) == 0

위의 테스트 케이스는 test_add 함수를 정의하여 다양한 경우를 테스트합니다. 각 케이스는 assert 문을 사용해 실제 결과와 기대 결과를 비교합니다.

실습: 간단한 계산기 구현

다음으로, 간단한 계산기를 구현하면서 TDD를 실습해 보겠습니다. 계산기는 덧셈, 뺄셈, 곱셈, 나눗셈 기능을 제공해야 합니다.

계산기 기능 정의

  • 덧셈(add)
  • 뺄셈(subtract)
  • 곱셈(multiply)
  • 나눗셈(divide)

테스트 케이스 작성하기

위의 계산기 기능에 대해 각각의 테스트 케이스를 작성합니다.

import pytest

def add(a, b):
    return a + b

def subtract(a, b):
    return a
  • b

def multiply(a, b):
    return a * b

def divide(a, b):
    if b == 0:
        raise ValueError("Cannot divide by zero")
    return a / b

def test_calculator():
    assert add(3, 2) == 5
    assert subtract(5, 2) == 3
    assert multiply(3, 2) == 6
    assert divide(6, 2) == 3
    with pytest.raises(ValueError):
        divide(6, 0)

리팩토링 및 최적화

모든 테스트가 통과한 후, 기존 코드를 보다 효율적으로 리팩토링할 수 있습니다. 예를 들어, 중복되는 코드를 함수로 만들거나 더 간결한 방법으로 구현할 수 있습니다.

TDD를 활용한 실제 예제

이제 TDD의 개념을 바탕으로 복잡한 비즈니스 로직을 가진 기능을 구현해 보고, 이를 통해 TDD의 이점을 실감해 보겠습니다.

비즈니스 로직 정의

예로, 고객의 주문을 처리하는 시스템을 만들어보겠습니다. 고객은 상품을 주문하면, 주문을 생성하고, 총 금액을 계산합니다. 이 때, 장바구니에 상품이 없음에도 주문을 요청하는 경우에는 오류를 발생시켜야 합니다.

주문 클래스 구현하기

class Order:
    def init(self):
        self.items = []

    def add_item(self, item):
        self.items.append(item)

    def total(self):
        if len(self.items) == 0:
            raise ValueError("장바구니에 항목이 없습니다.")
        return sum(item['price'] for item in self.items)

주문 관련 테스트 케이스 작성하기

def test_order():
    order = Order()
    order.add_item({'name': '상품1', 'price': 100})
    order.add_item({'name': '상품2', 'price': 200})
    
    assert order.total() == 300
    
    order_empty = Order()
    with pytest.raises(ValueError):
        order_empty.total()

마무리

테스트 주도 개발은 소프트웨어의 품질을 높이는 유용한 방법론입니다. 파이썬을 이용하여 TDD를 적용하는 것은 시작하기에 상대적으로 간단하지만, 이후로도 다양한 기능을 테스트하고 리팩토링하는 과정이 반복됩니다. 이를 통해 개발자는 더욱 안정적이고 유지보수 가능한 코드를 작성할 수 있습니다.

이 글이 파이썬으로 TDD를 실습해보는 데 도움이 되었기를 바랍니다. 앞으로의 개발 과정에서 TDD를 적극적으로 활용하여 높은 품질의 소프트웨어를 만들어 가길 바랍니다.