-
[JUnit] JUnit 5를 사용한 TDDDEV/JUnit 2025. 1. 23. 16:32
TDD 핵심 개념TDD란 요구사항을 테스트로 뽑아낸 다음, 테스트를 통과하는 프로그램을 개발하는 과정을 되도록 짧게 반복하는 프로그래밍 기법이다.1. 코드를 작성하기 전에 실패하는 테스트를 작성한다.2. 테스트를 통과할 수 있는 가장 단순한 코드를 작성한다. 통념에 따르면 프로그램 개발이란 코드를 작성한 다음, 실행이 잘되는지 하나씩 따져가며 테스트하는 것을 의미했다.코드를 작성한다 => 테스트 한다 => (반복한다) 그러나 TDD는 이 개발 주기를 뒤집는다.테스트 한다 => 코드를 작성한다 => (반복한다) 즉 TDD안에서 테스트는 설계를 주도하고, 테스트 대상 메서드의 첫 번째 클라이언트가 되는것을 의미한다. TDD 장점- 분명한 목표를 가지고 코드를 짤 수 있을뿐더러, 애플리케이션이 해야 하는 일만..
-
[JUnit] 데이터베이스 애플리케이션 테스트DEV/JUnit 2025. 1. 22. 22:36
데이터베이스 테스트의 문제점1. 단위테스트는 코드를 격리시켜 실행해야한다, but 영속성 계층은 반드시 데이터베이스와의 상호작용이 필요하다.: 데이터베이스와 관련한 단위테스트는 테스트가 데이터베이스에 의존해야한다.2. 단위테스트는 작성과 실행이 쉬워야한다, but 데이터베이스에 접근하는 코드는 작성 및 실행이 번거롭다.: SQL 작성 및 수많은 try-catch-finally 코드를 작성해야한다.3. 단위테스트는 실행 속도가 빨라야한다, but 데이터베이스에 접근하는 코드들은 상대적으로 느리다.: 다수의 사용자가 접근이 가능한 원격 서버이기때문에 데이터베이스 접근 자체가 느림 이러한 문제를 데이터베이스 단위 테스트 시 발생하는 임피던스 불일치라고 한다.이는 객체 지향 프로그래밍과 관계형 데이터베이스 간 ..
-
[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..