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