개발 공부용

Spring - Test, AssertJ, TDD 본문

Java|Spring

Spring - Test, AssertJ, TDD

솝제로 2025. 4. 3. 18:20

 

소프트웨어 테스트

 

소프트웨어의 기능과 동작, 데이터 등이 의도한 대로 처리되는지 확인하는 과정.

결함을 찾아내고 수정한다.

  • 독립적으로 격리된 환경을 만들고
  • 특정 조건을 세팅하고
  • 코드를 실행하여
  • 내가 의도한 것과 결과값이 같은지 검증하는 것

 

테스트코드: 테스트를 반복할 수 있는 틀
  • 테스트를 반복적으로 실행 가능하므로 문제 상황을 빠르게 재현해야 한다.
  • 또한 테스트코드에는 의도한 시나리오 담겨있으므로 문서로서도 기능한다.

소프트웨어 테스트!=테스트

 

 

테스트코드 작성 패턴: 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. 실패하는 작은 단위 테스트를 작성
  2. 빨리 테스트를 통과하기 위해 프로덕션 코드 작성. 가짜 구현을 작성할 수도 있음.
  3. 테스트 코드 작성
  4. 새로운 테스트를 통과하기 위한 프로덕션 코드 추가 혹은 수정
  5. 1-4 반복하여 실패/성공의 모든 테스트 케이스 작성
  6. 개발한 코드를 중복 제거하며 리팩토링

*가짜 구현?

아무 값이나 반환하도록 하는 것.

테스트가 통과하면 단계적으로 상수를 변수를 사용하도록 변경.

-> 재빨리 구현할 수 있는 간단한 작업은 그냥 구현해 버리는 것이 좋다.

 

#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: 테스트는 실제 코드를 구현하기 직전에 구현해야 한다.

 

 

 

 

참고 자료|

https://mangkyu.tistory.com/182

'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