일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- React+JPA
- 로컬이미지저장
- 개발자취업후기
- MySQL
- springboot
- @Transactional
- SpringBoot JPA
- 게시물수정
- WebConfig
- React.js
- 게시물상세
- CRUD
- 비전공자개발자
- React+SpringBoot
- 비전공개발자
- 개발자취업
- I/OStream
- 게시판 CRUD
- 로컬이미지삭제
- 테스트코드작성
- jsp
- 게시판
- given when then
- jstl
- Self-invocation
- mybatis
- 로컬이미지불러오기
- 단위테스트코드
- jar빌드
- JPAHibernate
- Today
- Total
인텔리가 '되고 싶은' 인텔리재이
JUnit을 활용한 (우당탕탕) 단위 테스트 코드 작성기 본문
코드가 제대로 작성되었는지 테스트하기 위해 매번 프로젝트를 끄고 켜고를 반복하던 어느 날...
바쁘지 않은 기간동안 자신이 개발한 기능에 대한 단위 테스트 코드를 짜보라는 미션을 받게 되었습니다!
'아니... 그냥 코드도 짜기 힘든데 테스트 코드라니...😂' 라는 생각이 앞섰지만,
요즘 '선 테스트 후 개발 방식' 프로그래밍 방법인 TDD ( Test Driven Development ) 라는 용어도 자주 들리고 있고
이번 기회에 한번 해보자! 라는 생각으로 도전한 '우당탕탕(?) JUnit을 활용한 단위 테스트 코드 작성기' 입니다.😉
JUnit
JUnit은 자바 언어를 위한 단위 테스트 프레임워크입니다.
단위 테스트란 작성한 코드가 의도대로 작동하는지 작은 단위로 검증하는 것인데,
이때 단위는 보통 메소드가 사용되며 JUnit을 사용하면 단위 테스트를 작성하고 테스트하는 데 도움을 줍니다.
특징
- 테스트 방식을 구분할 수 있는 어노테이션을 제공함
- @Test 어노테이션으로 메소드를 호출할 때마다 새 인스턴스를 생성함, 독립 테스트가 가능함
- 예상 결과를 검증하는 어설션(assertion) 메소드를 제공함
- 사용 방법이 단순함, 테스트 코드 작성 시간이 적음
- 자동 실행, 자체 결과를 확인하고 즉각적인 피드백을 제공함
Spring boot에 기본적으로 내장되어있기 때문에, 사용을 위한 별도의 준비 없이 바로 코드를 작성할 수 있습니다!😉
given - when - then
단위 테스트 코드를 작성하기 전, 테스트 코드를 작성하는 방식인 given-when-then 패턴에 대해 알아봅시다👓
- given : 테스트 실행을 준비하는 단계 (초기 설정)
- when : 테스트를 진행하는 단계 (조건)
- then : 테스트 결과를 검증하는 단계 (결과)
단위 테스트 코드 작성 🖥️
이제 본격적으로 단위 테스트 코드를 작성해 볼 시간🫡
테스트 코드 작성을 위해 첫번째 할일은 테스트 코드가 들어갈 파일을 만드는 일이겠죠!
이미 테스트하고자 하는 기능(ex.Service단에 구현한 메소드)이 만들어져 있다고 가정하고,
작성한 메소드의 이름에 커서를 두고 (IDE : IntelliJ / Window 기준) Ctrl + Shift + T 를 누르면
하단의 사진과 같이 새로운 Test를 만들 수 있습니다!👌
테스트 하고자 하는 메소드의 위치 경로가 src > java > testService 라고 가정한다면,
이와 동일하게, test > java > testService 경로에 자동으로 테스트 파일이 생성됩니다! (역시 인텔리한 IntelliJ 🙌)
테스트 코드가 들어갈 파일을 생성했다면, 이제 본격적으로 코드를 작성해볼 시간!
처음 테스트 파일을 생성하면, 다음과 같이 생성됩니다.
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class createServiceTest {
@Test
void createTest() {
}
}
- JUnit5 를 위한 테스트 코드 API 인 Jupiter import
- 예상 결과를 검증하는 Jupiter의 어설션(assertion) 메소드 import
- @Test : 해당 메소드가 테스트 메소드임을 알리는 어노테이션
@Test 어노테이션 외에, 테스트에서 사용되는 다양한 어노테이션 중 몇 개를 소개해드리겠습니다.
- @DisplayName : 테스트 케이스를 실행했을 때 콘솔창에 보이는 이름을 설정하는 메소드 (한글로도 작성 가능!)
- @Mock : 실제 객체를 대신해주는 테스트용 객체를 생성하는 메소드
- @BeforeEach : 테스트 케이스 1개가 시작될 때마다 실행되는 메소드
- @AfterEach : 테스트 케이스 1개가 끝날 때마다 실행되는 메소드
@BeforeEach
void testStart() {
log.info("====================== TEST START ======================");
}
@AfterEach
void testEnd() {
log.info("====================== TEST END ======================");
}
@Test
@DisplayName("테스트 코드")
void test_Success() {
log.info("테스트 성공적");
}
예를 들어 다음과 같이 @BeforeEach, @AfterEach 어노테이션을 붙인 메소드,
그리고 테스트 코드를 다음과 같이 작성했다고 가정해보겠습니다.
테스트를 실행할때마다 콘솔창에 다음과 같이 출력되는 것을 확인할 수 있습니다🙌
어노테이션을 살펴봤다면, 이제 given-when-then 패턴에 맞춰 테스트 코드를 작성하면 됩니다!
@Test
@DisplayName("테스트 - 유형 OUT 등록 성공")
void addTestOrderTypeOut_Success() {
//given
TestOrderDTO outTest = createTestOrder("OUT");
when(testService.getDetailById(outTest.getFromLocId(), TestDTO.class))
.thenReturn(getTestInfoByTestOrder(outTest));
//when
testOrderBizService.addTestAdjust(outTest);
//verify
verify(testSyncService, times(1)).modify(any(TestProcessDTO.class));
verify(testOrderService, times(1)).save(any(TestDTO.class));
}
- given : when 부분을 실행하기 위한 준비작업으로, outTest 생성
- when : given 부분에서 생성된 outTest를 파라미터로 addTestAdjust 메소드 실행
- verify(then) : when 절을 실행했을때, 결과가 이렇게 나올 것이다를 확인하는 부분
- when 의 addTestAdjust를 실행했을때, testSyncService의 modify는 오직 1번만 실행될 것
- when 의 addTestAdjust를 실행했을때, testOrderService의 save는 오직 1번만 실행될 것
- then 부분에서 assert 메소드 사용
만약 테스트 코드가 잘 작성되었다면, 콘솔창에 체크 표시와 함께 'Test Passed' 라는 문구를 확인하실 수 있습니다😉
처음 테스트 코드를 작성할 때는 너무나도 낯설고 마냥 막막하고, 구글링을 해도 이게 뭐지...? 싶은 느낌이 들었는데,
직접 테스트 코드를 작성해보고, 실행해보고 'Test Failed'도 맞닥뜨리면서 우당탕탕 삽질을 하다
처음으로 'Test Passed'가 나왔을 때의 그 기쁨이란!!🤣
이번 기회를 통해 TDD를 경험해보고, 테스트 코드와 조금은 친숙해진 것 같아 뿌듯했습니다!😉