TDD (Test-Driven-Development) 방법론
테스트를 먼저 설계하고 구축하여 통과할 수 있는 코드를 짜는것
장점
- 코드의 안정성을 높일 수 있음
(기능을 추가하거나 변경하는 과정에서 발생할 수 있는 상황들을 줄일 수 있음) - 해당 코드가 작성된 목적을 명확하게 표현 할 수 있음
통합 테스트
통합 테스트는 여러 기능을 조합하여 전체 비즈니스 로직이 제대로 동작하는지 확인하는 것을 의미
통한 테스트의 경우, @Spring BootTest를 사용하여 진행
- @SpringBootTest는 @SpringBootApplication을 찾아가서 모든 Bean을 로드하게 됨
- 이 방법을 대규모 프로젝트에서 사용할 경우, 테스트를 실행할 때마다 모든 빈을 스캔하고 로드하는 작업이 반복되어 매번 무거운 작업을 수행해야 함 - > 단위테스트를 진행 !!!
단위 테스트
단위 테스트는 프로젝트에 필요한 모든 기능에 대한 테스트를 각각 진행하는 것을 의미
F.I.R.S.T 원칙
- Fast : 테스트 코드의 실행은 빠르게 진행되어야 함
>> 단위테스트로 아주 작은단위의 테스트로 많이 만들기 / 외부의존성 최소화(mock활용) - Independent : 독립적인 테스트가 가능해야 함
- Repeatable : 테스트는 매번 같은 결과를 만들어야 함
- Self-Validating : 테스트는 그 자체로 실행하여 결과를 확인할 수 있어야 함
- Timely : 단위 테스트는 비즈니스 코드가 완성되기 전에 구성하고 테스트가 가능해야 함
>>코드가 완성되기 전부터 테스트가 따라와야 한다는 TDD의 원칙을 담고 있음
JUnit
Java의 대표적인 Test Framework
- 어노테이션(Annotation)을 기반으로 테스트를 지원
ex ) @Test, @BeforeEach, @AfterEach, @BeforeAll, @AfterAll - 단정문(Assert / Assertion)으로 테스트 케이스의 기대값에 대해 수행 결과를 확인할 수 있음 !!!!!!!!
- Spring Boot 2.2버전부터 JUnit 5 버전을 사용
- 테스트 러너 (test runner) : 테스트 케이스를 실행하고 결과를 출력하는 역할을 하는 컴포넌트
- 테스트의 총 개수, 성공한 테스트 수, 실패한 테스트 수 등 정보를 출력 - 테스트 스위트 (test suite) : 테스트 케이스 들을 하나로 묶은 것. - 클래스 메소드 단위
JUnit Main Annotation
@SpringBootTest
- 통합테스트 용도로 사용됨
- @SpringBootApplication을 찾아가 하위의 모든 Bean을 스캔하여 로드함
- 그 후 Test용 Application Context를 만들어 Bean을 추가하고, MockBean을 찾아 교체
@ExtendWith
-JUnit4에서 @RunWith로 사용되던 어노테이션이 변경 됨
-@ExtendWith는 메인으로 실행될 Class를 지정할 수 있음
@WebMvcTest(Class명.class)
-(Class명.class)에 작성된 클래스만 실제로 로드하여 테스트를 진행
-매개변수를 지정해주지 않으면 @Controller,@RestController,@RestControllerAdvice등
컨트롤러와 연관된 Bean이 모두 로드됨
-스프링의 모든 Bean을 로드하는 @SpringBootTest 대신 컨트롤러 관련된 코드만 테스트 할 경우 사용
@Autowired
-Controller의 API를 테스트 하는 용도인 MockMVC객체를 주입받음
- perform() 메소드를 활용하여 컨트롤러의 동작을 확인할 수 있음 .andExpect(), andDo(), andReturn() 등의 메소드를 같이 활용함
@MockBean
-테스트할 클래스에서 주입 받고 있는 객체에 대해 가짜 객체를 생성해주는 어노테이션
-해당 객체는 실제 행위를 하지 않음
- given() 메소드를 활용하여 가짜 객체의 동작에 대해 정의하여 사용할 수 있음
@AutoConfigureMockMvc
-spring.test.mockmvc 의 설정을 로드하면서 MockMvc의 의존성을 자동으로 주입
-MockMvc 클래스는 REST API 테스트를 할 수 있는 클래스
@WebMvcTest(HelloController.class)
class HelloControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private HelloService helloService;
@Test
void hello() throws Exception {
when(helloService.hello()).thenReturn("Hello, World!");
mockMvc.perform(get("/hello"))
.andExpect(status().isOk())
.andExpect(content().string("Hello, World!"));
}
}
@Test
테스트용 메소드를 표현하는 어노테이션
@BeforEach
각 테스트 메소드가 시작되기 전에 실행되어야 하는 메소드를 표현
@AfterEach
각 테스트 메소드가 시작된 후 실행되어야 하는 메소드를 표현
@BeforeAll
테스트 시작 전에 실행되어야 하는 메소드를 표현 (static 처리 필요)
@AfterAll
테스트 종료 후에 실행되어야 하는 메소드를 표현 (static 처리 필요)
참고 :
어라운드 허브 스튜디오
https://www.youtube.com/watch?v=SFVWo0Z5Ppo&t=435s
'개-발 > Java + Spring + Kotlin' 카테고리의 다른 글
[JAVA] Stream 이해 (Lazy 지연연산) (0) | 2023.06.12 |
---|---|
[JAVA] TDD / Testcode (mockito) (0) | 2023.05.07 |
[Spring] JDA(Java Discord Api)를 이용한 자동 방 생성 (0) | 2023.03.09 |
[Spring] Redis를 활용한 대기열 구현 (0) | 2023.03.09 |
[Spring] Lock / DeferredResult를 활용한 대기열 처리 (0) | 2023.03.09 |