2022. 2. 22. 11:46ㆍWeb Dev/Spring Boot
탄탄한 서비스를 만들기 위해서는 테스트 코드를 이용하여 최소한의 테스트는 거쳐야 한다. 또한, 요즘 채용에 테스트 코드에 관한 사용 여부도 요구하는 기업들도 존재한다.
1. 테스트 코드 소개
TDD : 테스트 코드가 개발을 주도하는 것
Unit Test : 테스트 코드를 먼저 작성하여 확인 하는 것
2. TDD (Test Driven Development)
TDD의 프로세스는 이렇게 작동한다.
설계 -> 테스트 코드 작성 -> (설계 수정 시) 설계로 회귀 -> 코드 개발 -> (리펙토링 시) 테스트 코드로 회귀
2-1. 왜 TDD를 사용하나?
애자일 방법론에서 설계에 대한 확실이 높지 않을 때 서로의 피드백과 협력이 중요하다고 하였기에 이 둘이 반복되면 좋은 결과를 생산할 수 있기 때문이다.
2-2. 언제 사용해야 하나?
1. 고객의 요구 조건이 바뀔 확률이 높은 프로젝트 -> 외부적으로 오는 확실성이 없을 때
2. 내가 처음보는 프로젝트 -> 나의 지식에 대한 확실성이 없을 때
3. 프로젝트 과정 중 만들어 개발한 부분을 많이 바꿔야 할 경우
4. 남이 개발 한 것을 유지보수해야 할 경우
-> 외부적으로 오는 확실성이 없을 경우 TDD 프로세스를 이용하여 개발
즉, 협력과 피드백을 통한 리팩토링으로 인해 좋은 결과를 생산해낸다.
2-3. 장점
1. 반복적인 리팩토링을 통해 모듈화가 철저히 이루어짐 -> 종속성과 의존성 낮춘다.
즉, 일부 기능이 제외 되어도 프로젝트 구조에 영향을 크게 미치지 않는다.
2. 테스트 코드가 있기 때문에 재설계하는 시간이 많이 단축된다.
3. TDD는 자동환 된 테스트를 기본으로 하기 때문에 특정 버그를 찾기에 효율적이다. -> 디버깅 시간 낮아짐
4. 테스트 문서를 통해 결과를 도출 할 수 있다.
5. 대부분의 기능이 모듈화 되어 있고, 테스트 코드가 존재하기 때문에 기능을 추가하는 부분에서 편하다.
2-4. 단점
아무래도 많은 테스트와 피드백 수용이 있다보니 생산 속도에 대한 저하가 있다.
3. Unit Test
단위 테스트는 개발 단계 초기에 문제를 발견할 수 있고, 기능에 대한 확실성을 높일 수 있다. 또한, 테스트는 프로젝트에 대한 문서를 제공한다. -> 단위 테스트가 문서로 이용 가능하다.
3-1. 개발 방법
테스트 코드를 작성한다 -> 프로젝트 실행 -> 테스트 도구로 HTTP 요청하여 기능이 올바르게 작동하나 확인 -> 결과를 확인 -> 결과가 다를 시 수정 후 재 실행
단위 테스트는 수정과 실행, 수정과 실행을 반복하는 방법이다.
올바른 값을 얻기 위해 몇 번의 과정을 거쳐 수정을 빠르게 할 수 있고, 더 오래 걸릴 수 도 있다.
또한, 올바른 기능을 하는 것에 새로운 기능을 추가한 후 오류가 발생할 때도 있다. 이는 한 기능에 많은 자원을 소모하기에 모두 테스트를 할 순 없다. -> 기존 기능이 잘 작동 되게 보장
3-2. xUnit
대중적인 테스트 프레임 워크 개발환경에 따라 여러 단위 테스트를 해주는 프레임 워크다.
3-3. JUnit 어노테이션
1. @SpringBootApplication
-> 스프링 부트의 자동 설정, Bean 읽기와 생성 자동으로 설정
-> 항상 이 어노테이션 먼저 실행되어야 하기 때문에 최상단에 위치한다.
2. @RestController
-> 컨트롤러를 JSON을 반환하는 컨트롤러로 생성
3. @GetMapping
-> HTTP의 GET의 요청을 받을 수 있는 API로 생성
4. @RunWith(SpringRunner.class) -> JUnit4 기준, @ExtendWith(SpringExtension.class) -> JUnit5 기준
-> 테스트 진행 시 내장된 실행자 외에 다른 실행자 실행시킨다.
-> 여기서는 SpringRunner와 SpringExtension을 실행
-> 즉, 연결 자이다.
5. @WebMvcTest
-> Spring MVC에 집중할 수 있는 어노테이션
-> 선언 시 Controller, ControllerAdvice 사용 가능
-> 단, Service, Component and Repository 사용 불가
-> 여기서는 Controller만 사용
6. @AutoWired
-> Bean을 가져온다.
7. private MockMvc mvc
-> API 테스트 시 사용
-> 테스트의 시작점이다.
-> 이 클래스를 통해서 GET, POST와 같은 API 테스트 가능
<참고>
1, 이동우 저자의 스프링 부트와 AWS 'https://jojoldu.tistory.com/'
2. TDD 방법론 'http://clipsoft.co.kr/wp/blog/tddtest-driven-development-%EB%B0%A9%EB%B2%95%EB%A1%A0/'