프로그래밍 언어/python

pytest.fixture의 scope 범위

EastHoon 2025. 4. 24. 12:55

`@pytest.fixture`의 `scope`는 pytest에서 fixture의 생명주기를 정의하는 데 사용됩니다. 

`scope`는 fixture가 생성되고 파괴되는 시점을 결정하며, 다음과 같은 네 가지 종류가 있습니다:

1. function (기본값):
   - 각 테스트 함수마다 fixture가 생성되고 파괴됩니다.
   - 테스트 함수가 실행될 때마다 새로운 인스턴스를 제공합니다.
   - 예: 데이터베이스 연결을 테스트 함수마다 초기화해야 할 때 사용.

2. class:
   - 각 테스트 클래스마다 fixture가 생성되고 파괴됩니다.
   - 클래스 내의 모든 테스트 메서드가 동일한 fixture 인스턴스를 공유합니다.
   - 예: 클래스 단위로 상태를 유지해야 할 때 사용.

3. module:
   - 각 테스트 모듈마다 fixture가 생성되고 파괴됩니다.
   - 모듈 내의 모든 테스트 함수와 클래스가 동일한 fixture 인스턴스를 공유합니다.
   - 예: 모듈 단위로 설정이 필요한 경우 사용.

4. session:
   - 테스트 세션 전체에서 fixture가 한 번만 생성되고 파괴됩니다.
   - 모든 테스트가 동일한 fixture 인스턴스를 공유합니다.
   - 예: 테스트 전체에서 공통으로 사용하는 리소스(예: 데이터베이스 연결, 외부 API 클라이언트 등)를 초기화할 때 사용.

 

-->

session은 가장 상위에서 confest.py에서 DB, ES등 전제 설정 적용할 때 쓰면 되겠고,

module은 각 폴더에서 confest.py에 적어서 각 모듈별로 적용할 것 작성하면 되겠다.

 

module

`@pytest.fixture(scope="module")`는 테스트 모듈 내에서 한 번만 실행되는 픽스처를 정의할 때 사용됩니다. 예를 들어, 데이터베이스 연결을 설정하거나, 외부 API 클라이언트를 초기화하는 작업에 적합합니다. 아래는 `module` 범위의 픽스처 예시입니다:

```python
import pytest

@pytest.fixture(scope="module")
def db_connection():
    # 데이터베이스 연결 생성
    connection = create_db_connection()
    yield connection
    # 테스트가 끝난 후 연결 닫기
    connection.close()

@pytest.fixture(scope="module")
def api_client():
    # 외부 API 클라이언트 초기화
    client = APIClient(base_url="https://example.com")
    yield client
    # 테스트가 끝난 후 클라이언트 정리
    client.close()

def test_example_1(db_connection):
    # db_connection을 사용한 테스트
    assert db_connection.is_connected()

def test_example_2(api_client):
    # api_client를 사용한 테스트
    response = api_client.get("/endpoint")
    assert response.status_code == 200
```

위 예시에서 `db_connection`과 `api_client`는 테스트 모듈 내에서 한 번만 생성되고, 모든 테스트에서 재사용됩니다.

 

 

function

`function` 범위는 각 테스트 함수마다 픽스처가 새로 생성됩니다. 기본값이므로 명시적으로 설정하지 않아도 됩니다.

```python
import pytest

@pytest.fixture(scope="function")
def temp_file():
    # 각 테스트 함수마다 임시 파일 생성
    file = open("temp.txt", "w")
    yield file
    file.close()

def test_write_file(temp_file):
    temp_file.write("Hello, World!")
    temp_file.flush()

def test_read_file(temp_file):
    temp_file.write("Test Data")
    temp_file.flush()
```

위 예시에서 `temp_file`은 각 테스트 함수 호출 시마다 새로 생성됩니다.

 

반응형