테스트 코드
- TDD - 테스트 주도 개발.테스트 코드를먼저 작성하는 것.
- 단위 테스트 - 기능 단위의 테스트 코드 작성.
레드 그린 사이클
- 항상 실패하는 테스트를 먼저 작성(Red)
- 테스트가 통과하는 프로덕션 코스트를 작성(Green)
- 테스트 통과하면 프로덕션 코드를 리팩토링(Refactor)
테스트 장점은 빠른 피드백과 기능 보호에 있다.
테스트 코드 작성 시 도와주는 프레임워크로는 xUnit 이 있다. 이는 개발환경(x)에 따라 Unit 테스트를 도와주는 도구이다.
자바용은 JUnit이 있다.
@SpringBootApplication
public class FrBookApplication {
public static void main(String[] args) {
SpringApplication.run(FrBookApplication.class, args);
}
}
@SpringBootApplication
스프링 부트의 자동 설정, 스프링 Bean 읽기와 생성을 자동으로 설정
이 위치부터 설정을 읽어나가므로 프로젝트 최상단에 위치해야 한다.
SpringApplication.run은 내장 WAS(Web Application Server)를 실행한다.
Was는 별도로 외부에 WAS를 두지 않고 Application을 실행할 때 내부에서 WAS를 실행하는 것을 말한다.
이렇게 하면 서버에 톰캣을 설치할 필요가 없고, Jar파일(실행가능 Java 패키징 파일)로 실행할 수 있다.
그렇다면 왜 내장 WAS를 사용할까?
언제 어디서나 같은 환경에서 스프링 부트를 배포할 수 있기 때문이다.
간단 실습
package com.webservice.frbook.web;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController // JSON반환 컨트롤러. @ResponseBody를 각 메소드마다 선언하는 것과 같은 효과
public class HelloController {
@GetMapping("/hello")
public String hello(){
return "hello";
}
}
package com.webservice.frbook.web;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
@RunWith(SpringRunner.class)
@WebMvcTest
public 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));
}
}
1. RunWith(SpringRunner.class)
- 테스트 진행시 JUnit에 내장된 실행자 외 다른 실행자를 실행시킨다.
- 스프링부트 테스트와 JUnit 사이 연결자 역할을 한다.
2. WebMvcTest
- Web(Spring MVC)에 집중할 수 있는 어노테이션
- @Controller, @ControllerAdvice 등을 사용할 수 있다.
- @Service,@Component,@Repository 등은 사용할 수 없다.
- 여기서는 컨트롤러만 사용하기 때문에 선언한다.
3. @Autowired
- 스프링이 관리하는 빈을 주입받는다.
4. private MockMvc mvc
- 웹 API 테스트할때 사용
- 스프링 MVC 테스트 시작점
5. mvc.perform(get("/hello"))
- MockMvc를 통해 HTTP GET 요청
- 체이닝이 지원되어 여러 검증 기능 이어 선언 가능
6. andExpect(status().isOk())
- mvc.perform 결과 검증
- HTTP Headerdml Status 검증
- 200,404, 500 상태 코드 검증
7. andExpect(content().string(hello))
- mvc.perform의 결과 검증
- 리턴 값("hello") 맞는지 검증
Hello Controller 코드를 롬복으로 전환하기 (Dto 추가)
Dto패키지에 아래 클래스 코드 추가
package com.webservice.frbook.web.dto;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@Getter
@RequiredArgsConstructor
public class HelloResponseDto {
private final String name;
private final int amount;
}
@RequiredArgsConstructor
선언된 모든 final 필드가 포함된 생성자를 생성
final이 없는 필드는 생성자에 포함되지 않음
package com.webservice.frbook.web.dto;
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
import org.junit.jupiter.api.Test;
public class HelloResponseDtoTest {
@Test
public void 롬복_기능_테스트() {
// given
String name = "test";
int amount = 1000;
// when
HelloResponseDto dto = new HelloResponseDto(name, amount);
// then
assertThat(dto.getName()).isEqualTo(name);
assertThat(dto.getAmount()).isEqualTo(amount);
}
}
assertThat
assertj라는 테스트 검증 라이브러리 검증 메소드
검증하고 싶은 대상을 메소드 인자로 받음
@GetMapping("/hello/dto")
public HelloResponseDto helloDto(@RequestParam("name") String name,@RequestParam("amount") int amount){
return new HelloResponseDto(name, amount);
}
@RequestParam
외부에서 API로 넘긴 파라미터를 가져오는 어노테이션
@Test
public void helloDto가_리턴된다() throws Exception {
String name = "hello";
int amount = 1000;
mvc.perform(
get("/hello/dto")
.param("name",name)
.param("amount",String.valueOf(amount)))
.andExpect(status().isOk())
.andExpect((ResultMatcher) jsonPath("$.name",is(name)))
.andExpect((ResultMatcher) jsonPath("$.amount",is(amount)));
}
1.param
- API 테스트할 때 사용될 요청 파라미터 설정
- 단, 값은 String만 허용됨
- 숫자/날짜 등의 데이터도 문자열로 변경해야 가능
2.jsonPath
- json응답값을 필드별로 검증할 수 있는 메소드
- $을 기준으로 필드명을 명시
출처
스프링 부트와 AWS로 혼자 구현하는 웹 서비스
'개발프로젝트' 카테고리의 다른 글
[개발프로젝트] 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 chapter 04~05- 스프링 시큐리티와 OAuth2로 로그인 기능 구현하기 (2) | 2024.01.03 |
---|---|
[개발프로젝트] 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 chapter 03- JPA로 DB 다루기 & API 작성 (0) | 2024.01.02 |
[개발프로젝트] 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 chapter 01 (0) | 2023.12.19 |
utc4 (2) | 2023.11.15 |
utc3 (0) | 2023.11.07 |