[pytest] pytest와 mock

최승언·2024년 11월 28일
0

pytest

목록 보기
1/2
post-thumbnail

pytest란?

pytest는 Python의 단위 테스트 및 통합 테스트를 작성하기 위한 인기 있는 라이브러리입니다. 다양한 기능을 제공하며, 그 중 가장 중요한 기능은 테스트를 자동으로 발견하고 실행하며, 테스트 결과를 쉽게 보고할 수 있는 기능입니다.

주요 기능:

  • 자동화된 테스트 발견: pytest는 test_로 시작하는 함수나 클래스 이름을 자동으로 찾아 실행합니다.
  • 간결한 코드: pytest는 테스트 함수나 클래스에서 assert 문을 사용하여 기대한 값과 실제 값을 비교하는 방식으로 동작합니다.
  • 플러그인 시스템: 다양한 플러그인을 통해 기능 확장이 가능합니다.
  • 고급 기능: 매개변수화된 테스트, fixture 등을 제공하여 복잡한 테스트도 쉽게 작성할 수 있습니다.

mock이란?

mock은 테스트 코드에서 외부 종속성(예: 데이터베이스, API 호출, 파일 시스템 등)을 가짜 객체로 대체하는 라이브러리입니다. unittest.mock 모듈이 Python 3.3 이상에 내장되어 있으며, pytest와 함께 사용할 수 있습니다.

주요 기능:

  • 함수나 객체의 동작을 가짜로 만들어 테스트: 실제 함수나 객체를 호출하지 않고 가짜 동작을 정의합니다.
  • 응답 값을 정의: 외부 서비스의 응답을 미리 정의하여 테스트 환경을 제어할 수 있습니다.

예제 코드

  1. pytest 기본 사용 예제
    간단한 계산기 클래스를 테스트하는 예제입니다.
# calculator.py
class Calculator:
    def add(self, a, b):
        return a + b
    
    def subtract(self, a, b):
        return a - b

이제 이 클래스를 테스트하는 pytest 코드를 작성해 보겠습니다.

# test_calculator.py
from calculator import Calculator

def test_add():
    calc = Calculator()
    result = calc.add(2, 3)
    assert result == 5  # 기대값 5와 실제값 result 비교

def test_subtract():
    calc = Calculator()
    result = calc.subtract(5, 3)
    assert result == 2  # 기대값 2와 실제값 result 비교

위 코드를 pytest로 실행하면 test_add와 test_subtract 함수가 자동으로 테스트되고, 테스트 결과가 출력됩니다.

  1. mock 사용 예제
    이번에는 외부 API 호출을 가짜로 만들어서 테스트하는 예제를 살펴보겠습니다.
# external_api.py
import requests

def fetch_data(url):
    response = requests.get(url)
    return response.json()  # JSON 응답을 반환한다고 가정

이제 fetch_data 함수의 requests.get 호출을 mock 처리하여 테스트할 수 있습니다.

# test_external_api.py
from external_api import fetch_data
import pytest
from unittest import mock

def test_fetch_data():
    # mock 객체를 만들어서 requests.get을 대체
    mock_response = mock.Mock()
    mock_response.json.return_value = {"key": "value"}
    
    with mock.patch('requests.get', return_value=mock_response):
        result = fetch_data("http://example.com")
    
    # mock 응답 데이터가 반환되는지 확인
    assert result == {"key": "value"}

코드 설명:

  • fetch_data 함수는 외부 API인 requests.get을 호출합니다. 이를 테스트할 때 실제 API를 호출하지 않고, mock.patch를 사용하여 requests.get을 가짜로 대체합니다.
  • mock.Mock()을 사용하여 가짜 응답 객체를 만들고, json.return_value를 설정하여 json() 메서드가 반환하는 값을 정의합니다.
  • mock.patch를 사용하여 requests.get을 mock_response로 대체합니다. 이제 fetch_data 함수가 호출되면 실제 HTTP 요청을 보내지 않고 mock_response의 값을 반환하게 됩니다.
  • 테스트는 assert result == {"key": "value"}를 사용하여 실제 반환 값이 예상한 값과 일치하는지 확인합니다.

pytest와 mock을 함께 사용할 때의 장점:

  • 외부 종속성 격리: 실제 API 호출이나 DB 연결 없이 테스트할 수 있습니다.
  • 효율적인 테스트 실행: 네트워크나 파일 시스템을 포함한 외부 자원을 호출하지 않으므로 테스트가 훨씬 빨리 실행됩니다.
  • 예측 가능한 테스트 환경: 가짜 데이터를 사용하므로 테스트 결과가 항상 예측 가능합니다.

실행 방법:

위의 코드를 테스트하려면 터미널에서 pytest 명령어를 사용하여 실행합니다.

pytest test_calculator.py
pytest test_external_api.py

이렇게 pytest와 mock을 활용하여 효율적이고 신뢰성 있는 테스트를 작성할 수 있습니다.

profile
작업하다가 막힌부분을 기록하는 곳.

0개의 댓글