DEV
-
[JUnit] REST API 테스트 하기DEV/JUnit 2025. 1. 7. 20:55
REST란 (representational state transfer) 웹 서비스를 구현하기 위한 소프트웨어 아키텍처 스타일로REST를 만족하기 위해서는 많은 조건을 따라야한다. 이러한 조건을 따르는 웹 서비스를 RESTful 웹 서비스라고 한다. REST 아키텍처 스타일은 다음과 같이 6가지 요건을 정의한다.1. 클라이언트-서버 관계: 클라이언트와 서버는 서로 분리되어 있으며 각각 다른 역할을 한다.보통 클라이언트는 사용자에게 보여지는 부분과 관련 있고, 서버는 데이터 저장이나 도메인 모델 로직과 관련된다. 2. 무상태성: 서버는 클라이언트의 요청과 요청 사이에 클라이언트에 관한 상태 정보를 따로 보관해 두지 않는다.그러므로 클라이언트의 요청은 해당 요청에 응답하기 위해 필요한 모든 정보를 포함해야한다..
-
[JUnit] Spring Boot 애플리케이션 테스트DEV/JUnit 2024. 12. 10. 17:33
Spring Initializr 를 이용해 Spring 프로젝트 만들기https://start.spring.io/해당 페이지에서 스프링을 구동하기 위한 최소한의 설정을 가지고 스프링 부트 프로젝트 뼈대를 만들어줌- Explore : 생성될 프로젝트에 대한 세부정보 확인 가능- Generate : 프로젝트가 포함된 zip파일 다운로드 JUnit5로 테스트한 Spring 애플리케이션을 Spring Boot로 전환하기예제 코드 : https://github.com/devkunst/junit-in-action-third-edition-kr/tree/master/ch17-spring-boot/ch17-spring-boot-initializr-old-feature 1. 패키지 구조 설정- model : 모델 클래..
-
[JUnit] JUnit5 extension (확장 모델)DEV/JUnit 2024. 10. 22. 19:57
JUnit4의 경우 runner와 rule을 사용하여 테스트를 확장할 수 있었다.JUnit5 확장 모델은 Extension API라는 단일 개념으로 설명할 수 있다.Extension 자체는 내부에 필드나 메서드가 없는 인터페이스인 마커 인터페이스일 뿐이다. 마커 인터페이스?더보기태그 인터페이스 또는 토큰 인터페이스라고도 불리며 구현 메서드가 따로 없는 인터페이스로, 해당 인터페이스를 구현하는 클래스에 특별한 의미나 기능을 부여하기 위해 사용한다. 대표적인 사례로 Serializable, Cloneable 인터페이스가 있다. Serializable 인터페이스에는 구현 메서드가 없지만 해당 인터페이스를 구현하는 클래스는 직렬화 속성을 갖는다는 것을 나타낼 수 있다. * 사용 목적JUnit5 extensi..
-
컨테이너를 활용한 통합 테스트DEV/ETC 2024. 9. 24. 20:45
일반적으로 모의객체를 활용한 단위 테스트는 컨테이너에서 제공하는 객체는 모의하기 어렵고, 테스트를 작성하기 복잡하다는 한계가 있다.ex) HttpConnection, HttpServletRequest, HttpSession 등 컴포넌트와 컨테이너컴포넌트는 애플리케이션 또는 애플리케이션의 일부를 말한다. 컨테이너는 컴포넌트가 실행되고 있는 격리된 공간을 말한다. 컨테이너는 생애주기, 보안, 트랜잭션 등 컴포넌트를 위한 서비스를 제공한다.ex) JSP의 컨테이너 Tomcat, Jetty 모의객체를 사용하지 않고 실제 컨테이너에서 필요한 객체와 메서드에 직접 접근하여 테스트를 배포하고 실행하는 방식을 컨테이너를 활용한 테스트라고한다. 컨테이너를 활요한 테스트 구현 전략서버측과 클라이언트측 두가지 접근 방식으로..
-
[JUnit] 모의 객체 프레임워크 EasyMock / JMock / MockitoDEV/JUnit 2024. 9. 11. 00:06
모의 객체를 사용하기 위한 유용한 클래스를 제공하는 오픈 소스 프레임워크- EasyMock- JMock- Mockito EasyMockmaven org.easymock easymock 5.4.0 gradletestImplementation group: 'org.easymock', name: 'easymock', version: '5.4.0' EasyMock을 활용한 TestAccountServiceimport org.junit.jupiter.api.AfterEach;import org.junit.jupiter.api.BeforeEach;import org.junit.jupiter.api.Test;import static org.easymock.EasyMock.*;import static..
-
[JUnit] 모의객체를 활용해 리팩터링하기DEV/JUnit 2024. 8. 27. 09:03
테스트를 단순하게 만들 목적으로 런타임 코드를 변경해서는 안된다는 통념이 있다. 그러나 이는 옳지않다.단위 테스트는 런타임 코드의 가장 중요한 클라이언트이며, 코드가 테스트하기에 충분히 유연하지않다면 코드를 수정하는 것은 당연하다. 다음 예제에서 문제를 찾아보자.import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import java.util.PropertyResourceBundle;import java.util.ResourceBundle;public class DefaultAccountManager1 implements AccountManager { private static final Log logg..
-
[JUnit] 모의 객체로 테스트하기DEV/JUnit 2024. 8. 25. 23:09
모의객체를 사용하면 가능한 한 가장 세밀한 수준에서 테스트를 실행할 수 있다.각 메서드별로 개별적인 단위 테스트를 만들어 개발하는 것이 가능하다. 모의 객체란?모의 객체는 비즈니스 로직의 일부만을 다른 부분과 격리해 테스트하는데 적합하다. 모의 객체는 테스트 대상인 메서드가 사용하는 객체를 대체하여 테스트 대상 메서드는 다른 객체와 격리되는 효과가 생긴다. 다른 클래스나 메서드와 격리된 상태에서 테스트를 하면 큰 이점이 있다. 격리된 상태에서의 테스트는 다른 부분의 코드가 완성되는 것을 기다리지 않고 한 부분의 코드를 단위 테스트하는 데 큰 도움이 된다.모의 객체를 사용할 때의 가장 큰 장점은 메서드에 집중하는 테스트를 만들 수 있다는 것이다. 모의 객체를 사용하면 테스트 대상 메서드가 다른 객체를 호출..
-
[JUnit] 스텁을 활용한 테스트DEV/JUnit 2024. 7. 14. 23:26
애플리케이션을 개발하다보면 몇몇 코드가 다른 클래스나 외부 환경에 의존하는 경우가 있다.특정한 런타임 환경에 의존하는 애플리케이션을 위한 단위 테스트를 작성하기는 매우 어렵다. 실제로 필요한 환경을 테스트의 일부로 구성하여 테스트를 수행하는것은 효과적이나 이는 항상 가능한 방법이 아니다.실제 장비 지원 없이도 소스 코드에 대한 테스트를 지속적으로 작성하고 실행할 수 있도록 가짜 객체를 활용해야 하는데, 방법은 스텁과 모의객체를 활용하는 것 두 가지가 있다. 이번 글에서는 스텁을 활용한 방법을, 다음 글에서는 모의 객체를 활용하는 방법을 정리하고자한다. 스텁호출자를 실제 구현 코드에서부터 격리하기 위해 실제 코드 대신 런타임에 동작하는 코드를 말한다. 단순하게 만든 스텁으로 실제 코드의 복잡한 기능을 대체..