본문 바로가기
🎪 놀고있네/Python

[Python] PyTest - parametrize 사용해보기 2

by 냥장판 2024. 5. 4.
반응형

이전 게시글에서 parametrize 데코레이터를 사용했었는데, 이번에는 conftest 라는 파일과 함꼐 사용해볼 예정이다.

2024.04.30 - [🎪 놀고있네/Python] - [Python] PyTest - parametrize 사용해보기

 

conftest 가 뭐냐??

  • conftest.py 파일은 pytest에서 사용되는 특별한 파일
  • 이 파일은 pytest가 테스트를 수행할 때 특정 디렉토리에 있는 테스트 모듈들에 대한 공통 설정 및 리소스를 제공하는 데 사용
  • 일반적으로 conftest.py 파일에 fixtures 를 정의해서 테스트간 공통으로 리소스 공유

한번 사용해 보자!

 

아래와 같은 코드가 있다.

import pytest

# 테스트할 함수
def add(a, b):
    return a + b

# Parameterizing을 사용하여 여러 입력 값에 대한 테스트 작성
@pytest.mark.parametrize("a, b, result", [
    (3, 2, 3),      # a=3, b=2일 때는 5이 나와야 함
    (30, 5, 8),      # a=30, b=5일 때는 35이 나와야 함
    (-2, -83, -5),   # a=-2, b=-83일 때는 -85가 나와야 함
    (0, 0.1, 0),      # a=0, b=0.1일 때는 0.1이 나와야 함
])
def test_add(a, b, result):
    assert add(a, b) == result

 

여기서 공통으로 사용될 함수와 리소스를 conftest 로 넣고, test_example 파일에는 테스트 케이스만 넣는다

 

공통으로 사용되는 함수는 test_add 이고 request 객체를 사용해서 conftest 파일로 처리한다.

request 를 사용하는 이유는 파라미터화된 테스트에서 다양한 값을 처리할 수 있고, request.param 을 사용해서 동적으로 파라미터 값을 가져올 수 있기때문에 사용했다.

 

# conftest.py

import pytest

# 기존 parametrize 에서 사용했던 "a, b, result" 의 파라미터 값
@pytest.fixture(params=[
    (3, 2, 3),      # a=3, b=2일 때는 5이 나와야 함
    (30, 5, 8),      # a=30, b=5일 때는 35이 나와야 함
    (-2, -83, -5),   # a=-2, b=-83일 때는 -85가 나와야 함
    (0, 0.1, 0),      # a=0, b=0.1일 때는 0.1이 나와야 함
])
def test_add(request):
    return request.param

 

이전에는 parametrize 를 사용했다면 이번에는 fixture(param) 을 사용했는데, 둘의 차이점은 아래와 같으니 참고

  1. @pytest.mark.parametrize:
    • @pytest.mark.parametrize는 특정 테스트 함수에 대한 파라미터화된 값을 지정합니다.
    • 해당 테스트 함수에 대해 다양한 입력 값들을 제공하여 여러 번 실행될 수 있도록 합니다.
    • 파라미터화된 값은 테스트 함수의 매개변수로 전달됩니다.
  1. @pytest.fixture(params=...):
    • @pytest.fixture(params=...)는 fixture를 파라미터화하여 여러 개의 테스트 케이스에 대해 동적으로 값을 생성하거나 조작할 수 있도록 합니다.
    • 각 테스트 함수에서 해당 fixture를 사용할 때마다 파라미터화된 값 중 하나가 선택됩니다.
    • 선택된 파라미터 값은 해당 fixture 함수 내에서 사용됩니다.

 

그럼 이를 테스트할 테스트 파일은 아래와 같고

conftest 에서 사용한 fixture 의 test_add를 직접 매개변수로 사용했다.

#test_example.py

import pytest

# 테스트할 함수
def add(a, b):
    return a + b

def test_case(test_add):  # test_add fixture를 직접 매개변수로 사용
    a, b, expected = test_add
    assert add(a, b) == expected

 

실행결과

 

 

 

conftest.py 로 공통으로 사용할 메서드를 분리하면 편리하게 중복코드를 사용할 수 있다

반응형

댓글