오예남

[Python] pytest 테스트 자동화 - parametrize 매개변수화 본문

Pytest

[Python] pytest 테스트 자동화 - parametrize 매개변수화

오예남 2025. 2. 2. 22:27

 

이전 글에서는 pytest.raises 를 사용하여 테스트 케이스에서 예외처리하는 방법을 알아보았습니다.

 

 

pytest 로 예외처리하는 방법 try/except 대신 pytest.raises 사용하기

이전 글에서는 pytest를 설치하고 샘플 코드로 간단하게 실행하는 방법을 알아보았습니다.  QA 엔지니어를 위한 테스트 자동화 python pytest 독학Pytest 소개 https://docs.pytest.org/en/stable/ Pytest는 Python의

ohyenam.tistory.com

 

 

테스트 케이스를 작성하다보면

오늘은 pytest에서 테스트 케이스를 매개변수화하는 방법을 알아보겠습니다.


매개 변수화란?

매개 변수화(Parameterize)는 하나의 테스트 함수로 여러가지 테스트 케이스를 실행할 수 있게 해주는 기능입니다.

쉽게 말해서, 테스트에 필요한 여러 입력값과 예상 결과값을 미리 정해두고 이를 자동으로 테스트 해주는 방법입니다.

 

예를 들어, 계산기 앱의 곱셈 기능을 테스트할 경우 다음과 같은 케이스들을 테스트해야 합니다:

  • 일반적인 양수의 곱셈 (2 × 3 = 6)
  • 1을 곱하는 경우 (1 × 99 = 99)
  • 0을 곱하는 경우 (0 × 5 = 0)
  • 음수가 포함된 경우 (-2 × 3 = -6)
  • 소수점이 있는 경우 (2.5 × 2 = 5.0)

위 항목들을 별도의 테스트 함수로 만들면 코드가 길어지고 관리하기 어려워집니다.

def test_multiply_normal():
    assert 2 * 3 == 6

def test_multiply_with_zero():
    assert 0 * 100 == 0

def test_multiply_negative():
    assert -2 * 3 == -6

 

하지만 매개변수화를 사용하면, 하나의 테스트 함수로 이 모든 경우를 깔끔하게 처리할 수 있습니다.


Pytest 매개변수화 데코레이터 사용하기

 

pytest의 @pytest.mark.parametrize 를 사용하면 매개변수화된 여러 입력을 받는 하나의 테스트 함수를 작성할 수 있습니다.

아래는 test_cases라는 튜플과 데코레이터를 적용 샘플 코드입니다.

*데코레이터 철자는 영국식 'parametrize'를 사용합니다. (parameterize가 아닙니다.)

import pytest

# 테스트할 데이터들을 한 곳에 모아둡니다
test_cases = [
    (2, 3, 6),          # 일반적인 곱셈
    (1, 99, 99),        # 1을 곱하는 경우
    (0, 99, 0),         # 0을 곱하는 경우
    (3, -4, -12),       # 음수가 포함된 경우
    (2.5, 2, 5.0)       # 소수점이 있는 경우
]

# 하나의 함수로 모든 테스트 케이스를 처리합니다
@pytest.mark.parametrize('a, b, expected', test_cases)
def test_multiplication(a, b, expected):
    assert a * b == expected

 

parametrize 데코레이터를 통해 하나의 테스트 함수로 5개의 입력값을 모두 테스트할 수 있습니다.

아래는 테스트 결과 메세지 입니다.

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

test_add.py .....                                                                                                   [100%]

=================================================== 5 passed in 0.03s ====================================================

 

이렇게 매개변수화를 활용하면 코드 중복을 줄여 코드를 깔끔하게 관리할 수 있어, 테스트를 쉽게 관리할 수 있습니다.

그리고 테스트 케이스가 많다면 CSV나 Excel 파일로 따로 관리할 수도 있습니다. 

 

<csv 파일을 사용하여 테스트하는 방법은 아래 링크를 참고해주세요.>

 

PyTest parameterised test with csv data

In many PyTest scripts example with parameterised data such as @pytest.mark.parametrize("input1, input2, output", [(5, 5, 10), (7, 5, 12)]) def test_add(input1, input2, output): assert

stackoverflow.com

 

 

매개변수화는 테스트 코드의 중복을 줄이면서 커버리지를 높일 수 있는 강력한 도구입니다.

하지만 모든 경우에 대해 무분별하게 적용하지않고, 필요한 케이스에 대해서만 적절히 사용하는 것이 중요합니다.

(입력값으로 사용한 모든 튜플은 각각의 테스트이므로 테스트 진행시간이 늘어날 수 있음)

테스트 실행 시간과 유지보수성을 고려하여, 각 동등 분할을 대표할 수 있는 최소한의 테스트 케이스만 작성하는 것을 권장합니다.

 

 


위 내용은 Test Automation University - Pytest 강의 내용을 정리하고, 추가로 이해한 내용을 작성한 게시물임을 참고 부탁드립니다.

 

 

Chapter 4 - Parameterized Test Cases

 

testautomationu.applitools.com