Akashic Records

13.1 단위 테스트와 테스트 주도 개발(TDD) 본문

Python for Beginners

13.1 단위 테스트와 테스트 주도 개발(TDD)

Andrew's Akashic Records 2023. 4. 17. 10:38
728x90

파이썬 단위 테스트(unit testing)와 테스트 주도 개발(Test-Driven Development, TDD)은 소프트웨어 개발 과정에서 품질을 높이기 위한 중요한 기법입니다.

단위 테스트(unit testing)는 작성한 코드의 독립적인 기능들이 정상적으로 작동하는지 확인하는 테스트입니다. 파이썬에서는 unittest 라이브러리를 사용해 단위 테스트를 작성할 수 있습니다.

테스트 주도 개발(Test-Driven Development, TDD)은 코드 작성 전에 테스트 케이스를 먼저 작성하는 개발 방법론입니다. 이를 통해 설계 단계부터 오류를 줄이고, 코드 품질을 높일 수 있습니다.

예시: 간단한 계산기 함수와 그에 대한 단위 테스트를 작성해 보겠습니다.

계산기 함수 작성

# calculator.py
def add(a, b):
    return a + b

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

 

단위 테스트 작성

# test_calculator.py
import unittest
from calculator import add, subtract

class TestCalculator(unittest.TestCase):

    def test_add(self):
        self.assertEqual(add(1, 2), 3)
        self.assertEqual(add(-1, 1), 0)
        self.assertEqual(add(-1, -1), -2)

    def test_subtract(self):
        self.assertEqual(subtract(3, 2), 1)
        self.assertEqual(subtract(-1, 1), -2)
        self.assertEqual(subtract(1, -1), 2)

if __name__ == '__main__':
    unittest.main()

 

단위 테스트를 작성하면 코드가 정상적으로 작동하는지 확인할 수 있습니다. 이제 TDD를 적용해 보겠습니다.

테스트 작성

# test_calculator.py
# ...
class TestCalculator(unittest.TestCase):
    # ...
    def test_multiply(self):
        self.assertEqual(multiply(2, 3), 6)
        self.assertEqual(multiply(-1, 1), -1)
        self.assertEqual(multiply(-1, -1), 1)

테스트 실행 (실패할 것임)

$ python -m unittest test_calculator.py

 

코드 작성

# calculator.py
# ...
def multiply(a, b):
    return a * b

테스트 실행 (통과할 것임)

$ python -m unittest test_calculator.py

 

이와 같이 TDD는 테스트를 먼저 작성하고 코드를 작성하는 순서로 개발을 진행합니다. 이 방법은 코드 품질 향상과 오류 최소화에 도움이 됩니다.

 

TDD의 전형적인 개발 과정은 다음과 같습니다:

  1. 요구 사항 분석: 어떤 기능을 구현할지 명확하게 정의합니다.
  2. 실패하는 테스트 작성: 아직 구현되지 않은 기능에 대한 테스트를 작성하고 실패하는 것을 확인합니다.
  3. 기능 구현: 테스트를 통과할 수 있도록 최소한의 코드를 작성합니다.
  4. 리팩토링: 코드를 개선하고 중복을 제거하여 코드 품질을 높입니다.
  5. 반복: 모든 기능이 완료될 때까지 위 과정을 반복합니다.

예를 들어, 계산기 예제에 나눗셈 기능을 추가하려면 다음과 같은 과정을 거칩니다.

1. 요구 사항 분석: 두 숫자를 입력받아 나눗셈을 수행하는 기능을 구현합니다.

2. 실패하는 테스트 작성:

# test_calculator.py
class TestCalculator(unittest.TestCase):
    # ...
    def test_divide(self):
        self.assertEqual(divide(6, 2), 3)
        self.assertEqual(divide(-6, 2), -3)
        self.assertEqual(divide(6, -2), -3)
        self.assertEqual(divide(-6, -2), 3)
        self.assertRaises(ZeroDivisionError, divide, 6, 0)

 

3. 테스트 실행 (실패할 것임):

$ python -m unittest test_calculator.py

 

4. 기능 구현:

# calculator.py
def divide(a, b):
    if b == 0:
        raise ZeroDivisionError("division by zero")
    return a / b


5. 테스트 실행 (통과할 것임):

$ python -m unittest test_calculator.py

 

6. 리팩토링: 필요한 경우 코드를 개선하고 중복을 제거합니다. 이 예제에서는 리팩토링이 필요하지 않습니다.
7. 반복: 다른 기능이 필요한 경우 1단계부터 다시 시작합니다.

 

TDD를 통해 코드 품질을 높이고, 버그를 줄일 수 있습니다. TDD는 개발 초기에 시간이 더 소요되지만, 장기적으로 유지 보수와 디버깅 시간을 절약할 수 있습니다.

728x90

'Python for Beginners' 카테고리의 다른 글

13.3 코드 리뷰와 리팩토링  (0) 2023.04.17
13.2 통합 테스트  (0) 2023.04.17
12.4 기타 GUI 라이브러리(PyQt, Kivy 등)  (0) 2023.04.04
12.3 이벤트 처리  (0) 2023.04.04
12.2 Tkinter 위젯  (0) 2023.04.04
Comments