일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- spring data jpa
- kotlin
- JVM
- python
- 자바암호
- jpa
- 리눅스
- 유닉스
- GPT-4's answer
- 코틀린
- 파이썬
- 고전역학
- 데이터베이스
- NIO
- write by GPT-4
- 역학
- write by chatGPT
- Java
- 자바네트워크
- flet
- spring integration
- oracle
- android
- Database
- 웹 크롤링
- chatGPT's answer
- 시스템
- 자바
- 소프트웨어공학
- 인프라
- Today
- Total
Akashic Records
13.1 단위 테스트와 테스트 주도 개발(TDD) 본문
파이썬 단위 테스트(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. 실패하는 테스트 작성:
# 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는 개발 초기에 시간이 더 소요되지만, 장기적으로 유지 보수와 디버깅 시간을 절약할 수 있습니다.
'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 |