한줄 요약:
버그를 미리 잡고, 코드의 안정성을 높이기 위해 단위 테스트와 테스트 자동화를 배우자!
👉 unittest와 pytest로 테스트 코드 작성, 실행 및 자동화 방법을 익히자.
1. 목표
- **단위 테스트(unittest)**로 코드 검증하기
- pytest로 간편한 테스트 작성 및 실행
- 테스트 자동화로 지속적인 코드 검증 환경 만들기
2. unittest 기본 사용법
1️⃣ unittest 모듈 소개
unittest는 파이썬 내장 테스트 프레임워크로, 단위 테스트를 작성하고 자동으로 실행할 수 있게 해줍니다.
테스트 케이스를 작성할 때 주로 사용하는 TestCase 클래스가 제공됩니다.
2️⃣ unittest 테스트 코드 작성
예시: 간단한 계산기 테스트
import unittest
# 테스트할 코드
def add(a, b):
return a + b
def subtract(a, b):
return a - b
# 테스트 클래스
class TestCalculator(unittest.TestCase):
def test_add(self):
self.assertEqual(add(2, 3), 5)
self.assertEqual(add(-1, 1), 0)
self.assertEqual(add(-2, -3), -5)
def test_subtract(self):
self.assertEqual(subtract(5, 3), 2)
self.assertEqual(subtract(2, 5), -3)
if __name__ == "__main__":
unittest.main()
설명:
assertEqual(a, b)는 a와 b가 같으면 테스트 통과, 그렇지 않으면 실패하도록 합니다.- 각 테스트 함수는
test_로 시작해야unittest가 인식합니다.
3️⃣ unittest 실행
테스트 파일이 test_calculator.py라는 이름일 경우, 터미널에서 아래와 같이 실행할 수 있습니다:
python -m unittest test_calculator.py
또는 디렉토리 내 모든 테스트를 실행하려면:
python -m unittest discover
3. pytest 사용법
1️⃣ pytest 설치
pip install pytest
pytest는 unittest보다 간결하고 강력한 기능을 제공하는 테스트 프레임워크입니다.
assert 구문을 그대로 사용하고, 훨씬 적은 코드로 테스트를 작성할 수 있습니다.
2️⃣ pytest 테스트 코드 작성
예시: 간단한 계산기 테스트
# 테스트할 코드
def add(a, b):
return a + b
def subtract(a, b):
return a - b
# pytest 테스트 함수
def test_add():
assert add(2, 3) == 5
assert add(-1, 1) == 0
assert add(-2, -3) == -5
def test_subtract():
assert subtract(5, 3) == 2
assert subtract(2, 5) == -3
설명:
pytest에서는assert문만 사용하여 값을 비교합니다.- 테스트 함수는
test_로 시작해야 합니다.
3️⃣ pytest 실행
테스트 파일이 test_calculator.py일 경우, 아래 명령어로 실행합니다:
pytest test_calculator.py
디렉토리 내 모든 테스트를 실행하려면:
pytest
pytest는 테스트 결과를 더 잘 읽을 수 있도록 출력합니다.
4. 테스트 자동화 및 CI/CD
테스트를 자동화하여 코드를 푸시할 때마다 자동으로 실행되게 만들 수 있습니다.
이를 위해 CI/CD 툴을 사용합니다.
1️⃣ GitHub Actions를 이용한 테스트 자동화
GitHub에서 제공하는 Actions를 사용하면, 코드가 푸시될 때마다 자동으로 테스트가 실행됩니다.
예시: .github/workflows/test.yml 파일
name: Python package
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: 3.9
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Run tests
run: |
pytest
설명:
push나pull_request가 발생할 때마다 GitHub Actions가 자동으로 실행되어, pytest를 실행하고 결과를 GitHub에서 확인할 수 있습니다.
5. 테스트 커버리지
테스트 커버리지는 얼마나 많은 코드가 테스트되고 있는지를 보여주는 지표입니다. pytest와 coverage를 이용하여 테스트 커버리지를 확인할 수 있습니다.
1️⃣ coverage 설치
pip install coverage
2️⃣ coverage 실행
coverage run -m pytest
coverage report
또는 HTML 보고서를 생성하려면:
coverage html
6. 자주 묻는 질문(FAQ)
Q. pytest와 unittest 차이가 무엇인가요?
A. pytest는 unittest보다 더 간결하고, 추가적인 기능(예: fixture, 파라미터화 등)을 제공하여 테스트 작성이 더 유연합니다. pytest는 unittest와 호환되어 둘을 함께 사용할 수 있습니다.
Q. assert 구문을 왜 사용하나요?
A. assert는 테스트가 통과하면 아무 일도 일어나지 않으며, 실패하면 바로 오류 메시지를 출력합니다. 예외 처리 없이 직관적으로 비교할 수 있습니다.
Q. 테스트가 실패할 때 더 많은 정보를 보고 싶어요.
A. pytest에서는 -v 옵션을 추가하여 실행하면, 테스트 이름과 결과가 자세히 출력됩니다. 예:
pytest -v
Q. 코드 수정 후에 바로 테스트할 수 있나요?
A. pytest --watch 또는 pytest --maxfail=1 --disable-warnings로 자동화하면 코드를 수정할 때마다 테스트가 자동으로 실행됩니다.
7. 최종 점검 체크리스트
- 단위 테스트 작성 및 실행 방법을 이해했다.
- pytest와 unittest의 차이를 이해하고, 장점을 비교할 수 있다.
- CI/CD 도구(GitHub Actions 등)를 사용해 테스트 자동화 설정했다.
- 테스트 커버리지를 확인하고, 부족한 부분을 채우기 위한 방법을 알고 있다.
8. 요약 한 줄
unittest와 pytest를 사용해 파이썬 테스트 자동화 환경을 구축하고, CI/CD를 활용하여 코드 안정성을 높이자! ✅
이전 강좌 👈 [도구/환경#4] Docker로 파이썬 개발 환경 컨테이너화
다음 강좌 👉 [도구/환경#6] 파이썬 성능 최적화 (속도 개선 팁)