PHpullh

PYTHON · 테스트

BDD (behave)

행동 주도 개발(BDD)으로 비즈니스 요구사항을 실행 가능한 테스트로 작성합니다.

테스트중급BDDbehaveGiven-When-Then행동

핵심 설명

행동 주도 개발(BDD)으로 비즈니스 요구사항을 실행 가능한 테스트로 작성합니다.

Python code

# BDD 스타일 테스트 프레임워크 시뮬레이션
class BDDTest:
    def __init__(self, feature: str):
        self.feature = feature
        self.context = {}
        print(f"Feature: {feature}")

    def scenario(self, name: str):
        print(f"\n  Scenario: {name}")
        self.context = {}
        return self

    def given(self, desc: str, action=None):
        print(f"    Given {desc}")
        if action:
            action(self.context)
        return self

    def when(self, desc: str, action=None):
        print(f"    When {desc}")
        if action:
            action(self.context)
        return self

    def then(self, desc: str, check=None):
        print(f"    Then {desc}")
        if check:
            check(self.context)
            print("      ✅ 통과")
        return self

# 테스트 대상
class Cart:
    def __init__(self):
        self.items = []
    def add(self, item, price):
        self.items.append({"item": item, "price": price})
    @property
    def total(self):
        return sum(i["price"] for i in self.items)

# BDD 테스트 실행
test = BDDTest("장바구니 기능")

(test.scenario("상품 추가")
    .given("빈 장바구니가 있다",
           lambda ctx: ctx.update({"cart": Cart()}))
    .when("노트북을 추가한다",
          lambda ctx: ctx["cart"].add("노트북", 1500000))
    .when("마우스를 추가한다",
          lambda ctx: ctx["cart"].add("마우스", 50000))
    .then("상품이 2개이다",
          lambda ctx: assert_(len(ctx["cart"].items) == 2))
    .then("총액은 1,550,000원이다",
          lambda ctx: assert_(ctx["cart"].total == 1550000)))

def assert_(condition):
    assert condition

학습 팁

실제 BDD는 pip install behave로 Gherkin 문법(.feature 파일)을 사용합니다.

주의할 점

BDD 시나리오가 구현 세부사항을 포함하면 리팩토링 시 테스트가 깨집니다. 비즈니스 관점에서 작성하세요.

자주 묻는 질문

BDD (behave)란 무엇인가요?

행동 주도 개발(BDD)으로 비즈니스 요구사항을 실행 가능한 테스트로 작성합니다.

BDD (behave) 학습 시 주의할 점은 무엇인가요?

BDD 시나리오가 구현 세부사항을 포함하면 리팩토링 시 테스트가 깨집니다. 비즈니스 관점에서 작성하세요.