본문 바로가기

학원/복기

[Spring] SpringMVC 이용한 웹프로그램 작성(2) / Junit 이용

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());
	}
}