4주 차 강의 내용 정리
- ATDD
- 인수테스트란
- 4주 차 미션(Lotto) 대한 피드백
ATDD(인수테스트 주도 개발)
ATDD란 프로젝트를 구성하는 인원들과 원할한 협업을 하기위한 소프트웨어 개발 방법론 중 하나. 기획 단계부터 공통의 목표와 이해를 도모해서 프로젝트를 진행하기 위해 사용됨.
신규 기능 개발시 발생가능한 문제( 도메인에 대한 이해도 부족으로 단위테스트 작성 어려움, 레거시 리팩터링의 어려움 등)로 인해 TDD 사이클로 개발이 어려울 경우 인수테스트를 먼저 구현한 후 이후 단위 테스트를 통해 기능을 완성해 가는 과정이 대안이 될 수 있다.
ATDD 사이클
ATDD 개발 프로세스
-
예시 1(신규 기능 개발)
요구사항 분석
- 인수 테스트가 충족해야하는 조건
- 분석 및 표현에 다양한 방식이 있다.
Ex)시나리오 기반으로 표현하는 방식 (Given/When/Then)
https://www.altexsoft.com/blog/business/acceptance-criteria-purposes-formats-and-best-practices/
인수 테스트
- 분석한 요구사항을 검증하는 단계
- 실제 요청/응답하는 환경과 유사하게 테스트 환경을 구성
문서화
- Spring Rest Docs를 활용한 API 문서화
- 문서화를 위해서는 Mock 서버 & DTO 정의가 필요.
- 프론트엔드, 다른 백엔드 개발자와 병렬로 작업하는데 유리함
- 인수 테스트와는 별개로 API 테스트를 수행
- 다른 개발자들과 협업 시 커뮤니케이션에 큰 장점
기능 구현 with TDD
- 인수테스트 기반으로 하나씩 기능개발을 진행
- Outside In / Inside Out 방향으로 개발
이후 반복적인 리펙터링
-
예시 2(레거시 코드 리펙터링)
리팩터링 대상을 확인
리팩터링 방법 선택
- 먼저 인수 테스트를 작성하여 기존에 구현된 기능을 보호하기
- 파악이 가능한 부분 부터 단위 테스트를 만들어 기능 검증하기
인수 테스트의 보호 속에서 리팩터링 하자!
새로운 인수테스트를 작성
메서드 분리
- 인수 테스트 작성 후 메서드 분리 시 사이드 이펙트에 대한 피드백을 바로 받을 수 있음
- 기능을 구현하다 꼬이거나 잘못 되어도 인수 테스트가 성공한 시점으로 리셋할 수 있음
- 안심하고 작은 단위로 메서드를 분리
단위 테스트 작성
- 단위가 작아지니 역할이 줄어들고 검증할 대상이 명확해 짐
- 단위 테스트 하기 쉬운 코드가 됨
인수테스트란
실제 사용자 환경에서 사용자의 입장으로 테스트를 수행하는 것을 말한다. 인수 조건은 개발 용어가 사용되지 않고 일반 사용자들이 이해할 수 있는 단어를 사용
인수 테스트 특징
전구간 테스트
- 요청과 응답 기준으로 전 구간을 검증
Black Box 테스트
- 세부 구현에 영향을 받지 않게 구현하기
테스트 만드는 과정
테스트 환경 구축
인수 테스트는 시스템 내부 코드를 가능한 직접 호출하지 말고 시스템 전 구간을 테스트를 하도록 안내하고 있기 때문에 시스템 외부에서 요청하는 방식으로 검증함.
인수 테스트 클래스
- 실제 서버가 아닌 테스트를 위한 서버를 로드하도록 설정
- 실제 request가 아닌 인수 테스트의 request를 받기 위함
- @SpringBootTest을 클래스에 붙여주면 테스트를 위한 웹 서버를 사용
- webEnvironment 설정을 통해 웹 서버의 환경을 지정
인수 테스트 객체 설정
- 테스트를 위한 서버에 요청을 보내기 위한 클라이언트 객체 설정
- ex. MockMvc, RestAssured, WebTestClient
- 테스트의 성격에 맞는 클라이언트를 선택해야 함
MockMvc vs WebTestClient vs RestAssured=> 비교는 다음 포스팅 예정
테스트 서버에 요청 / 응답 결과를 검증
ex)
@DisplayName("지하철역을 생성한다.")
@Test
void createStation() {
...
ExtractableResponse<Response> response = RestAssured.given().log().all()
.body(params)
.contentType(MediaType.APPLICATION_JSON_VALUE)
.when()
.post("/stations")
.then().log().all()
.extract();
// then
assertThat(response.statusCode()).isEqualTo(HttpStatus.CREATED.value());
assertThat(response.header("Location")).isNotBlank();
}
@SpringBootTest
- 테스트에 사용할 ApplicationContext를 쉽게 지정하게 도와줌
- 기존 @ContextConfiguration의 발전된 기능
- SpringApplication에서 사용하는 ApplicationContext를 생성해서 작동
webEnvironment
@SpringBootTest의 webEnvironment 속성을 사용하여 테스트 서버의 실행 방법을 설정 링크.
- MOCK: Mocking된 웹 환경을 제공, MockMvc를 사용한 테스트를 진행할 수 있음
- RANDOM_PORT: 실제 웹 환경을 구성
- DEFINED_PORT: 실제 웹 환경을 구성, 지정한 포트를 listen
- NONE: 아무런 웹 환경을 구성하지 않음
❗️인수 테스트 작성 팁
인수 테스트 클래스
- Feature 기준으로 인수 테스트 클래스를 나눌 수 있음
- Scenario 기준으로 인수 테스트 메서드를 작성할 수 있음
- 하나의 Feature 내부에 있는 Scenario는 같은 테스트 픽스쳐를 공유하는 것을 추천
간단한 성공 케이스 우선 작성
- 동작 가능한 가장 간단한 성공 케이스로 시작
- 테스트가 동작하면 실제 구조에 관해 더 좋은 생각이 떠오를 수 있음
- 그 과정에서 발생 가능한 실패를 처리하는것과 성공 케이스 사이에서 우선순위를 가늠
실패하는 테스트 지켜보기
- 코드를 작성하기 전 테스트가 실패하는 것을 지켜본 후 진단 메시지를 확인
- 테스트가 예상과 다른 식으로 실패하면 뭔가를 잘못 이해했거나 코드가 완성되지 않았다는 뜻
Given / When / Then
- When -> Then -> Given 순서로 작성하는 것이 자연스러움
🧑💻 인수 테스트 리팩토링
테스트의 의도를 명확히 드러내기
가독성에 신경쓰기!
- 가독성이 좋지 않으면 방치되는 테스트가 될 가능성이 높다
- 변경 사항에 대해서 수정하기 어렵다. -> 방치될 가능성 높다
- feat. @Ignore or @Disabled
- 가독성이 좋으면 해당 기능의 스펙을 나타낼 수 있다.
프로덕션 코드의 가독성이 중요한 만큼 테스트 코드의 가독성도 중요함
테스트 코드 중복 제거
- 기능 개발 간 테스트 코드도 중복이 많이 발생함
- 테스트 가독성을 저해하는 구조가 나올 수 있어 중복제거가 중요함
- 가독성이 좋지 않은 테스트 코드는 관리가 되지 않는 가능성이 높음
중복 제거 방법
- 메서드 분리
- CRUD 추상화
- Cucumber나 JBehave 와 같은 BDD 도구 사용
메서드 분리
- 반복되는 코드는 메서드로 분리
- ex) StationAcceptanceTest
다른 인수 테스트에서 재사용
- 스텝 메서드들을 static 선언
- 다른 인수 테스트에서 재사용 가능
4주 차 미션 (JPA)
- JPA 실습 진행. 관련 문법 학습
소스코드: github.com/louisJu/jwp-jpa-ex
느낀 점
- 김영한님의 JPA 참고서적을 학습하면서 해당 미션을 진행하니 수월하게 느껴졌다.
- ENTITY들의 관계성을 잘 고려하면서 설계하는것은 어렵구나 다시한번 느낌.
회고
: 생각보다 어려운 피드백없이 진행했던 과제. 하지만 JPA는 너무나도 방대하다는 것을 앎.
참고자료
우아한테크캠프 4주차 강의.
ATDD 요구사항 분석 방법:
https://www.altexsoft.com/blog/business/acceptance-criteria-purposes-formats-and-best-practices/
ATDD방법론 설명:
https://mysoftwarequality.wordpress.com/2013/11/12/when-something-works-share-it/
'MyStory > dev_life' 카테고리의 다른 글
동시성 이슈를 고려해서 쿠폰 발급하기 (Redisson을 활용한 분산 락 처리) (0) | 2023.02.19 |
---|---|
우아한 테크 캠프 프로 5주차 회고 - 1 (0) | 2021.03.14 |
우아한 테크 캠프 PRO 3주차 회고 (0) | 2021.02.14 |
우아한 테크 캠프 PRO 2주차 회고 (0) | 2021.02.07 |
우아한 테크 캠프 PRO 1주차 회고 (0) | 2021.02.04 |