[aws] 스프링부트에서 테스트 코드를 작성하기
스프링 부트와 AWS로 혼자 구현하는 웹 서비스
스프링 부트에서 테스트 코드를 작성하자
단위테스트와 TDD
TDD는 테스트 코드를 먼저 작성하는 것으로 테스트가 주도하는 개발입니다. 아래와 같은 단계를 따라야 합니다.
- 항상 실패하는 테스트를 먼저 작성 RED
- 테스트가 통과하는 프로덕션 코드를 작성 GREEN
- 테스트가 통과되면 리팩토링 REFACTORING 단위테스트는 TDD의 첫 번째 단계인 기능 단위의 테스트 코드를 작성하는 것을 얘기합니다. TDD와 달리 테스트 코드를 꼭 작성해야하는 것도 아니고 리팩토링도 포함되지 않습니다.
단위 테스트를 작성하는 이유
- 개발초기에 문제를 발견하게 도와줍니다.
- 코드를 리팩토링하거나 라이브러리 업그레이드 등에서 기능이 올바르게 작동하는지 확인할 수 있습니다. (회귀 테스트)
- 기능에 대한 불확실성을 감소시킬 수 있습니다.
- 단위 테스트 자체가 문서가 될 수 있습니다.
단위 테스트를 배우기 전의 개발방법
- 코드 작성
- 프로그램 실행
- HTTP 요청 해보기
- 요청 결과를
System.out.println으로 검증 - 코드 수정 단위 테스트를 배우기 전엔 위 과정을 반복해야 합니다. 프로그램을 실행(톰캣을 실행)하는 과정은 프로그램에 따라 수십초에서 분까지 소요되기도 합니다.
단위 테스트를 하게 되면 해결되는 문제들
- 톰캣을 올렸다 내렸다 해야하는 문제 테스트 코드가 없다 보니 눈과 손으로 직접 수정된 기능을 확인해야만 했습니다. 테스트 코드를 작성하면 손으로 직접 톰캣을 실행할 필요가 없어집니다.
System.out.println으로 결과를 확인해야만 하는 문제 눈 말고는 검증할 도구가 없어서입니다. 테스트 코드를 작성하면 눈으로 확인하지 않고 코드에 작성하면 됩니다.- 기능검증 기능을 하나 추가했다고 기존의 기능들을 모두 손수 테스트할 수 없습니다. 하지만 테스트 코드를 작성하면 전체 기능 테스트가 가능하고 추가한 기능이 다른 기능에 미칠 영향도를 테스트 할 수 있습니다.
테스트를 시작하기 위한 spring boot의 시작점
@SpringBootApplication을 기준으로 설정을 읽기 때문에 이 클래스는 항상 프로젝트의 최상단에 위치해야만 합니다.@SpringBootApplication애노테이션 덕분에 스프링 부트 설정, 스프링 Bean 설정이 모두 자동입니다.SpringApplication.run()으로 인해 내장 WAS를 실행합니다.- Spring Boot는 외부에 별도의 WAS를 두지 않고 애플리케이션을 실행할 때 내부에 WAS를 실행합니다.
- 톰캣(외부 WAS)를 설치할 필요가 없게 되며 Jar를 실행하기만 하면 됩니다.
-
언제 어디서나 같은 환경에서 스프링 부트를 배포 할 수 있게 됩니다. ```java @SpringBootApplication public class AwsSpringbootWebserviceApplication {
public static void main(String[] args) { SpringApplication.run(AwsSpringbootWebserviceApplication.class, args); }
}
### 간단한 컨트롤러 테스트
```java
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello(){
return "Hello";
}
}
@ExtendWith(SpringExtension.class)
@WebMvcTest(HelloController.class)
class HelloControllerTest {
@Autowired
private MockMvc mvc;
@Test
public void hello가_리턴된다() throws Exception{
String hello = "hello";
mvc.perform(get("/hello"))
.andExpect(status().isOk())
.andExpect(content().string(hello));
}
}
@SpringBootTest: 스프링부트 테스트를 진행합니다.@WebMvcTest: Web 기능 테스트에만 집중할 수 있도록 합니다.private MockMvc mvc;: 이 클래스를 통해 HTTP GET, POST에 대한 API 테스트를 할 수 있습니다.
댓글남기기