오예남

QA 엔지니어를 위한 테스트 자동화 python pytest 독학 본문

Pytest

QA 엔지니어를 위한 테스트 자동화 python pytest 독학

오예남 2025. 2. 1. 00:27

Pytest 소개

https://docs.pytest.org/en/stable/

 

Pytest는 Python의 강력한 테스트 프레임워크로, 코드의 품질을 유지하고 버그를 조기에 발견하는 데 도움을 줍니다.

단위 테스트(Unit Test), 기능 테스트(Functional Test), 통합 테스트(Integration Test) 등 다양한 테스트를 간결한 코드로 작성할 수 있습니다.

 

  1. 간단한 문법: 테스트 함수를 함수 기반(def test_)으로 작성하며, assert 키워드를 활용해 직관적으로 검증할 수 있습니다.
  2. 자동 테스트 탐색: test_로 시작하는 파일 및 함수명을 자동으로 탐색하여 실행합니다.
  3. 강력한 확장성: 다양한 플러그인을 활용할 수 있으며, fixtures 기능을 제공해 테스트 데이터를 효율적으로 관리할 수 있습니다.
  4. 다양한 리포팅 옵션: 테스트 결과를 상세히 출력할 수 있으며, 실패 시 디버깅을 쉽게 할 수 있습니다.
  5. CI/CD와 연동 가능: GitHub Actions, Jenkins 등과 쉽게 통합할 수 있어 자동화 테스트 환경을 구축하기에 적합합니다.

 

Python의 기본 unittest 모듈과 비교했을 때, Pytest는 더 직관적이고 사용하기 쉬우며, 강력한 기능을 제공합니다. 따라서 Python 개발자들이 가장 많이 사용하는 테스트 프레임워크 중 하나입니다.

 


Pytest 설치

Pytest는 Python 표준 라이브러리가 아니므로 pip을 사용하여 설치해야 합니다.

pip install pytest

 

설치 후 Pytest 버전을 확인하여 정상적으로 설치되었는지 확인합니다.

pytest --version

pytest 8.3.4

 

 


기본 테스트 코드 작성 및 실행

단순한 산술 연산 테스트 코드를 작성합니다.

def test_addition():
    assert 1 + 1 == 2

def test_subtraction():
    assert 5 - 3 == 2

 

 

테스트를 실행을 위해, 프로젝트 루트 디렉터리에서 다음 명령어를 입력합니다.

pytest

 

출력 예시는 아래와 같습니다.

======================================== test session starts =========================================
platform win32 -- Python 3.10.2, pytest-8.3.4, pluggy-1.5.0
rootdir: C:\Python\pytest
collected 2 items                                                                                      

test_add.py ..                                                                                  [100%]

========================================= 2 passed in 0.02s ==========================================

 

. (점) 하나는 성공한 테스트를 나타내며, 우측 하단에 진행률을 표시합니다.

2개의 산술 테스트를 진행했고, 0.02초 만에 모두 Pass하였습니다.

 

 


Pytest의 다양한 기능

(1) 테스트 실패 사례 및 디버깅

테스트가 실패할 경우, Pytest에서 력해줍니다.

def test_addition():
    assert 1 + 1 == 2

def test_subtraction():
    assert 5 - 3 == 2

def test_fail_example():
    assert 2 * 2 == 5  # 의도적으로 실패하는 코드

 

 

실행하면 다음과 같은 결과를 출력합니다.

======================================== test session starts =========================================
platform win32 -- Python 3.10.2, pytest-8.3.4, pluggy-1.5.0
rootdir: C:\Python\pytest
collected 3 items                                                                                     

test_add.py ..F                                                                                 [100%]

============================================== FAILURES ============================================== 
_________________________________________ test_fail_example __________________________________________ 

    def test_fail_example():
>       assert 2 * 2 == 5  # 의도적으로 실패하는 코드
E       assert (2 * 2) == 5

test_add.py:10: AssertionError
====================================== short test summary info ======================================= 
FAILED test_add.py::test_fail_example - assert (2 * 2) == 5
==================================== 1 failed, 2 passed in 0.12s =====================================

 

이처럼 Pytest는 단순한 assert문을 사용하여 직관적으로 실패한 테스트 결과를 표시해줍니다.

 

 

(2) Fixtures 활용

Pytest의 fixtures 기능을 활용하면 반복적인 테스트 데이터를 효율적으로 관리할 수 있습니다.

import pytest

@pytest.fixture
def sample_data():
    return {'name': 'Alice', 'age': 30}

def test_sample_data(sample_data):
    assert sample_data['name'] == 'Alice'
    assert sample_data['age'] == 30

위 코드에서 @pytest.fixture를 사용하여 sample_data() 함수를 정의하면, 테스트 함수에서 이를 매개변수로 받아 활용할 수 있습니다.

(3) 파라미터화 테스트

여러 개의 입력값을 테스트해야 할 경우, @pytest.mark.parametrize를 사용하면 반복적인 테스트를 간결하게 작성할 수 있습니다.

import pytest

@pytest.mark.parametrize("a, b, result", [(1, 2, 3), (2, 3, 5), (5, 5, 10)])
def test_addition(a, b, result):
    assert a + b == result

이제 한 번의 실행으로 여러 개의 값을 테스트할 수 있습니다.