6. 테스트 프로그램으로 단위 프로그램 테스트
테스트 프로그램 작성 경로

log4j.xml
log4jdbc.log4j2.properties
mybatis-config.xml
파일을 srt/test/resources 폴더에 넣어주자
test 프로그램이 사용하는 로그 구현체의 환경설정파일(log4j.xml)을 다시 설정해주어야 한다.
Spring 프레임워크를 사용하여 모듈(단위 프로그램)을 검사하는 테스트 프로그램 작성 방법
- SpringMVC 프로그램에서 사용하는 모듈은 DAO 클래스, Service 클래스, Controller 클래스가 있다.
1. junit 라이브러리와 spring-test 라이브러리를 프로젝트에 빌드 처리 - 메이븐 : pom.xml

https://mvnrepository.com/artifact/org.springframework/spring-test/5.3.29


2. 테스트 프로그램에서 사용될 로그 구현체에 대한 환경설정파일 변경
- [src/test/resources] 폴더의 [log4j.xml] 파일의 내용을 변경해야 한다.
3. [src/test/java] 폴더에 테스트 프로그램 관련 클래스 작성
- junit 라이브러리와 spring-test 라이브러리의 scope 속성값을 주석 처리한 후 테스트 프로그램 관련 클래스를 작성한다.
- 테스트 프로그램 관련 클래스 작성 후 주석을 제거해주면 된다.


@RunWith는 테스트 프로그램을 실행하기 위한 실행 클래스를 설정하는 어노테이션이다.
- 테스트 프로그램 관련 클래스를 객체로 생성하여 메소드를 호출하기 위한 클래스를 지정한다.
- value 속성에는 테스트 프로그램을 실행하기 위한 클래스(Class 객체)를 속성값으로 설정한다.
- 다른 속성이 없는 경우 속성값만 설정이 가능하다.
SpringJUnit4ClassRunner 클래스를 사용하여 테스트 프로그램을 실행할 경우 자동으로 스프링 컨테이너(ApplicationContext 객체)를 생성하여 제공한다.
@ContextConfiguration은 테스트 프로그램에서 사용될 Spring Bean을 제공하기 위해 Spring Bean Configuration File을 설정하기 위한 어노테이션이다.
- locations 속성에 Spring Bean Configuration File의 경로를 요소로 저장한 배열을 속성값으로 설정하면 된다.
- Spring Bean Configuration File의 경로는 file 접두사를 사용하여 파일 시스템 형식으로 표현하여 제공한다.
@Test는 테스트 메소드를 설정하는 어노테이션이다. - 테스트 명령을 작성하여 실행
- SpringJUnit4ClassRunner 클래스에 의해 테스트 프로그램 관련 클래스가 객체로 생성된 후 자동 호출되는 메소드이다.
DataSourceTest
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"file:src/main/webapp/WEB-INF/spring/root-context.xml"})
@Slf4j //필드에 로거 저장
public class DataSourceTest {
//테스트 클래스의 메소드에서 사용할 객체를 저장하기 위한 필드 선언
// => 필드에 @Autowired 어노테이션을 사용하여 의존성 주입 - 생성자를 이용한 의존성 주입이 불가능
@Autowired
private DataSource dataSource;
//테스트 메소드를 설정
@Test
public void testDataSource() throws SQLException {
log.info("DataSource = "+dataSource);
Connection connection=dataSource.getConnection();
log.info("Connection = "+connection);
connection.close();
}
}


4. 테스트 프로그램을 실행하여 모듈 검사
서비스 클래스를 검사하는 테스트 프로그램 작성 하기
@WebAppConfiguration은 ApplicationContext 객체가 아닌 WebApplicationContext 객체를 스프링 컨테이너로 사용할 수 있도록 설정하기 위한 어노테이션이다.
@FixMethodOrder는 테스트 메소드 호출 순서를 설정하기 위한 어노테이션이다.
- value 속성에는 MethodSorters 자료형(Enum)의 상수 중 하나를 속성값으로 설정하면 된다.
- MethodSorters.DEFAULT : JUnit 프로그램의 내부 규칙에 의해 정렬되어 메소드가 호출된다. - 테스트 프로그램 실행시 동일한 순서로 메소드를 호출한다.
- MethodSorters.JVM : JVM에 의해 정렬되어 메소드가 호출한다. - 테스트 프로그램을 실행할 때마다 불규칙적인 순서로 메소드를 호출한다.
- MethodSorters.NAME_ASCENDING : 테스트 메소드의 이름을 오름차순 정렬하여 메소드를 호출한다.(일반적으로 많이 사용함)
StudentDTO에 @builder 어노테이션을 사용

