Learn and Be Curious

Decription

As Sam

I want to login into system.

So I can see my own content and so I can receive credit for any transactions I complete


Given a specified user Sam,

When Sam inputs a valid user ID and password

Sam can log in and begin scanning/searching for products to add to cart,


1. 스토리의 첫번째 부분

  - As/want/So

  - 이 스토리를 통해서 사용자가 어떤 가치를 얻을 수 있는지 기술

2. 스토리의 두번째 부분

  - Given/When/Then

  - Acceptance criteria : Product Manager가 이 스토리의 완료여부를 판단할 기준



※ 비교

ATDD : Acceptance Test Driven Development

BDD : Behavior Driven Development


"제대로된 TDD를 하기 위하서는 테스트케이스는..."

① 지금까지 처리한 스토리들을 온전히 기술

  - 수동으로 다시 앱을 실행하지 않고도 지금까지 구현된 기능들이 망가지지않고 잘 실행됨을 확신

② 구현의 변경에 강해야함

  - 단위테스트가 구현에 밀접하게 연관되어 조밀하게 작성돼있다면, 리팩토링 시도시 관련 모든 테스트코드를 수정해야함

  - 높은 레벨에서 테스트케이스를 작성하면 세부적인 구현 변경시 테스트코드 변경노력을 줄임


위 두가지 장점은 개발의 효율성으로 이어짐




[TDD Cycle]

Image result for tdd


가장 단순한 코드를 작성해야함

지금 작성하고 있는 스토리에 집중


예) 스토리 : "사용자는 적용할 수 있는 할인의 종류를 볼 수 있다" 라고 하면

- 할인의 종류를 보여주는 것으로 충분함

- 할인의 종류를 하드코딩해서 보여주는 것이 가장 훌륭한 구현

- 이후, 할인의 종류가 변경된다면 역시 또다른 스토리로 작성되고

- 해당 스토리 처리시 할인의 종류를 DB에서 관리할지, 하드코딩된 값을 바꾸는 것으로 충분할지 Product Manager와

  논의를 진행해도 충분함




이런 방식의 가장 큰 장점은 빠른 개발

TDD로 개발하면 개발속도가 느릴것 이라는 오해와 달리 이런원칙을 지킨다면 정말 빠른 속도로 개발할 수 있음



"개발자의 가정에 의해 일하지 않는다"

할인의 종류가 변경될 것이다라는 것은 PM에게 확인받기전까지는 개발자의 가정일뿐.

만반의 준비를 갖춰놓아도 Price Error / Price Match 두가지 할인만을 지원하면 되는 시스템이라면 그간의 노력은

리소스를 낭비한 것 일 수 밖에 없음

PM의 대답은 대개 "지금은 괜찮다. 이후에 할인종류 변경관련 스토리가 추가될 것이다" 일 가능성이 높음


가정에 일하지 않는다는 원칙은 모든 부분에 적용됨

가정을 없애기 위해 개발자들은 PM, UX디자이너와 끊임없이 이야기해야함.




https://monkeyisland.pl/2009/12/07/given-when-then-forever/


//given //when //then forever


@Test
public void shouldDoSomethingCool() throws Exception {
    //given
      
    //when
  
    //then
 
}

[참고]

BDD 툴 : Mockito

Cucumber

'dev' 카테고리의 다른 글

nexus ubunto  (0) 2017.03.27
ISDP  (0) 2017.02.02
Anti-OOP: if를 피하는 법  (0) 2017.02.01
XML vs JSON  (0) 2017.01.26
윈도우10 FTP서버 설치후 아웃바운드 방화벽 문제  (0) 2017.01.02