pytest.fixture의 scope 범위
`@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`은 각 테스트 함수 호출 시마다 새로 생성됩니다.