내배캠 심화과제로 저번에 했던 개인과제 프로젝트인 to-do-list 앱에 대한 테스트코드를 작성을 해야한다.
단위 테스트와 통합 테스트 코드를 작성해야하는데, 우선 단위 테스트 코드를 작성하기로 했다.
테스트코드를 작성하기 전,
단위테스트가 무엇인지와 단위 테스트를 할 수 있게 도와주는 Mockito라이브러리에 대해 정리를 하려한다.
Unit Test (단위 테스트) 란?
소스코드의 특정 모듈(프로그램 내 하나의 기능을 부르는 말)이 의도된 대로 정확히 작동하는지 검증하는 절차이며,
함수, 메서드, 개별 코드 같은 작은 단위에 대해 테스트 케이스(Test Case)로 분리하고 테스트 코드를 작성하여 테스트하는 것을 말한다.
SpringMVC 기준으로 쉽게 말하자면 각 레이어 (Controller, Service, Repository) 안에 구현한
메서드 기능에 대해 모두 테스트 하는 것이다.
Unit Test (단위 테스트) 장점?
단위 테스트의 장점은 다음과 같다.
테스트 시간 단축으로 문제점 발견 가능성이 높아지고 안정성이 향상
단위 테스트의 목적은 프로그램의 각 부분을 고립시켜서 각각의 부분이 정확하게 동작하는지 확인하는 것이다. 이를 통해 문제 발생 시 정확하게 어느 부분이 잘못되었는지를 재빨리 확인할 수 있게 해 준다.
따라서 프로그램의 안정성이 높아진다.
단위 테스트는 개발 시간을 증가시키는 것처럼 보이지만 개발 기간 중 대부분을 차지하는 디버깅 시간을 단축시킴으로써
여유로운 프로그래밍을 가능케 한다.
이전 기능도 함께 테스트하기 때문에 더 쉬워진 코드 변경
프로그래머는 단위 테스트를 믿고 리팩토링을 할 수 있다. 리팩토링 후에도 해당 모듈이 의도대로 작동하고 있음을 단위 테스트를 통해서 확신할 수 있다. 이를 회귀 테스트(Regression Testing)라 한다.
어떻게 코드를 고치더라도 문제점을 금방 파악할 수 있고 수정된 코드가 정확하게 동작하는지 쉽게 알 수 있게 되므로 프로그래머들은 더욱더 의욕적으로 코드를 변경할 수 있게 된다.
테스트 간 결합도가 낮으므로 간단해진 통합
단위 테스트는 단위 자체의 불확실성을 제거해주므로 상향식(Bottom-up) 테스트 방식에서 유용하다.
먼저 프로그램의 각 부분을 검증하고 그 부분들은 합쳐서 다시 검증하는 통합 테스트에서 더욱더 빛을 발한다.
Mockito 란?
Mockito는 개발자가 동작을 직접 제어할 수 있는 가짜 객체를 지원하는 테스트 프레임워크이다.
일반적으로 Spring으로 웹 애플리케이션을 개발하면, 여러 객체들 간의 의존성이 생긴다.
이러한 의존성은 단위 테스트를 작성을 어렵게 하는데,
이를 해결하기 위해 가짜 객체를 주입시켜주는 Mockito 라이브러리를 활용할 수 있다.
Mockito를 활용하면 가짜 객체에 원하는 결과를 Stub하여 단위 테스트를 진행할 수 있다.
물론 프레임워크 도구가 필요없다면 사용하지 않는 것이 가장 좋다.
예로 서비스 레이어 단위 테스트를 진행을 한다면,
서비스 레이어에서는 repository에 대한 의존성을 가지고있다.
의존하는 객체에서 제공하는 객체나 행위에 대해 Mock(가짜, 모의)을 만들어 준다.
가짜를 만들어 줌으로써 해당 영역의 의존성을 제거하고 오로지 테스트 대상 모듈에만 집중하여 테스트할 수 있게 도와준다.
Mockito 메소드 종류
mock() : Mock 객체를 생성해주는 메소드
ex) Person p = mock(Person.class); -> Person을 Mock 객체로 생성
when() : Mock 객체의 메소드 반환 값을 지정해주는 메소드
ex) when(p.getName()).thenReturn("min"); -> p.getName()이 호출되었을 때 min을 반환하도록 지정
verify() : Mock 객체에서 메소드가 호출 되었는지를 확인해주는 메소드
ex) verify(p).getName(); -> p.getName()이 호출되었는지를 확인
times() : 지정한 횟수 만큼 Mock 객체의 메소드가 호출 되었는지를 확인해주는 메소드
ex) verify(p, times(1)).getName(); -> p.getName()이 1번 호출되었는지를 확인
never() : Mock 객체의 메소드가 호출 안되었는지를 확인해주는 메소드
atLeast(), atMost() : Mock 객체의 메소드가 최소, 최대 지정 횟수 만큼 호출 되었는지를 확인해주는 메소드
timeOut() : Mock 객체의 메소드가 지정된 시간안에 호출되었는지를 확인해주는 메소드
참조
https://mangkyu.tistory.com/145
'TIL' 카테고리의 다른 글
2023.12.01 TIL - 테스트 환경 (H2) 분리 중 만난 문제 (Feat. Security MvcRequestMatcher) (0) | 2023.12.01 |
---|---|
2023.11.30 TIL - 테스트의 범위.. (0) | 2023.11.30 |
2023.11.28 TIL - OAuth란? (0) | 2023.11.28 |
2023.11.23 TIL - JPA 복합키 사용하기 (Feat. 팔로우 API) (1) | 2023.11.23 |
2023.11.22 TIL - 엔티티를 저장할 때, 연관관계 엔티티 저장 방법에 대해서 (feat. referenceBy) (0) | 2023.11.22 |