자동화 테스트 프레임워크 만들기: pytest
로 소프트웨어 품질 보장하기
Overview
소프트웨어 개발에서 자동화 테스트는 코드 품질을 유지하고, 버그를 조기에 발견하며, 소프트웨어의 전반적인 신뢰성을 높이는 데 필수적입니다. 특히 pytest
는 파이썬 환경에서 널리 사용되는 테스트 프레임워크로, 간단한 구문과 유연한 기능 덕분에 많은 개발자들이 선호합니다. 이 글에서는 pytest
를 이용해 자동화 테스트 프레임워크를 구축하는 방법을 상세히 설명하겠습니다.
pytest
란 무엇인가?
pytest
는 파이썬용 테스트 프레임워크로, 단위 테스트 및 통합 테스트를 손쉽게 작성할 수 있도록 돕습니다. pytest
는 테스트 함수 및 메서드를 찾기 위해 간단한 이름 규칙을 사용하고, 다양한 기능을 제공하여 복잡한 테스트 케이스를 쉽게 관리할 수 있게 합니다. 주요 특징은 다음과 같습니다:
- 간단한 문법: Python 함수처럼 자연스럽게 테스트를 작성할 수 있습니다.
- 플러그인 아키텍처: 수많은 플러그인이 제공되어 필요에 맞게 기능을 확장할 수 있습니다.
- 다양한 assertion 방법: 강력한 assertion 메서드가 내장되어 있습니다.
- 유연한 테스트 실행: 테스트를 개별적으로 또는 그룹으로 실행할 수 있습니다.
기본 설치 및 설정
pytest
를 사용하기 위해서는 우선 설치해야 합니다. 다음 명령어를 터미널에 입력하여 설치합니다.
pip install pytest
설치가 완료되면, 간단한 테스트를 작성해보겠습니다. test_sample.py
라는 파일을 생성하고 아래의 내용을 입력합니다.
def test_addition():
assert 1 + 1 == 2
def test_subtraction():
assert 5 - 3 == 2
이제 터미널에서 다음 명령어를 실행하여 테스트를 실행할 수 있습니다.
pytest test_sample.py
테스트 결과는 다음과 유사하게 나타납니다:
============================= test session starts =============================
collected 2 items
test_sample.py .. [100%]
============================== 2 passed in 0.01s ==============================
테스트 구조화
테스트를 잘 구조화하는 것은 유지 보수와 가독성을 높이는 데 중요합니다. 일반적으로 테스트 파일은 tests
라는 디렉토리 아래에 두며, 테스트 함수는 test_
로 시작해야 합니다.
디렉토리 구조
아래와 같이 디렉토리를 구성할 수 있습니다:
my_project/
├── app.py
├── tests/
│ ├── __init__.py
│ └── test_app.py
app.py
에는 테스트할 기능을 구현하고, test_app.py
에는 해당 기능에 대한 테스트를 작성합니다. 예를 들어, 간단한 계산기를 구현해보겠습니다.
app.py
def add(x, y):
return x + y
def subtract(x, y):
return x - y
test_app.py
import pytest
from app import add, subtract
def test_add():
assert add(1, 2) == 3
assert add(-1, 1) == 0
assert add(0, 0) == 0
def test_subtract():
assert subtract(5, 3) == 2
assert subtract(3, 5) == -2
위와 같이 작성한 후 pytest
를 실행하면 각 테스트 함수가 올바르게 작동하는지 확인할 수 있습니다.
고급 기능
pytest
는 기본적인 테스트 외에도 다양한 고급 기능을 제공합니다. 다음은 그 중 몇 가지입니다.
Fixture
테스트에서 반복적으로 사용되는 코드를 fixture
로 만들 수 있습니다. 예를 들어, 데이터베이스 연결이나 설정 파일 등을 테스트마다 반복할 필요 없이 재사용할 수 있습니다.
import pytest
@pytest.fixture
def sample_data():
return [1, 2, 3, 4, 5]
def test_sum(sample_data):
assert sum(sample_data) == 15
이렇게 작성하면 test_sum
함수에서 sample_data
를 자동으로 인자로 받아 사용하게 됩니다.
Parametrize
여러 입력에 대해 동일한 테스트를 실행하고 싶을 때 @pytest.mark.parametrize
를 사용할 수 있습니다. 예를 들어, 다양한 입력에 대한 덧셈 테스트를 작성할 수 있습니다.
import pytest
from app import add
@pytest.mark.parametrize("x, y, expected", [
(1, 2, 3),
(2, 3, 5),
(0, 0, 0),
(-1, 1, 0),
])
def test_add_parametrized(x, y, expected):
assert add(x, y) == expected
이렇게 하면 각각의 케이스에 대해 테스트가 자동으로 실행됩니다.
에러 처리 및 예외 테스트
테스트 중 예외가 발생할 수 있는 경우, pytest.raises
를 사용하여 예상되는 예외가 발생하는지 검증할 수 있습니다.
import pytest
def divide(x, y):
if y == 0:
raise ValueError("Cannot divide by zero")
return x / y
def test_divide_by_zero():
with pytest.raises(ValueError, match="Cannot divide by zero"):
divide(10, 0)
위 코드는 divide
함수가 0으로 나누려 할 때 ValueError
를 발생시키는지를 테스트합니다.
CI/CD 통합
pytest
를 CI/CD 파이프라인에 통합하면 배포 전에 테스트를 자동으로 실행할 수 있습니다. GitHub Actions, Travis CI, Jenkins 등의 도구를 사용해 쉽게 통합할 수 있습니다. 예를 들어, GitHub Actions에서 pytest
를 실행하려면 .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 pytest
- name: Run tests
run: |
pytest
이렇게 설정하면 코드가 푸시될 때마다 자동으로 pytest
가 실행되어, 모든 테스트가 통과하는지 확인할 수 있습니다.
결론
pytest
를 사용한 자동화 테스트 프레임워크는 소프트웨어 개발에서 품질 보증과 회귀 테스트를 효율적으로 수행하는 데 매우 유용합니다. 간단한 설정으로 시작하여 고급 기능을 활용하면 복잡한 테스트도 체계적으로 관리할 수 있습니다. 위에서 설명한 내용을 바탕으로 자신만의 자동화 테스트 환경을 구축해보시길 권장합니다.
참고 문서
'Study Information Technology' 카테고리의 다른 글
사용자 친화적인 웹 앱으로 자동화 작업 예약하기 (0) | 2024.10.21 |
---|---|
Twilio를 활용한 자동 SMS 알림 시스템 개발하기 (0) | 2024.10.21 |
머신러닝 모델 자동 훈련 새로운 데이터로 예측 정확도 향상하기 (0) | 2024.10.21 |
PyAutoGUI로 반복적인 데스크톱 작업 자동화하기 (0) | 2024.10.21 |
SMTP를 이용한 이메일 자동화 및 맞춤형 이메일 템플릿 만들기 (0) | 2024.10.21 |