심영이 고자가 되는 시나리오를 Cucumber로 증명해보자(?)

3
post-thumbnail

Cucumber가 뭔데?

cucumber란 오이입니다.
큐컴버(kyoo·kuhm·br) 라고 읽습니다.

큐컴버배치

BDD(Behavior-Driven Development) 의 대표적인 도구인데,
Cucumber를 이용해 테스트 할 수 있도록
왠만한 언어들엔 프레임워크가 준비되어 있습니다.
https://cucumber.io/docs/installation

일단 어찌 쓰는지 대략적으로 보여드리자면,
(요즘 회사에서 파이썬 써서 예제가 파이썬입니다)

Feature: 야인시대 64화

  Scenario: 심영이 중앙극장에서 연설할 때
            상하이 조가 있으면 고자가 된다

    Given 장소: "중앙극장"
      And 등장인물: "심영"
      And 등장인물: "상하이 조"
     When "심영"이 "연설"을 하면
     Then "심영"은 고자가 된다

    Given 장소: "중앙극장"
      And 등장인물: "심영"
      And 등장인물: "김두한"
     When "심영"이 "연설"을 하면
     Then "심영"은 고자가 되지 않는다

      ...
      ...

from behave import *

@given('장소: "중앙극장"')
def 장소_중앙극장(context):
    context.장소 = 장소('중앙극장')

@given('등장인물: "심영"')
def 등장인물_심영(context):
    context.심영 = new_등장인물('심영')
    context.심영.들어가다(context.장소)

# ...(중략)...

@then('심영은 고자가 된다')
def 심영은_고자가_된다(context):
    assert context.심영.성기능 is False

# ...(중략)...

이렇게 심영이 고자가 되는 경우의 수를 나열해서
꼭 상하이 조가 있어야만 심영이 고자가 된다는걸 증명하면(?) 됩니다.

하지만 위의 경우의 수를 일일이 나열하기엔 너무 경우의 수가 많아서
일일이 다 쓰기엔 너무 많고 힘듭니다.

그래서 Cucumber에서는 Gerkin 이라는 문법을 이용해서
경우의 수를 테이블로 정리해서 사용할 수 있도록 제공하지요.

Feature: 야인시대 64화

  Scenario Outline: 심영이 중앙극장에서 연설할 때
                    상하이 조가 있으면 고자가 된다

    Given 장소: "중앙극장"
      And 등장인물: "심영"
      And 등장인물: "<등장인물>"
     When "심영"이 "연설"을 하면
     Then <결과>

 Examples:
          | 등장인물                | 결과                  |
          | 상하이 조               | 심영은 고자가 된다       |
          | 김두한                  | 심영은 고자가 되지 않는다 |
          | 의사양반                | 심영은 고자가 되지 않는다  |
          | 상하이 조, 김두한         | 심영은 고자가 된다       |
          | 상하이 조, 의사양반       | 심영은 고자가 된다       |
          | 김두한, 의사양반          | 심영은 고자가 되지 않는다 |
          | 상하이 조, 김두한, 의사양반 | 심영은 고자가 된다       |

이렇게 깔끔하게 정리가 가능하지요.

하지만 테스트를 정의하는게 간편해진거지,
여전히 프로그래밍 언어로 작성하는 부분은 그대로입니다.

그래서 이 부분도 형태만 동일하면
같은걸로 가져다 쓸 수 있는 방법이 존재합니다.

@given('장소: "{이름}"')
def 장소_추가(context: runner.Context, 이름: str) -> None:
    context.장소 = 장소(이름)


@given('등장인물: "{등장인물_이름}"')
def 등장인물_추가(context: runner.Context, 등장인물_이름: str) -> None:
    try:
        context.등장인물들
    except:
        context.등장인물들 = {}

    if ',' not in 등장인물_이름:
        context.등장인물들[등장인물_이름] = new_등장인물(등장인물_이름)
        context.등장인물들[등장인물_이름].들어가다(context.장소)
        return

    context.등장인물들.update(
        reduce(
            lambda 등장인물들, 이름: 등장인물들.update({이름: new_등장인물(이름)}) or 등장인물들,
            [이름.strip() for 이름 in 등장인물_이름.split(',')],
            {},
        )
    )
    for 등장인물 in context.등장인물들.values():
        등장인물.들어가다(context.장소)


@when('"심영"이 "연설"을 하면')
def 심영이_연설을_하면(context: runner.Context) -> None:
    context.등장인물들['심영'].님을_확실하게_만나고_확인하시게_될_것입니다_여러분(context.등장인물들.values())

# ...

이렇게 하면 우리는 심영이 어떻게 하면 고자가 되는지
매우 효율적으로 여러가지 케이스를 통해 증명이 가능합니다.

여러분도 심영이 어떻게 해야 고자가 되는지 알아보고 싶다면
Cucumber를 써보세요!

예제 코드는 아래 링크에서 보실 수 있습니다!
예제 코드 링크: https://github.com/juunini/cucumber_example

잡설

cucumber에 대한걸 물어보려고 코딩이랑 무관합니다만, 에 질문을 올렸더니
많은 분들이 좋아해주셔서(?) 저도 좋았습니다.

profile
지상 최강의 개발자 쥬니니

0개의 댓글