본문 바로가기
Develop

pytest로 이해하는 팩토리함수

by hongreat 2024. 11. 16.

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

     

    팩토리 함수의 간단한 개념과 장점


    팩토리 함수란 특정 객체나 데이터를 생성하는 역할을 하는 함수입니다.

    일반적으로 재사용 가능한 기본값을 제공하면서, 필요에 따라 동적으로 커스터마이징할 수 있도록 설계됩니다.

     

    1. 중복 제거: 제품_생성 함수 로 데이터를 생성하므로 중복 코드가 사라짐.
    2. 유지보수성 향상: 제품_생성 함수 를 수정하면 모든 테스트에 변경 사항이 반영됨.
    3. 가독성 증가: 테스트 함수가 검증 로직에 집중할 수 있게 됨.