티스토리 뷰

TDD에 대한 간단한 설명

- 테스트 주도 개발이라는 뜻으로 TDD는 테스트를 먼저 설계하고 테스트를 통과할 수 있는 코드를 짜는 것을 말한다.
- 애자일 개발 방식 중 하나라고 한다.
- 코드 설계시 원하는 단계적 목표에 대해 설정하여 진행하고자 하는 것에 대한 결정 방향의 갭을 줄인다.
- 최초 목표에 맞춘 테스트를 구축하여 그에 맞게 코드를 설계 하기 때문에 보자 적은 의견 충돌을 이끌 수 있음

테스트 코드를 작성하는 목적

- 코드의 안정성은 높일 수 있음
- 기능을 추가하거나 변경하는 과정에서 발생하는 Side-Effect를 줄일 수 있음
- 해당 코드가 작성된 목적을 명확하게 표현할 수 있다.(코드에 불필요한 내용이 들어가는 것을 비교적 줄일 수 있음)

[단위테스트]

단위 테스트(Unit Test)는 하나의 모듈을 기준으로 독립적으로 진행되는 가장 작은 단위의 테스트이다.
즉, 단위 테스트는 애플리케이션을 구성하는 하나의 기능이 올바르게 동작하는지를 독립적으로 테스트하는 것으로, "어떤 기능이 실행되면 어떤 결과가 나온다" 정도로 테스트를 진행한다.

[통합 테스트]

통합 테스트(Integration Test)는 모듈을 통합하는 과정에서 모듈 간의 호환성을 확인하기 위해 수행되는 테스트이다.

통합테스트의 경우 , @Spring BootTest를 사용하여 진행
- @SpringBootTest는 @SpringBootApplication을 찾아가서 모든 Bean을 로드하게됨
- 이 방법을 대규모 프로젝트에서 사용할 경우, 테스트를 실행할 떄마다 모든 빈을 스캔하고 로드하는 작업이 반복되어 매번 무거운작업을수행해야함.

단위테스트를 작성할떄 필요한 5가지 규칙

  1. Fast: 테스트 코드의 실행은 빠르게 진행되어야함.
  2. Independent: 각각의 테스트는 독립적이며 서로 의존해서는 안된다. 
  3. Repeatable: 테스트는 매번 같은 결과를 만들어야 함
  4. Self-Validating: 테스트는 그 자체로 실행하여 결과를 확인할 수 있어야 함
  5. Timely: 테스트는 적시에 즉, 테스트하려는 실제 코드를 구현하기 직전에 구현해야 한다.

JUnit이란?

- Java진영의 대표적인 Test Framework
- 단위 테스트를 위한 도구를 제공 
- 어노테이션을 기반으로 테스트를 지원
- Assert으로 테스트 케이스의 기대값에 대해 수행 결과를 확인할 수 있음
- Spring Boot 2.2버전부터 JUnit 5버전을 사용
- JUnit 5는 크게 Jupiter, Platform, Vintage 모듈로 구성됨

JUnit 모듈 설명

1. JUnit Jupiter

-  TestEngine API 구현체로 JUnit 5를 구현하고 있음 |
- 테스트의 실제 구현체는 별도 모듈 역할을 수행하는데, 그 모듈 중 하나가 Jupiter-Enginer이다.
- Jupier-API를 사용하여 작성한 테스트 코드를 발견하고 실행하는 역할을 수행한다. 
- 개발자가 테스트 코드 작성할떄 사용됨

2. JUnit Platform

- Test 를 실행하기 위한 뼈대
- Test를 발견하고 테스트 계획을 생성하는 TestEnginer 인터페이스를 가지고 있음
- TestEngine을 통해 Test를 발견하고, 수행 및 결과를 보고함- 각종 IDE 연동을 보조하는 역할을 수행( 콘솔 출력 등)
- Platform = TestEngine API + Console Launcher + JUnit 4 Based Runner 

3. JUnit Vintage

- TestEngine API 구현체로 JUnit 3,4 를 구현하고 있음
- 기존 JUnit 3,4 버전으로 작성된 테스트 코드를 실행할 때 사용됨
- Vintage-Engine 모듈을 포함하고 있음

JUnit LifeCycle Annotation 

- JUnit 5는 아래와 같은 테스트 라이프 사이클을 가지고 있음.

JUnit Main Annotation

@SpringBootTest

- 통합테스트 용도로 사용됨
- @SpringBootApplication을 찾아가 하위의 모든 Bean을 스캔하여 로드함
- 그 후 테스트용 Application Context를 만들어 Bean을 추가하고, MockBean을 찾아 교체한다.

@ExtendWith

- JUnit4에서 @RunWith로 사용되던 어노테이션이 ExtendWith로 변경됨
- @ExtendWith는 메인으로 실행될 Class를 지정할 수 있음
- @SpringBootTest는 기본적으로 @ExtendWith가 추가 되어 있음

@WebMvcTest(Class명.class)

-()에 작성된 클래스만 실제로 로드하여 테스트를 진행
- 매개변수를 지정해주지 않으면 @Controller, @RestController, @RestControllerAdvice등 컨드롤러와 연관된 Bean이 모두 로드됨
- 스프링의 모든 Bean을 로드하는 @SpringBootTest대신 컨트롤러 관련 코드만 테스트할 경우 사용 

@Autowired about Mockbean

-Controller의 API를 테스트하는 용도인 MockMvc 객체를 주입 받음
- perform() 메소드를 활용하여 컨트롤러의 동작을 확인할 수 있음
- .andExpect(), andDo(), andReturn() 등의 메소드를 같이 활용함

@MockBean

- 테스트할 클래스에서 주입 받고 있는 객체에 대해 가짜 객체를 생성해주는 어노테이션
- 해당 객체는 실제 행위를 하지 않은
- given() 메소드를 활용하여 가짜 객체의 동작에 대해 정의하여 사용할 수 있음

@AutoConfigureMockMvc

- spring.test.mockmvc의 설정을 로드하면서 MockMvc의 의존성을 자동으로 주입
- MockMvc클래스는 REST API 테스트를 할 수 있는 클래스 

@Import

- 필요한 Class들을 Configuration으로 만들어 사용할 수 있음 
- Configuration Component 클래스도 의존성 설정할 수 있음
- Import된 클래스는 주입으로 사용가능

'Backend > Spring & Spring Boot' 카테고리의 다른 글

JVM 설정 변경  (0) 2024.10.25
Spring boot SSH 터널링 jsch 사용  (0) 2024.03.14
Spring batch 처리  (0) 2023.12.11
Spring Boot API 테스트 코드 구현  (0) 2023.07.04