python으로 개발하면서 테스트관련 라이브러리를 여러가지를 사용했습니다.
그중에서 pytest 가 가진 이점이 상당히 많다고 생각하며, 데이터 셋업과 팩토리함수의 필요성을 (JS/TS로)설명하는 것을 재밌게 봤고, 최근 pytest에 대한 장문의 글을 작성 중 인데, 내용이 길어져 그 중 일부를 사이드로 기록합니다.
목차
먼저 팩토리함수를 적용하지 않은 케이스는 다음과 같습니다.
Bad Case
중복코드가 많은 경우
def test_활성_사용자():
사용자 = {
"이름": "홍길동",
"나이": 30,
"권한": "관리자",
"활성화": True,
}
assert 사용자["활성화"] is True
def test_비활성_사용자():
사용자 = {
"이름": "홍길동",
"나이": 30,
"권한": "관리자",
"활성화": False,
}
assert 사용자["활성화"] is False
def test_관리자_사용자():
사용자 = {
"이름": "홍길동",
"나이": 30,
"권한": "관리자",
"활성화": True,
}
assert 사용자["권한"] == "관리자"
- 동일한 데이터 구조를 만드는 코드가 각 테스트 함수마다 반복됩니다.
- 데이터를 수정해야 할 경우, 모든 테스트 코드를 일일이 찾아 수정해야 합니다.
- 중복된 코드 때문에 테스트 코드의 가독성이 떨어집니다.
테스트데이터 자체의 관리가 어려워지는 경우
def test_주문_총액():
제품 = {
"이름": "테스트 상품",
"가격": 100,
"재고": 10,
}
주문 = {
"제품": 제품,
"수량": 3,
"총액": 제품["가격"] * 3,
}
assert 주문["총액"] == 300
def test_재고_부족():
제품 = {
"이름": "테스트 상품",
"가격": 100,
"재고": 2, # 재고 부족 상황
}
주문 = {
"제품": 제품,
"수량": 3,
"총액": 제품["가격"] * 3,
}
assert 제품["재고"] < 주문["수량"]
- 제품과 주문을 반복적으로 작성해야 하므로 테스트 코드가 길어지고 관리가 어렵습니다.
- 데이터 수정 시 테스트 전체에서 동일한 데이터를 변경해야 하는 번거로움이 생깁니다.
- 데이터 생성 코드가 길어져, 테스트의 핵심 로직(검증 부분)이 묻히게 됩니다.
Good Case
import pytest
@pytest.fixture
def 제품_생성():
def _제품_생성(이름="테스트 상품", 가격=200, 재고=10):
return {
"이름": 이름,
"가격": 가격,
"재고": 재고,
}
return _제품_생성
def test_제품_할인(제품_생성):
제품 = 제품_생성(가격=200)
할인가격 = 제품["가격"] * 0.9 # 10% 할인
assert 할인가격 == 180
def test_제품_재고_갱신(제품_생성):
제품 = 제품_생성(재고=10)
제품["재고"] -= 1 # 재고 감소
assert 제품["재고"] == 9
팩토리 함수의 간단한 개념과 장점
팩토리 함수란 특정 객체나 데이터를 생성하는 역할을 하는 함수입니다.
일반적으로 재사용 가능한 기본값을 제공하면서, 필요에 따라 동적으로 커스터마이징할 수 있도록 설계됩니다.
- 중복 제거: 제품_생성 함수 로 데이터를 생성하므로 중복 코드가 사라짐.
- 유지보수성 향상: 제품_생성 함수 를 수정하면 모든 테스트에 변경 사항이 반영됨.
- 가독성 증가: 테스트 함수가 검증 로직에 집중할 수 있게 됨.
'Develop' 카테고리의 다른 글
shell 을 배우자 (0) | 2024.11.20 |
---|---|
데이터베이스 정규화 이해하기 (1) | 2024.11.17 |
메시징 애플리케이션의 시스템 디자인에 관한 글을 읽고 정리 (3) | 2024.11.08 |
Vercel 404 오류 해결하기 - 간단한 Rewrite 설정 (1) | 2024.10.08 |
Nextjs에서 tag cloud 사용하기 (2) | 2024.09.21 |