Student 클래스의 StudentBuilder 클래스로 Student 객체를 생성하여 반환받아 생성하는 것을 권장한다.
StudentServiceTest
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration //스프링 컨테이너를 WebApplicationContext 객체로 사용할 수 있도록 설정
@ContextConfiguration(locations = {"file:src/main/webapp/WEB-INF/spring/root-context.xml"
,"file:src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml"})
@FixMethodOrder(value = MethodSorters.NAME_ASCENDING)//테스트 메소드의 이름을 오름차순 정렬하여 메소드 호출
@Slf4j
public class StudentServiceTest {
@Autowired
private StudentService studentService;
@Test
public void testAddStudent() {
/*
Student student=new Student();
student.setNo(7000);
student.setName("로빈훗");
student.setPhone("010-7841-3454");
student.setAddress("서울시 중랑구");
student.setBirthday("2000-09-10");
*/
//Student 클래스의 builder() 메소드를 호출하여 StudentBuilder 객체를 제공받아 필드 관련
//메소드로 필드값을 변경하여 build() 메소드로 Student 객체를 반환받아 사용
Student student=Student.builder()
.no(7000)
.name("로빈훗")
.phone("010-7841-3454")
.address("서울시 중랑구")
.birthday("2000-09-10")
.build();
studentService.addStudent(student);
}
@Test
public void testGetStudentList() {
List<Student> studentList=studentService.getStudentList();
for(Student student : studentList) {
//DTO 클래스의 객체로 toString() 메소드를 호출하여 모든 필드값을 문자열로 반환받아 사용
log.info(student.toString());
}
}
}

Controller 클래스를 테스트하는 프로그램 작성하기
Controller를 테스트하는 프로그램을 작성하기 위해서는 가짜로 요청과 응답을 받을 수 있는 객체가 필요하다.
<용어 정리>
WebApplicationContext 객체 : SpirngMVC 프로그램에서 스프링 컨테이너 기능을 제공
MockMbc 객체 : 요청과 응답을 가상으로 제공
@Before : 테스트 메소드 호출전에 실행될 명령을 메소드에 설정하는 어노테이션 - 초기화 전 사용
MockMvcBuilders.webAppContextSetup(WebApplicationContext context) : MockMvcBuilder 객체를 생성하여 반환해주는 메소드
MockMvcBuilder.build() : MockMvc 객체를 생성하여 반환하는 메소드
MockMvcRequestBuilders.get(String url) : 매개변수로 요청 URL 주소를 전달받아 GET 방식으로 웹프로그램을 요청하는 메소드
- 요청 페이지에 대한 URL 주소의 요청 관련 정보(리퀘스트 메세지)가 저장된 RequestBuilder 객체를 반환한다.
MockMvc.perform(Builder requestBuilder) : 가상으로 페이지를 요청하는 메소드
- 매개변수에 전달받은 RequestBuilder 객체에 저장된 정보를 이용하여 페이지를 요청한다.
- Controller 클래스의 요청 처리 메소드를 호출한다.
- 요청에 대한 처리결과가 저장된 ResultActions 객체를 반환한다.
ResultActions.andReturn() : 요청 처리 메소드의 실행결과를 MvcResult 객체로 반환하는 메소드
MvcResult.getModelAndView() : 요청 처리 메소드에 의해 제공된 ModelAndView 객체를 반환하는 메소드
StudentControllerTest
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
//[*] 패턴문자를 사용하여 Stpring Bean Configuration File 설정이 가능하다.
// => [**] 형식으로 0개 이상의 하위 폴더를 표현
@ContextConfiguration(locations = {"file:src/main/webapp/WEB-INF/spring/**/*.xml"})
@Slf4j
public class StudentControllerTest {
//WebApplicationContext 객체를 제공받아 저장하기 위한 필드 선언
// -> WebApplicationContext 객체는 SpirngMVC 프로그램에서 스프링 컨테이너 기능을 제공
@Autowired
private WebApplicationContext context;
//MockMvc 객체를 저장하기 위한 필드 선언
private MockMvc mvc;
//테스트 메소드 호출전에 실행될 명령을 설정
@Before
public void setup() {
//MockMvcBuilder 객체를 반환받아 MockMvc 객체를 반환
mvc=MockMvcBuilders.webAppContextSetup(context).build();
log.info("MockMvc 객체 생성");
}
@Test
public void testStudentDisplay() throws Exception {
//get() 메소드의 매개변수로 요청 URL 주소를 전달받아 GET 방식으로 웹프로그램을 요청하면
//리퀘스트 메세지가 저장된 RequestBuilder 객체를 반환한다.
//perform()은 매개변수에 전달받은 RequestBuilder 객체에 저장된 정보를 이용하여
//페이지를 요청해 Controller 클래스의 요청 처리 메소드를 호출하고 요청에 대한 처리 결과가 저장된
//ResultActions 객체를 반환한다.
//andReturn()는 요청 처리 메소드의 실행결과를 MvcResult 객체로 반환한다.
MvcResult result=mvc.perform(MockMvcRequestBuilders.get("/student/display")).andReturn();
//getModelAndView()로 요청 처리 메소드에 의해 제공된 ModelAndView 객체를 반환
log.info(result.getModelAndView().getViewName());
log.info(result.getModelAndView().getModel().toString());
}
}
'학원 > 복기' 카테고리의 다른 글
[Spring] TilesView 클래스 (0) | 2023.08.11 |
---|---|
[Spring] TranscationManager (0) | 2023.08.10 |
[Spring] Mybatis 로깅 정보를 스프링 로그 구현체로 기록하는 방법 (0) | 2023.08.09 |
[Spring] SpringMVC 이용한 웹프로그램 작성(1) (0) | 2023.08.09 |
[Spring] Resource 파일 읽기 (0) | 2023.08.08 |