Test Code

주빈·2024년 2월 5일
0

java

목록 보기
5/6

오늘은 Spring Framework 내 Test Code 작성에 대해서 기록해보자.

📘 Test Code

나는 기존에 테스트 코드의 작성 필요성도 잘 몰랐고 쓰는 방법도 몰랐다가 이번에 회사 패키지를 업그레이드 하면서 로직 및 쿼리에 대한 테스트를 위해 테스트 코드를 작성하면서 알게된 것들을 적어볼 것이다.

📜 Test Code 사용 이유

테스트 코드를 쓰기 전 테스트 과정

  1. 코드 및 쿼리 수정
  2. 서버 동작
  3. 테스트에 필요한 데이터를 DB에 입력
  4. 메소드 동작
  5. 테스트 마치고 DB 확인
  6. 반복....

위처럼 반복적으로 테스트 진행을 해야하는데 테스트 코드를 작성한다면 위의 프로세스를 간단하게 줄일 수 있다!!

테스트 코드 작성 후 테스트 과정 

  1. 코드 및 쿼리 수정
  2. 테스트 코드 실행
  3. 결과 확인

이렇듯 테스트 코드 작성이 필요한 이유는

  • 서버를 실행하는 등 시간 절약이 된다.
  • 필요한 데이터를 미리 기입하고, 테스트가 끝나고 정리하는 등의 행동을 하지 않아도 된다.
  • 문서로서의 역할이 가능하다.
    설명하자면 테스트 코드는 또한 개발자가 작성한 메소드가 어떻게 동작했으면, 어떤 결과를 반환 했으면, 하는 것을 작성한 것이기 때문에 처음 코드를 보는 개발자들이 테스트 코드를 통해 코드의 동작을 더 수월하게 이해할 수 있다.

📜 Test Code 작성법

그렇다면 테스트 코드는 어떻게 작성하면 될까??
나는 JUnit5 버전으로 테스트 코드를 작성하였고 기존에 있던 JUnit4 버전의 테스트 코드의 버전을 올려주었다.

이클립스 기준 기존에 테스트하고 싶은 로직(*Controller.java, *service.java, *mapper.java) 파일 우클릭하고 new -> other에서 JUnit Test Case를 선택하면 해당 클래스의 메서드 테스트 코드를 작성할 수 있다.

import java.util.HashMap;
import java.util.Map;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;

@ContextConfiguration("classpath:context-test.xml")
@ExtendWith(SpringExtension.class)
class GoodsResultMapperTest {

	@Autowired
	private GoodsMapper goodsMapper;

	@Test
	void testA() {
		Map<String, Object> param = new HashMap<>();
		param.put("gather_date_fr", "20190101");
		param.put("gather_date_to", "20231201");
		goodsMapper.a(param);
	}
}

위와 같이 작성 후 코드 실행 시 JUnit Test로 실행시키면 해당 메서드 테스트가 진행되고 아래처럼 성공 여부를 알 수 있다!!

✏ 테스트 코드 작성 시 썼던 기능들??

@DisplayName

@DisplayName("방송결과 > 방송사후관리 - 저장 성공")

위의 어노테이션을 클래스 및 메서드 단에 사용하게 되면 테스트 시

저렇게 @DisplayName으로 설정된 이름으로 노출이 된다.


assertEquals

로직에서 Return 하는 값이랑 동일한지 비교(정상 작동 확인)하기 위해서 assertEquals를 사용할 수 있는데

Map<String, Object> param = new HashMap<>();
param.put("key1", "val1")
String rtnMsg = AService.saveATx(param);

assertEquals('000000', rtnMsg, "저장 실패");

위와 같이 값이 다르게 나온다면 "저장 실패"가 노출이 된다.


assertThrows

단순 select 로직(쿼리)가 아닌 CUD 로직 사용 시에 Exception을 날리도록 로직이 짜여있는 경우 Test 코드에서 단순 Throw Exception 처리하는 것이 아니라 assertThrow를 통해 예외처리를 하면 된다.

assertThrows(ProcessException.class, () -> {
	.....
});

메서드 내에 예외처리가 발생하는 로직을 괄호 안에 작성하게 되면 로직에서 발생하는 예외(ProcessException)를 처리할 수 있다!!

profile
누구에게나 필요한 개발자가 꿈

0개의 댓글