Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- SQL
- 99클럽
- 참조변수타입변환
- Spring
- 백준
- string메서드
- 4A피드백
- API
- 프로그래머스
- SQ3R
- 동전교환알고리즘
- 배열탐색
- 자바
- ChatGPT
- Java
- 스레드동기화
- 제너릭메서드
- API명세서
- openapi
- staging_area
- 스프링
- 코딩테스트
- 날씨API
- 프로젝트
- 네이티브애플리케이션
- 향상된for문
- 루트사용자
- 파일사용권한
- 성장형마인드셋
- 재귀적사고
Archives
- Today
- Total
개발 공부용
Spring - Test, AssertJ, TDD 본문
소프트웨어 테스트
소프트웨어의 기능과 동작, 데이터 등이 의도한 대로 처리되는지 확인하는 과정.
결함을 찾아내고 수정한다.
- 독립적으로 격리된 환경을 만들고
- 특정 조건을 세팅하고
- 코드를 실행하여
- 내가 의도한 것과 결과값이 같은지 검증하는 것
테스트코드: 테스트를 반복할 수 있는 틀
- 테스트를 반복적으로 실행 가능하므로 문제 상황을 빠르게 재현해야 한다.
- 또한 테스트코드에는 의도한 시나리오 담겨있으므로 문서로서도 기능한다.
소프트웨어 테스트!=테스트
테스트코드 작성 패턴: Give - When - Then
- Given: 시나리오
테스트 준비과정, 테스트에 필요한 변수, 입력값 준비 - When: 실행
실제로 테스트 실행해보는 관계 - Then: 검증
예상값과 테스트 결과값을 비교하여 검증
테스트 코드에 사용하는 Annotation
- @SpringBootTest: Spring 컨텍스트 전체를 로드하여 통합 테스트 진행
- @WebMvcTest: Spring MVC 컨트롤러 테스트를 위한 애너테이션
- @DataJpaTest: JPA 관련 테스트를 위해 사용되는 애너테이션(DB 관련 bean만 로드), 테스트 실행 후 자동으로 롤백
- @Test: 테스트 메서드임을 나타냄
- @DisplayName: 테스트 이름 명시적으로 지정
- @MockBean: 서비츠 계층을 모킹 할 때 사용(특정 bean을 mock 객체로 대체할 때 사용)
- @BeforeEach: 테스트 시작 전 공통적으로 처리
- @AfterEach: 테스트 종료 후 처리
AssertJ
AssertJ는 자바 Junit 테스트 코드를 위한 라이브러리이다.
#기본 타입 검증
assertThat(1+1).isEqualTo(2)
assertThat("Hello").isNotEqualTo("World")
assertThat(true).isTrue()
assertThat(100).isGreaterThan(50)
assertThat.isBetween(1,10)
#컬렉션, 리스트 검증
assertThat(names).isNotEmpty();
assertThat(names).hasSize(3);
assertThat(names).contains("lee");
assertThat(names).containsExactly("lee","park")
assertThat(names).containsExactlyInAnyOrder("park","lee")
#예외 발생 검증
assertThatThrownBy(( ) -> {
throw new IllegalArgumentException("에러!");
}).isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("에러");
#map 검증
Map<String, Object> result = Map.of(
"name", "kim",
"age", 30
);
assertThat(result)
.isNotEmpty()
.containsEntry("name","kim")
.containsKeys("name","age")
.doesNotContainKey("password");
assertThat(user)
.extracting("email")
.isEqualTo("test@email.com")
TDD(Test Driven Develop)
테스트를 먼저 만든 다음 테스트 내용을 구현하면서 개발을 완성하는 방식
프로그래밍 순서
- 실패하는 작은 단위 테스트를 작성
- 빨리 테스트를 통과하기 위해 프로덕션 코드 작성. 가짜 구현을 작성할 수도 있음.
- 테스트 코드 작성
- 새로운 테스트를 통과하기 위한 프로덕션 코드 추가 혹은 수정
- 1-4 반복하여 실패/성공의 모든 테스트 케이스 작성
- 개발한 코드를 중복 제거하며 리팩토링
*가짜 구현?
아무 값이나 반환하도록 하는 것.
테스트가 통과하면 단계적으로 상수를 변수를 사용하도록 변경.
-> 재빨리 구현할 수 있는 간단한 작업은 그냥 구현해 버리는 것이 좋다.
#1. 테스트 먼저 작성 후
@Test
public void 곱하기테스트() {
// given
// when
final int result = multiply(2, 3);
// then
assertThat(result).isEqualTo(6);
}
#2. 테스트를 통과하는 가짜 코드 작성
public int multiply(final int num1, final int num2) {
return 6;
}
좋은 테스트?
- Fast: 빠르게 동작하여 자주 돌릴 수 있어야 함
- Independent: 각각의 테스트는 독립적이며 서로 의존해서는 안된다.
- Repeatable: 어느 환경에서도 반복 가능해야 한다.
- Self-Validating: 테스트는 성공 또는 실패로 결과를 내어 자체적으로 검증해야 한다.
- Timely: 테스트는 실제 코드를 구현하기 직전에 구현해야 한다.
참고 자료|
'Java|Spring' 카테고리의 다른 글
[JAVA] 가변 인자 (0) | 2025.05.16 |
---|---|
Spring - ORM, JPA, 커넥션 풀 (0) | 2025.04.01 |
Spring - Websocket, Simple Broker, External Broker (0) | 2025.03.28 |
Spring - 웹소켓과 STOMP (0) | 2025.03.27 |
Spring - IoC, DI, AOP (0) | 2025.03.26 |