테스트를 실행하기 위해 필요한 준비물
@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="설정")
.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() 안에 들어간 코드의 시간만 잴 수 있다.params 옵션을 사용하면 다양한 조건에서 성능이 어떻게 변하는지(시간 복잡도)를 한 번에 테스트할 수 있다.기능테스트, 유닛테스트, 통합테스트, 성능테스트(pytest-benchmark)
성능 테스트
종류
성능 테스트 핵심 지표
1. Latency (응답 시간 / 지연 시간) : 사용자가 요청을 보내고 응답을 받을 때까지 걸리는 시간
2. Throughput (처리량) : 단위 시간당 시스템이 처리하는 요청의 양
3. Error rate (에러율) : 전체 요청 중 실패한 요청의 비율
여기서, 평균 응답 시간에 매몰되어서는 안된다. 90%의 유저는 잘 되어도 10%의 유저가 오래 걸리면 안되기 때문에 P95, P99(상위 95%, 상위 99%의 응답 시간) 같은 지표를 더 중요하게 봐야 한다.
성능 테스트 도구와 프로세스
성능 테스트 도구
테스트 진행 순서(Process)
1. 목표 설정
2. 환경 구축
3. 시나리오 작성
4. 부하 실행
5. 결과 분석 및 튜닝