본문으로 건너뛰기

[pydantic-ai] 로컬 테스트 성능 개선: coverage 분리와 fixture 최적화

PR 링크: pydantic/pydantic-ai#4337 상태: Merged | 변경: +10 / -9

들어가며

로컬 개발 시 테스트를 자주 실행하는데, 매번 coverage 수집이 포함되면 불필요한 오버헤드가 발생합니다. 또한 Outlines 모델 테스트에서 매 테스트마다 HuggingFace 모델을 새로 로드하는 것은 큰 비용입니다. 이 PR은 두 가지 간단한 변경으로 로컬 테스트 실행 속도를 체감 가능하게 개선합니다.

핵심 코드 분석

1. make test에서 coverage 분리

Before:

test: ## Run tests and collect coverage data
	COLUMNS=150 ... coverage run -m pytest -n auto ...
	@uv run coverage combine
	@uv run coverage report

testcov: test ## Run tests and generate an HTML coverage report
	@echo "building coverage html"
	@uv run coverage html

make test가 항상 coverage run -m pytest로 실행되어 coverage 계측 오버헤드가 있었고, testcovtest에 의존하여 중복 실행되었습니다.

After:

test: ## Run tests without coverage (fast, for local dev)
	COLUMNS=150 ... pytest -n auto ...

testcov: ## Run tests with coverage and generate an HTML report
	COLUMNS=150 ... coverage run -m pytest -n auto ...
	@uv run coverage combine
	@uv run coverage report
	@echo "building coverage html"
	@uv run coverage html

make test는 순수 pytest만 실행하여 빠르게, make testcov는 coverage와 HTML 리포트를 한번에 생성합니다.

2. Outlines 모델 fixture scope 변경

Before:

@pytest.fixture
def transformers_model() -> OutlinesModel:
    hf_model = transformers.AutoModelForCausalLM.from_pretrained(...)

After:

@pytest.fixture(scope='module')
def transformers_model() -> OutlinesModel:
    hf_model = transformers.AutoModelForCausalLM.from_pretrained(...)

transformers_model, transformers_multimodal_model, llamacpp_model 세 fixture 모두 scope='module'로 변경되어 모듈 내에서 한 번만 모델을 로드합니다.

3. xdist_group 제거

-@pytest.mark.xdist_group(name='doc_tests')
 @pytest.mark.filterwarnings(...)

doc_tests 그룹 제약이 제거되어 pytest-xdist가 더 효율적으로 작업을 분배할 수 있게 되었습니다.

왜 이게 좋은가

coverage 계측은 일반적으로 10~30%의 오버헤드를 추가합니다. 로컬 개발 루프에서 이를 제거하면 피드백 속도가 즉시 개선됩니다. HuggingFace 모델 로딩은 수 초가 걸리는 I/O 바운드 작업이므로, module-scope fixture 전환만으로도 테스트 모듈당 수 초를 절약할 수 있습니다. 작은 변경이지만 일상적인 개발자 경험(DX)에 체감 가능한 차이를 만드는 좋은 사례입니다.

정리

항목 내용
make test coverage 없이 순수 pytest 실행 (빠른 로컬 개발용)
make testcov coverage + HTML 리포트 (CI/리포트용)
fixture module-scope로 모델 로딩 횟수 감소

참고 자료

⚠️ 알림: 이 분석은 AI가 실제 코드 diff를 기반으로 작성했습니다.

댓글

관련 포스트

PR Analysis 의 다른글