테스트가 개발을 주도한다는 개념으로 사용된다.
TDD는 테스트를 먼저 만들고 테스트를 통과하기 위한 행동들이 모두 개발을 주도하는 것을 목표로 한다.
TDD 는 개발이 끝난 후에 하는 과정이 아니라 개발 전과 중간 중간에 끊임 없는 테스트를 통해 기능을 개발해야 한다.
의미
BDD 는 행동에 기반하여 TDD를 수행하자는 공통의 이해이다
즉, 애플리케이션이 어떻게 행동해야 하는지에 대한 공통된 이해를 구성하는 방법이다.
BDD에서의 행동
1) Narrative
-> 모든 테스트 문장은 Narrative 하게 되어야 한다. 즉 코드보단 인간의 언어와 유사하게 구성되어야 한다.구현에 초점이 맞춰져 있는 TDD와는 달리 BDD는 수행하려는 어떠한 행동과 기능을 개발자가 더 이해하지 쉽게하는 것이 목적이다.
2) Given/When/Then
-> 모든 테스트 문장은 Given/When/Then 으로 나눠서 작성할 수 있어야 한다.
위에서 말 한 Narrative를 수행하기 위한 실질적인 개념이라고 생각하면 될 것 같다.Given
테스트를 위해 주어진 상태
테스트 대상에게 주어진 조건
테스트가 동작하기 위해 주어진 환경When
테스트 대상에게 가해진 어떠한 상태
테스트 대상에게 주어진 어떠한 조건
테스트 대상의 상태를 변경시키기 위한 환경Then
앞선 과정의 결과=> 즉, 어떤 상태에서 출발(Given)하여 어떤 상태의 변화를 가했을 때(When), 기대하는 어떠한 상태가 되어야 한다(Then
)
메소드 정리
assertArrayEquals(a, b); 배열 A와 B가 일치함을 확인한다.
assertEquals(a, b); 객체 A와 B가 일치함을 확인한다.
assertSame(a, b);
- 객체 A와 B가 같은 객체임을 확인한다.
assertEquals 메서드는 두 객체의 값이 같은가를 검사는데 반해 assertSame메서드는 두 객체가 동일한가 즉 하나의 객체인가를 확인한다.(== 연산자)
assertTrue(a); 조건 A가 참인가를 확인한다.
assertNotNull(a); 객체 A가 null이 아님을 확인한다.
BDDmockito given
테스트를 준비하기 위한 과정 테스트에 사용할 입력값 정의
MockMvc.perform
MockMvc가 제공하는 perform()메소드를 사용하면 브라우저에서 서버에 URL 요청을 하듯 컨트롤러를 실행시킬 수 있다.
MockMvc의 perform() 메소드는 RequestBuilder 객체를 인자로 받는데, RequestBuilder 객체는 MockMvcRequestBuilder의 정적 메소드를 이용해서 생성한다.
MockMvcRequestBuilder의 메소드들은 GET, POST, PUT, DELETE 요청 방식과 매핑되는 get(), post(), put(), delete() 메소드를 제공한다.
그리고 이 메소드들은 MockHttpServletRequestBuilder 객체를 리턴하는데, 이 객체에 브라우저가 HTTP 요청 프로토콜에 요청 관련 정보(파라미터, 헤더, 쿠키 등)를 설정하듯 다양한 정보들을 설정할 수 있다.
위 코드처럼 param() 메소드를 이용하면 '키=값'의 파라미터를 여러 개 전달할 수 있다.
MockHttpServletRequestBuilder의 메소드는 MockHttpServletRequestBuilder 객체를 다시 리턴하기 때문에 메시지 체인을 구성하여 복잡한 요청을 설정할 수 있다.
MockMvc.perform(get("/hello"))
MockMvc를 통해 /hello 주소로 HTTP GET을 요청합니다.
체이닝이 지원되어 아래와 같이 여러 검증 기능을 이어서 선언할 수 있습니다.
.andExpect(status().isOK())
- mvc.perfom의 결과를 검증합니다.
- HTTP Header의 Status를 검증할 수 있습니다.
- 우리가 흔히 알고 있는 200, 400, 500 등의 상태를 검증할 수 있습니다.
.andExpect(content().string( ... ))
- mvc.perform의 결과를 검증한다.
- 응답 본문의 내용을 검증합니다.