18장: 테스트
소프트웨어 테스트는 코드의 품질을 보장하고, 버그를 줄이며, 유지 보수성을 향상시키는 데 중요한 역할을 합니다. 파이썬에서는 다양한 테스트 프레임워크를 제공하며, 이 장에서는 `unittest`, `pytest`, 그리고 `mock` 라이브러리를 사용하여 테스트를 작성하고 실행하는 방법에 대해 알아보겠습니다.
#### 18.1 `unittest` 소개
`unittest`는 파이썬 표준 라이브러리에 포함된 기본 테스트 프레임워크입니다. 유닛 테스트는 코드의 작은 단위(예: 함수 또는 메서드)를 테스트하는 데 사용됩니다.
##### 18.1.1 기본 테스트 작성
다음은 `unittest`를 사용하여 기본적인 테스트를 작성하는 예제입니다.
```python
import unittest
# 테스트할 함수
def add(a, b):
return a + b
class TestAddFunction(unittest.TestCase):
def test_add_positive_numbers(self):
self.assertEqual(add(1, 2), 3)
def test_add_negative_numbers(self):
self.assertEqual(add(-1, -2), -3)
def test_add_zero(self):
self.assertEqual(add(0, 0), 0)
if __name__ == '__main__':
unittest.main()
```
##### 18.1.2 테스트 실행
위 코드를 `test_add.py` 파일로 저장하고, 터미널에서 다음 명령을 실행하여 테스트를 실행합니다.
```sh
python -m unittest test_add.py
```
#### 18.2 `pytest` 소개
`pytest`는 강력한 기능을 제공하는 또 다른 인기 있는 테스트 프레임워크입니다. 먼저 `pytest`를 설치해야 합니다.
```sh
pip install pytest
```
##### 18.2.1 기본 테스트 작성
다음은 `pytest`를 사용하여 기본적인 테스트를 작성하는 예제입니다.
```python
# test_add.py 파일
def add(a, b):
return a + b
def test_add_positive_numbers():
assert add(1, 2) == 3
def test_add_negative_numbers():
assert add(-1, -2) == -3
def test_add_zero():
assert add(0, 0) == 0
```
##### 18.2.2 테스트 실행
터미널에서 다음 명령을 실행하여 `pytest` 테스트를 실행합니다.
```sh
pytest test_add.py
```
#### 18.3 `mock` 라이브러리
`mock` 라이브러리는 테스트 중 외부 의존성을 모킹(mocking)하는 데 사용됩니다. 이를 통해 외부 시스템에 의존하지 않고 독립적으로 테스트할 수 있습니다.
##### 18.3.1 기본 모킹 예제
다음은 `unittest.mock`을 사용하여 기본적인 모킹 예제입니다.
```python
from unittest.mock import Mock
# 모킹할 객체
class MyClass:
def method(self):
pass
# 모킹 객체 생성
mock_obj = Mock(spec=MyClass)
mock_obj.method.return_value = "Mocked!"
# 테스트
def test_method():
assert mock_obj.method() == "Mocked!"
```
#### 18.4 통합 테스트
통합 테스트는 여러 구성 요소가 올바르게 상호작용하는지 확인하는 데 사용됩니다. 다음은 통합 테스트의 간단한 예제입니다.
```python
# calculator.py 파일
def add(a, b):
return a + b
def subtract(a, b):
return a - b
```
```python
# test_calculator.py 파일
import unittest
from calculator import add, subtract
class TestCalculator(unittest.TestCase):
def test_add(self):
self.assertEqual(add(3, 7), 10)
def test_subtract(self):
self.assertEqual(subtract(10, 5), 5)
if __name__ == '__main__':
unittest.main()
```
#### 18.5 테스트 커버리지 측정
테스트 커버리지는 코드베이스의 얼마나 많은 부분이 테스트되었는지를 측정합니다. `coverage.py` 라이브러리를 사용하여 테스트 커버리지를 측정할 수 있습니다.
##### 18.5.1 `coverage.py` 설치
먼저 `coverage.py`를 설치합니다.
```sh
pip install coverage
```
##### 18.5.2 커버리지 측정
다음 명령을 실행하여 테스트를 실행하고 커버리지를 측정합니다.
```sh
coverage run -m unittest discover
coverage report -m
```
#### 18.6 지속적 통합 (CI)
지속적 통합(CI)은 코드 변경이 발생할 때마다 자동으로 빌드와 테스트를 실행하는 방법입니다. GitHub Actions, Travis CI, CircleCI 등 다양한 CI 도구를 사용할 수 있습니다.
##### 18.6.1 GitHub Actions 설정 예제
다음은 GitHub Actions를 사용하여 파이썬 테스트를 자동화하는 예제입니다.
```yaml
# .github/workflows/python-app.yml
name: Python application
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: '3.x'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Run tests
run: |
python -m unittest discover
```
이상으로, 파이썬에서 테스트를 작성하고 실행하는 방법에 대해 알아보았습니다. 다음 장에서는 네트워크 프로그래밍에 대해 더 자세히 알아보겠습니다. 질문이나 요청사항이 있으시면 댓글로 남겨주세요!
---
이 글의 내용은 GoalKicker.com의 Python Notes for Professionals 책을 참조하였습니다.
댓글
댓글 쓰기