테스트 주도 개발 (Test Driven Development, TDD)
- 테스트 관련 어노테이션 및 클래스
- @WebMvcTest
- @Controller, @RestController가 설정된 컨트롤 클래스를 테스트한다.
- @Service, @Repository에는 사용할 수 없다.
- MockMvc
- 웹 API를 테스트할 때 가상의 HTTP 요청을 만들어주는 클래스이다.
- @Disabled
- 테스트 메소드를 비활성화 시키는 어노테이션
- @BeforeAll
- 테스트 클래스 기준으로 테스트 메소드들이 실행되기 전에 한번만 실행
- @AfterAll
- 테스트 클래스 기준으로 테스트 메소드들이 실행된 후에 한번만 실행
- 예로 리소스 정리 같은 코드 작성
- @BeforeEach
- 각 테스트 메소드가 실행되기 전에 매번 실행
- @AfterEach
- 각 테스트 메소드가 실행된 후에 매번 실행
- @WebMvcTest
- Assert 함수
- 테스트 케이스의 수행 결과를 판별하는 메소드
- 종류
- assertArrayEquals(a, b)
- 배열 a와 b가 일치함을 확인한다.
- assertEquals(a, b)
- 객체 a와 b가 일치함을 확인한다.
- 객체에 정의되어 있는 equals를 통해 비교한다.
- assertSame(a, b)
- 객체 a와 b 가 같은 객체임을 확인 한다.
- 객체 자체를 비교한다. (==)
- assertTrue(a)
- 조건 a가 참인지를 확인한다.
- assertFalse(a)
- 조건 a가 거짓인지를 확인한다.
- assertNotNull(a)
- 객체 a가 null인지 확인한다.
- assertAll()
- 모든 종류의 assert를 각각 다 실행한다. 중간에 멈추지 않는다.
- assertArrayEquals(a, b)
- 예시
-
@Test void assertTest(){ assertArrayEquals( arr1, arr1 ); assertArrayEquals( arr1, arr2 ); // 값 비교 assertEquals( 3, adder.add(1, 2) ); // 주소값 비교 assertSame( adder, adder ); assertSame( adder, arr1 ); // 조건절이 true일때 통과 assertTrue( 10 < 20 ); assertTrue( 10 > 20 ); // 조건절이 false일때 통과 assertFalse( 10 > 20 ); // null이 아니면 통과 assertNotNull( adder ); assertNotNull( null ); // 람다식 리스트 assertAll( () -> assertFalse(false, "Exception"), () ->{ Object obj = new Object(); assertNotNull(obj, "not null"); } ); }
-
- AssertJ 라이브러리
- JUnit5의 Assert 함수와 비슷한 라이브러리
- assertThat으로 시작하는 함수들이다.
- 메소드 체이닝을 지원하기 때문에 좀더 깔끔하고 읽기쉬운 테스트 코드를 작성할 수 있다.
- 개발자가 테스트하면서 필요한 대부분의 메소드 제공
- AssertJ 사용 방법
- dependencies 추가
- testCompile 'org.assertj:assertj-core:3.6.2'
- BDD (행동주도개발) 단계로 테스트 하기
- given(초기값) - when(조건) - then(기대하는 결과값 )
- 예시
-
@Test @DisplayName("isTrue 테스트") void test1() { // given // when User user = new User("hong", "", "bank@gmail.com"); // then Assertions.assertThat("".isEmpty()).isTrue(); Assertions.assertThat(user.getName().isEmpty()).isFalse(); Assertions.assertThat(user.getNickname().isEmpty()).isTrue(); }
-
- dependencies 추가
- Controller Test 방법
- build.gralde- dependencies 추가
-
implementation 'com.google.code.gson:gson' //gson 의존성 추가 : json구조를 띄는 직렬화된 데이터를 JAVA의 객체로 역직렬화, 직렬화 해주는 자바 라이브러리 testCompileOnly 'org.projectlombok:lombok' // lombok 테스트 의존성 추가 testAnnotationProcessor 'org.projectlombok:lombok' // lombok 테스트 의존성 추가
-
- Controller 클래스 작성
- Controller 이름에서 마우스 오른쪽- Generate- Test 클릭 후 테스트할 메소드 클릭 후 OK
- ControllerTest 클래스 자동 생성 완료
- ControllerTest 클래스
- 클래스에 어노테이션 주입
- @WebMvcTest(Controller클래스명.class)
- MockMvc 생성자 주입
- 해당 변수에 @Autowired 어노테이션 주입
- @Autowired private MockMvc mockMvc;
- 테스트 메소드 작성
- 메소드에 어노테이션 주입
- @Test
- @Displayname(”콘솔에 출력할 이름”)
- mockMvc.perform() 사용하여 작성
- perform() 사용 시 메소드는 throws Exception으로 예외처리 해야한다.
- 메소드에 어노테이션 주입
- 예시
-
import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; 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.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @WebMvcTest(MainController.class) class MainControllerTest { @Autowired private MockMvc mockMvc; @Test @DisplayName("main() 테스트") void main() throws Exception { Member member = new Member("hong", "1234"); mockMvc.perform(get("/")) .andExpect(status().isOk()) .andExpect(view().name("index")) .andExpect(model().attributeExists("member")) // .andExpect(model().attribute("member", member)) .andExpect(model().attribute("list", Matchers.contains("hong", "lee"))) .andDo(print()); } }
-
- 클래스에 어노테이션 주입
- build.gralde- dependencies 추가
Scheduler
- 스케줄러 관련 어노테이션
- @EnableAsync
- 비동기적으로 처리하도록 제공하는 어노테이션
- 각기 다른 스레드에서 실행된다.
- @Async
- 해당 메소드 로직이 시작되는 시간을 기준으로 milli sec 간격으로 실행
- 이전 작업이 완료될 때까지 다음 작업이 진행되지 않음
- @Scheduled(fixedRate = n)
- 스케줄 옵션을 설정하는 어노테이션
- 해당 어노테이션을 사용하면 일정한 시간 간격이나 특정 시간에 코드가 실행되도록 설정할 수 있다.
- n에는 초를 설정하며, 값이 1000이면 1초이다.
- 속성
- fixedRate
- 작업 수행시간과 상관없이 일정 주기마다 메소드 호출
- fixedDelay
- 작업을 마친 후부터 주기 타이머가 돌아 메소드 호출
- initialDelay
- 스케줄러에서 메소드가 등록되자마자 수행하는 것이 아닌 초기 지연시간을 설정
- cron
- Cron 표현식을 사용하여 작업 예약
- 표현식은 6자리 설정만 허용하며 연도 설정은 할 수 없다.
- 초(0~59) 분(0~59) 시간(0~23) 일(1~31) 월(1~12) 요일(0~7)
- @Scheduled(cron = "* * * * * *")
- 예시
-
@Scheduled(cron = "0 15 10 15 * ?") public void task3() { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date now = new Date(); String strDate = sdf.format(now); log.info("cron task - {}", strDate); }
-
- fixedRate
- @EnableAsync
- 스케줄러 구현
- Scheduler 클래스 생성
- 클래스에 어노테이션 주입
- @Component
- @Slf4j
- @EnableAsync
- 메소드 생성
- 메소드에 어노테이션 주입
- @Scheduled(fixedRate = n)
- throws InterruptedException으로 예외 처리
- 메소드에 어노테이션 주입
- 예시
-
@Component @Slf4j @EnableAsync public class Scheduler { @Scheduled(fixedRate = 1000) public void task1() throws InterruptedException { log.info("FixedRate task - {}", System.currentTimeMillis()/1000); log.info("dead!"); } }
-
- 클래스에 어노테이션 주입
- Scheduler 클래스 생성
- 스레드 개수 설정
- SchedulerCongif 클래스 생성
- implements SchedulingConfigurer 후 configureTasks(ScheduledTaskRegristrar taskRegistrar) 함수 오버라이드
- 예시
-
@Configuration public class SchedulerConfig implements SchedulingConfigurer { @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { // Thread Pool 설정 ThreadPoolTaskScheduler threadPool = new ThreadPoolTaskScheduler(); // Thread 개수 설정 int n = Runtime.getRuntime().availableProcessors(); threadPool.setPoolSize(n); threadPool.initialize(); taskRegistrar.setTaskScheduler(threadPool); } }
-
- SchedulerCongif 클래스 생성
728x90
'교육 (Today I Learned) > Hanaro' 카테고리의 다른 글
[Hanaro] 63일차 / Spring Boot (Repository - Service - Controller) (0) | 2024.04.18 |
---|---|
[Hanaro] 62일차 / REST API(CRUD), JSP (0) | 2024.04.18 |
[Hanaro] 60일차 / Spring Boot (JPA, HttpSession, Logging) (0) | 2024.04.13 |
[Hanaro] 59일차 / MyBatis (0) | 2024.04.10 |
[Hanaro] 58일차 / Spring Boot (Thymeleaf Layout), JSP (0) | 2024.04.10 |