2026.04.21(Tue)

오유찬·2026년 4월 24일

DE

목록 보기
13/16

Fixture #python


테스트를 실행하기 위해 필요한 준비물
@pytest.fixture라는 데코레이터를 사용해서 함수를 정의하면 다른 테스트 함수들이 이름을 파라미터처럼 넘겨받아 사용할 수 있다.

import pytest

@pytest.fixture
def sample_data():
	return {"name": "chan", "age": "25"}
	
def test_check_name(sample_data):
	# sample_data return 값이 자동으로 넘겨진다.
	assert sample_data['name'] == 'chan'

Fixture의 범위 (Scope)


fixture를 매번 새로 만들지, 아니면 한 번 만들어서 계속 쓸지를 결정하는 것을 scope라고 한다.
@pytest.fixture(scope="설정")

  • function (default) : 테스트 함수 실행될 때마다 매번 fixture를 새로 만든다.
  • class : 같은 클래스 안에 있는 테스트 메서드끼리 fixture를 공유한다.
  • module : 해당 .py 파일(module) 안에 있는 모든 테스트가 fixture를 한 번만 만들어 공유
  • session : 전체 테스트 세션 동안 한 번만 만든다. → DB 연결처럼 무겁고 공통적인 작업에 사용

Setup과 Teardown(yield)


테스트를 위해 만든 임시 파일들을 정리하는 키워드가 yield이다.

fixture에서 yield를 사용하면
1. yield 전까지 코드가 실행된다.(테스트 준비 : Setup)
2. 테스트 함수가 실행되는 동안 잠시 멈춰 있는다.
3. 테스트가 끝나면 yield 다음 코드부터 다시 실행된다. (뒷정리 : Teardown)

import pytest
import os

@pytest.fixture
def temp_file():
	# setup 테스트용 파일 만들기
	f = open("test.txt", "w")
	f.wrtie("hello pytest")
	f.close()
	
	yield "test.txt"   # test 함수에 파일 이름 전달하고 대기
	
	# Teardown : 테스트가 끝나면 파일 삭제
	os.remove("test.txt")
	print("\n tmp file 삭제 완료")

만약 테스트 도중에 에러가 발생해서 테스트가 실패하더라도 pytest는 yield 뒤의 뒷정리 코드를 실행해서 테스트 환경을 깨끗이 유지할 수 있다.

autouse


자동으로 사용되는 fixture,
fixture를 사용하려면 테스트 함수 인자에 fixture 이름을 적어줘야 하지만 autouse=True 설정을 하면, 이름을 적지 않아도 해당 범위 내의 모든 테스트에서 알아서 실행된다.

import pytest

@pytest.fixture(autouse=True)
def setup_log():
	print("[log] test start")
	yield
	print("[log] test finish")
	
def test_ex_1():
	# 인자에 setup_log 적지 않아도 자동 실행
	assert 1 == 1

def test_ex_2():
	assert 'a' == 'a'

사용하기 좋은 때

  • 성능 모니터링 : 모든 테스트의 시작과 종료 시간을 기록하고 싶을 때
  • 로그 기록 : 테스트마다 어떤 작업이 일어나는지 항상 남기고 싶을 때
  • 환경 초기화 : 특정 폴더 항상 비워두거나, 공통 환경 변수 설정할 때

benchmark fixture


pytest-benchmark 설치 시 제공되는 benchmark라는 fixture → 측정하고 싶은 함수를 인자로 받아서 여러 번 반복 실행한 뒤, 평균 시간을 계산해 준다.

import pytest

@pytest.fixture
def big_data():
	# test 위한 대용량 데이터 준비
	return list(range(10000, 0, -1))

def test_sort_performance(benchmark, big_data):
	# benchmark fixture가 big_data 정렬하는 시간 측정
	result = benchmark(sorted, big_data)
	
	assert result == list(range(1, 100001))

fixture를 활용해서 benchmark를 쓰는 이유

  • 데이터 준비 시간 제외 : benchmark의 핵심은 그 로직을 실행하는 시간만 재는 것이다. fixture를 쓰면 setup 시간은 측정에 포함되지 않고, benchmark() 안에 들어간 코드의 시간만 잴 수 있다.
  • 다양한 환경 테스트 : fixture의 params 옵션을 사용하면 다양한 조건에서 성능이 어떻게 변하는지(시간 복잡도)를 한 번에 테스트할 수 있다.

pytest #python #pytest

기능테스트, 유닛테스트, 통합테스트, 성능테스트(pytest-benchmark)


성능 테스트


종류

  • 부하 테스트(Load Testing) : 평상시 부하를 얼마나 잘 견디는지
  • 스트레스 테스트(Stress Testing) : 시스템의 한계치가 어디인지 확인, 시스템 터졌을 때 어떻게 복구되는지
  • 내구성 테스트(Endurance / Soak Testing) : 오랜 시간 부하 주었을 때 메모리 누수나 자원 소모 생기는지

성능 테스트 핵심 지표
1. Latency (응답 시간 / 지연 시간) : 사용자가 요청을 보내고 응답을 받을 때까지 걸리는 시간
2. Throughput (처리량) : 단위 시간당 시스템이 처리하는 요청의 양
3. Error rate (에러율) : 전체 요청 중 실패한 요청의 비율

여기서, 평균 응답 시간에 매몰되어서는 안된다. 90%의 유저는 잘 되어도 10%의 유저가 오래 걸리면 안되기 때문에 P95, P99(상위 95%, 상위 99%의 응답 시간) 같은 지표를 더 중요하게 봐야 한다.

성능 테스트 도구와 프로세스


성능 테스트 도구

  • Locust : 파이썬 기반
  • JMeter : 자바 기반, GUI 환경
  • nGrinder : 네이버에서 만듦

테스트 진행 순서(Process)
1. 목표 설정
2. 환경 구축
3. 시나리오 작성
4. 부하 실행
5. 결과 분석 및 튜닝

profile
열심히 하면 재밌다

0개의 댓글