본문 바로가기

Study Information Technology

자동화 테스트 프레임워크 만들기 pytest로 소프트웨어 품질 보장하기

728x90
반응형

자동화 테스트 프레임워크 만들기: 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를 사용한 자동화 테스트 프레임워크는 소프트웨어 개발에서 품질 보증과 회귀 테스트를 효율적으로 수행하는 데 매우 유용합니다. 간단한 설정으로 시작하여 고급 기능을 활용하면 복잡한 테스트도 체계적으로 관리할 수 있습니다. 위에서 설명한 내용을 바탕으로 자신만의 자동화 테스트 환경을 구축해보시길 권장합니다.

참고 문서

728x90
반응형