본문 바로가기

Spring/Test

[Springboot] MockMvc를 이용해서 테스트하기 1. 용어 정리 - 목(Mock): 테스트를 위해서 만든 모형 - 모킹(Mocking): 테스트를 위해 실제 객체와 비슷한 모의 객체를 만드는 것 - 목업(Mock-Up): 모킹한 객체를 메모리에서 얻어내는 과정 2. 서블릿 컨테이너 모킹 Controller를 테스트할 때 서블릿 컨테이너를 모킹을 위해 @WebMvcTest 또는 @AutoConfigureMockMvc 사용함 스프링 3.2부터 스프링 프레임워크는 스프링 MVC를 모킹하여 웹 애플리케이션을 테스트하는 아주 유용한 기능을 제공한다. 이 기능으로 실제 서블릿 컨테이너에서 컨트롤러를 실행하지 않고도 컨트롤러에 HTTP 요청을 할 수 있다. 스프링 Mock MVC 프레임워크는 애플리케이션을 마치 서블릿 컨테이너에서 실행하는 것처럼 스프링 MVC를 .. 더보기
[Springboot] SpringBoot 테스트 @SpringBootTest 1. @SpringBootTest? 1) 사용 목적 - 애플리케이션의 모든 구성요소를 로드하여 테스트 환경을 설정 - 실제 애플리케이션과 유사한 테스트를 제공 cf) @Runwith JUnit에서 기본적으로 제공하는 러너가 아닌 스프링 러너를 사용하는 경우 사용 2) 코드 예시 import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest public class PropertiesTest { @Test public void testMehtod() { } } 2. @SpringBootTest의 속성 속성 설명 classes 테스트할 클래스 지정 (생략 시 어플리케이션에 .. 더보기
AssertJ 1. AssertJ JUnit에서 제공하는 assert() 메소드의 부족한 표현력을 충족시켜줌 타입별로 다양한 검증 메소드를 제공하여 테스트 코드를 더욱 쉽게 작성할 수 있게 도와줌 JUnit assert() 와 AssertJ 비교 id가 "a"를 포함하고 있는 지 여부 검사 // JUnit assert()사용 코드 assertTrue(id.contains("a")); // 단언 실패 메시지, 실패 이유를 알 수 없음 org.opentest4j.AssertionFailedError: expected: but was: // AssertJ 사용 코드, id가 "a" 를 포함하는 지 여부를 검사한다는 것을 직관적으로 확인할 수 있음 assertThat(id).contains("a"); // 단언 실패 메시지,.. 더보기
TDD, 대역을 이용한 테스트 1. 대역 test double는 대역을 뜻함 실제 기능을 구현하지 않고 단순한 구현으로 실제 구현을 대체 2. 대역의 종류 대역 설명 스텁(Stub) 구현을 단순한 것으로 대체 테스트에 맞게 단순 동작 기능 수행 가짜(Fake) 제품에 적합하지 않지만 실제 동작하는 구현 제공 스파이(Spy) 호출된 내역 기록 기록한 내용은 테스트 결과 검증 시 사용 스텁이기도 함 모의(Mock) 기대한대로 상호작용하는지 행위를 검증 기대한대로 동작하지 않을 시 Exception 발생할 수 있음 스텁이자 스파이 상위 타입 인터페이스를 만들고, 그 인터페이스를 상속받아서 구현 1) 스텁(Stub) - 실제 기능 구현을 하지 않고 단순 동작 기능을 수행하는 Stub 대역 /** * CardNumberValidator(실제 .. 더보기
TDD, 테스트 코드의 구성 1. 상황 찾기 어떤 상황이 실행 결과에 영향을 줄 수 있는지 찾기 위한 노력 필요 다양한 예외 상황을 찾아내고 이를 코드에 반영해야 기능이 비정상적으로 동작하는 것을 막을 수 있음 2. 테스트 코드의 구성 요소 기능은 상황에 따라 달라 지기 때문에 상황(given), 실행(when) 결과 확인(then) 세 가지 요소로 테스트를 구성할 수 있음 JUnit에서 상황을 설정하는 방법은 테스트할 대상에 따라 달라짐 1) 각 테스트 메서드마다 객체를 생성해서 상황 설정 public class BaseballGameTest { @Test void exactMatch() { // given BaseballGame game = new BaseballGame("456"); // when Score score = ga.. 더보기
TDD 테스트 주도 개발, 기능 명세와 설계 1. 기능 명세 1) 다양한 형태의 요구사항 문서를 이용해서 기능 명세를 구체화함(입력과 결과를 도출) 2) 기능을 크게 입력과 결과 두 가지로 나눈다 - 입력: 보통 메소드의 파라미터로 전달 받음 - 결과: 여러 형식으로 정의, 리턴 값으로 보내주거나 Exeption 결과를 보내줄 수 있음 기능 명세 구체화를 돕는 TDD 개발자는 스토리보드나 와이어프레임 같은 형태로 요구사항을 전달 받지만 이런 문서는 개발자가 기능을 구현하기에 생략된 내용이 많음 테스트 코드를 작성하기 위해서는 파라미터, 결과값을 정해야하므로 기능을 입력과 결과로 도출 해야함 ex. 선불 1만원 지불 시 한달 이용 가능한 서비스의 만료일 구하기 Q. 4월 30일에 1만원 지불 시 5월 30일이 아닌 31일이 만료일이 맞는지? Q. 1.. 더보기
TDD 테스트 코드 작성 방법 1. 순서 정하기 1) 쉬운 경우에서 어려운 경우로 진행 2) 예외적인 경우에서 정상인 경우로 진행 *암호 검사기 연습 예제 순서를 보면 쉬운 경우에서 어려운 경우로 진행 됨 1. 모든 규칙 충족: 단순 값(Ex. 상수)을 리턴값으로 넣어서 테스트 -> 새로운 추가 테스트 넣어서 에러 발생 시 -> 상수 제거 후 일반화 2. 1번 규칙 미충족, 나머지 규칙 충족 3. 2번 규칙 미충족, 나머지 규칙 충족 4. 3번 규칙 미충족, 나머지 규칙 충족 5. Null이거나 값이 없는 문자열 -> 유효하지 않은 값 6. 1번 규칙 충족, 나머지 규칙 미충족 7. 2번 규칙 충족, 나머지 규칙 미충족 8. 3번 규칙 충족, 나머지 규칙 미충족 9. 모든 규칙 미충족 2. 예외 상황을 먼저 테스트 해야하는 이유 - .. 더보기
테스트 주도 개발 시작하기 - TDD 시작, TDD 암호 검사기 3 1. 일곱 번째 테스트 숫자 포함 조건만 충족하는 경우 1) 테스트 코드 작성 import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; public class PasswordStrengthMeterTest { private PasswordStrengthMeter meter = new PasswordStrengthMeter(); // 중복되는 코드, 필드에서 생성하도록 수정 private void assertStrength(String password, PasswordStrength expStr) { // 중복되는 코드.. 더보기