티스토리 뷰
TDD와 단위 테스트는 다른 이야기이다.
TDD는 테스트가 주도하는 개발을 이야기하고 테스트 코드를 먼저 작성 하는 것부터 시작한다.
- 항상 실패하는 테스트를 먼저 작성하고
- 테스트가 통과하는 프로덕션 코드를 작성하고
- 테스트가 통과하면 프로덕션 코드를 리팩토링합니다
반면 단위테스트는 TDD의 첫 번쨰 단계인 기능 단위의 테스트 코드를 작성하는 것을 이야기합니다.
( 단위 테스트랑 TDD안의 기능 하나하나를 작성하고 테스트 하는 것을 의미하는 듯 하다.)
- 단위 테스트는 개발자가 나중에 코드를 리팩토링하거나 라이브러리 업그레이드 등에서 기존 기능이 올바르게 작동하는지 확인할 수 있다.
- 단위 테스트는 기능에 대한 불확실성을 감소 시킬 수 있다.
- 단위 테스트는 시스템에 대한 실제 문서를 제공한다. 즉, 단위 테스트 자체가 문서로 사용할 수 있다.
가장 먼저 빠른 피드백이 있다.
이전 개발방식은
1.코드를 작성
2.TOMCAT 실행
3.Postman과 같은 API 테스트 도구로 HTTP 요청
4.요청 결과를 Sysout으로 눈으로 검증
5.결과가 다르면 다시 tomcat 중지 후 코드 수정
이 일이 반복되며 시간을 많이 잡아 먹게 된다.
테스트 코드를 작성하면 눈으로 검증하지 않게 자동검증이 가능해 진다.
또 개발자가 만든 기능을 안전하게 보호해 준다.
먼저 클래스인 Application을 작성한다
package com.jojoldu.book.srpingboot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication //이 어노테이션이 있는 위치부터 설정을 읽어 가기 때문에 이클래스는 항상프로젝트의 상단에 위치해야만하다
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
//SpringApplication.run로 인해 내장 was를 실행하게 된다.
}
}
내장 was를 사용하는 이유는 언제 어디서나 같은 환경에서 스프링부트를 배포 할 수 있기 때문이다. 따로 서버의 버전과설정을 맞출 필요가 없어진다.
패키지 하나를 더 만들어 HelloController 클래스를 작성해준다
package com.jojoldu.book.srpingboot.web;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController //컨트롤러를 JSON을 반환하는 컨트롤러로 만들어 줍니다.
public class HelloController {
@GetMapping("/hello") //http method인 get요청을 받을 수 있는 api를 만들어 줍니다.
public String hello(){
return "hello";
}
}
이번에 테스트 클래스를 만들어 준다. 위치는 src/test/java로 해주고 위의 패키지명과 똑같이 만들어준다
package com.jojoldu.book.srpingboot;
import com.jojoldu.book.srpingboot.web.HelloController;
import org.junit.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;
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;
// 1.**@RunWith(SpringRunner.class)**
// 테스트를 진행할 때 JUnit에 내장된 실행자 외에 다른 실행자를 실행시킵니다.
// 여기서는 SpringRunner라는 스프링 실행자를 사용합니다.
// 즉, 스프링 부트 테스트와 JUnit 사이에 연결자 역할을 합니다.
// ----------------------------------------------------------------------
// 2.**@WebMvcTest(controllers = HelloController.class)**
// 여러스프링 테스트 어느테이션 중 Web(SpringMvc)에 집중할 수 있는 어노테이션입니다.
// 선언할 경우 @Controller , @ControllerAdvice 등은 사용할 수 있습니다.
// 단 @Service@Component @Repository 등은 사용할 수 없습니다.
// 여기서는 컨트롤러만 사용하기 때문에 선언합니다.
@RunWith(SpringRunner.class) //1.
@WebMvcTest(controllers = HelloController.class)//2.
public class HelloControllerTest {
@Autowired // 스프링이 관리하는 빈(Bean)을 주입 받습니다.
private MockMvc mvc; // 웹 API를 테스트할 때 사용합니다. 스프링 MVC 테스트의 시작점입니다.
// 이 클래스를 통해 HTTP GET,POST 등에 대한 API 테스트를 할 수 있습니다.
@Test
public void hello가_리턴된다() throws Exception {
String hello = "hello";
//3.**MockMvc를 통해 /hello 주소로 HTTP GET 요청을 합니다. 체이닝이 지원되어 아래와 같이 여러검증 기능을 이어서 선언할 수 있습니다
mvc.perform(get("/hello")) // 3.
.andExpect(status().isOk())//4.
.andExpect(content().string(hello)); //5.
//4. andExpect(status().isOk()
// mvc.perform의 결과를 검증합니다.
// HTTP Header의 Status를 검증합니다.
// 우리가 흔히 알고 있는 200,404,500 들의 상태를 검증합니다.
// 여기선 OK 즉, 200인지 아닌지를 검증합니다
//5. andExpect(content().string(hello))
// mvc.perform의 결과를 검증합니다.
// 응답 본문의 내용을 검증합니다.
// Controller에서 "hello"를 리턴하기 떄문에 이 값이 맞는지 검증합니다.
}
}
이제 메소드인 hello가_리턴된다 메소드를 실행해준다
콘솔에 tests passed 1 of 1이 뜨며 잘 넘어가면 성공
이제 수동으로 알아보기 위해 application 클래스의 main을 실행 해준다. 그럼 8080이 찍히며 열릴 것이다.
이후 localhost:8080/hello로 들어가 정상 작동하는지 체크한다.
'dev_공부일지 > spring boot + intelliJ' 카테고리의 다른 글
thymeleaf Object 표시, th:with 지역변수 사용 (0) | 2023.04.06 |
---|---|
thymeleaf escape unEscape (0) | 2023.04.02 |
롬복사용 dto와 테스트 코드작성 (0) | 2021.07.26 |
lombok 설치하기 (0) | 2021.07.25 |
1. intelliJ에 스프링부트 gredle로 설정하기 (0) | 2021.07.06 |
- Total
- Today
- Yesterday
- thymleaf
- 로그인
- Java
- JPA
- reject
- filter
- jpa api
- 향해99
- 백엔드 개발자 공부
- 인터셉터
- hypertexttransferprotocol
- 스프링공부
- SpringBoot
- HTTP
- 항해플러스
- 향해플러스백엔드
- 컨트
- 스프링부트
- react실행
- rejectValue
- 백엔드 개발자 역량
- BindingResult
- 항해99
- exception
- ArgumentResolver
- Intercepter
- 향해플러스
- React
- 리터럴
- 예외처리
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |