본문 바로가기
Spring/study

JUnit Test 정리

by avvin 2019. 5. 30.

JUnit


Unit은 단위 테스트 도구입니다. 외부 테스트 프로그램(케이스)을 작성하여 

System.out으로 번거롭게 디버깅하지 않아도 됩니다. 

프로그램 테스트 시 걸릴 시간도 관리할 수 있게 해주며 오픈 소스이며, 

플러그인 형태로 Eclipse에 포함되어 있습니다. 하나의 jar 파일이 전부이며 사용법도 간단합니다. 

어느 정도 개발이 진행되면 프로그램에 대한 단위 테스트는 반드시 수행해야 합니다.

 JUnit은 보이지 않고 숨겨진 단위 테스트를 끌어내어 정형화시켜 단위 테스트를 쉽게 해주는 테스트용 Framework 입니다. 

JDK 1.4에서 추가된 assertXXX를 사용하여 Test를 진행합니다. 

JUnit은 테스트 결과를 확인하는 것 이외 최적화된 코드를 유추해내는 기능도 제공합니다. 

또한, 테스트 결과를 단순한 텍스트로 남기는 것이 아니라 Test클래스로 남깁니다. 

그래서 개발자에게 테스트 방법 및 클래스의 History를 넘겨줄 수도 있습니다.


출처 : http://www.nextree.co.kr/p11104/


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package com.example.spring01.controller;
 
import javax.inject.Inject;
 
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
 
//JUnit4로 테스트
//스프링에서 작동되는 JUnit4 버전을 이용해서 클래스러너로 실행
@RunWith(SpringJUnit4ClassRunner.class)
//설정 파일의 경로 지정
@WebAppConfiguration
@ContextConfiguration(
        locations={"file:src/main/webapp/WEB-INF/spring/**/*.xml"})
public class MainControllerTest {
    //로깅 처리를 위한 객체 선언
    private static final Logger logger = 
            LoggerFactory.getLogger(MainControllerTest.class);
    
    @Inject //의존관계 주입
    WebApplicationContext wac;
    MockMvc mockMvc; //가상으로 컨트롤러를 테스트하기 위한 객체
    
    @Before  //테스트 전에 호출되는 코드
    public void setup() throws Exception {
        mockMvc=MockMvcBuilders.webAppContextSetup(this.wac).build();
        System.out.println("setup...");
    }
    @Test  //JUnit이 테스트하는 코드
    public void testDoA() throws Exception {
        //뷰가 완성되지 않은 상태에서도 테스트가 가능함
        mockMvc.perform(MockMvcRequestBuilders.get("/test/doA"));
        logger.info("doA...");
    }
 
}
 
cs




@RunWith(SpringJUit4ClassPunner.class)


@RunWith : JUnit 프레임워크의 테스트 실행 방법을 확장할 때 사용하는 어노테이션 //JUnit 확장


JUnit에 내장된 Runner 대신 지정한 Runner(확장 클래스)를 실행해준다.


SpringJUnit4ClassRunner.class : JUnit4용 확장 클래스, 테스트가 사용할 애플리케이션 컨텍스트를 만들고 관리하는 작업을 진행



RunWith로 SpringUnit4ClassRunner.class라는 JUnit용 확장클래스를 지정해주면  


JUnit이 테스트를 진행하는 중에 테스트가 사용할 애플리케이션 컨텍스트를 만들고 관리하는 작업을 진행해준다. 



참고 : https://countryxide.tistory.com/17



@WebAppConfiguration


테스트 클래스에 @WebAppConfiguration 이 있으면 웹 응용 프로그램의 루트에 대한 경로에 대한 기본값을 사용하여 테스트를 위해WebApplicationContext 를로드해야 함을 나타냄. 

기본값을 대체하려면 value() 속성을 통해 명시 적 자원 경로를 지정하해야한다.

@WebAppConfiguration  @ContextConfiguration 과 함께 단일 테스트 클래스 내에서 또는 테스트 클래스 계층 내에서 사용



출처 : https://translate.google.co.kr/translate?hl=ko&sl=en&u=https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/test/context/web/WebAppConfiguration.html&prev=search




쉽게 정리하면, 테스트 시에 모든 컨텍스트 정보를 포함한 전체 프로젝트를 실행하는 것이 아니므로 

컨텍스트 정보를 담은 객체를 inject로 가져와야하는데, 

이 때 경로에 대한 기본값을 사용하여 테스트하기 위해 WebApplicationContext 를 로드해야 함을 나타내는 어노테이션


*WebAppliCationContext vs ApplicationContext

 스프링에서 말하는 "애플리케이션 컨텍스트"는 스프링이 관리하는 빈들이 담겨 있는 컨테이너라고 생각하시면 됩니다. 스프링 안에는 여러 종류의 애플리케이션 컨텍스트 구현체가 있는데, ApplicationContext라는 인터페이스를 구현한 객체들이 다 이 애플리케이션 컨텍스트입니다. 웹 애플리케이션 컨텍스트는 ApplicationContext를 확장한 WebApplicationContext 인터페이스의 구현체를 말합니다. WebApplicationContext는 ApplicationContext에 getServletContext() 메서드가 추가된 인터페이스입니다. 이 메서드를 호출하면 서블릿 컨텍스트를 반환됩니다. 결국 웹 애플리케이션 컨텍스트는 스프링 애플리케이션 컨텍스트의 변종이면서 서블릿 컨텍스트와 연관 관계에 있다는 정도로 정리가 됩니다. 이 메서드가 추가됨과 동시에 서블릿 컨텍스트를 이용한 몇가지 빈 생애 주기 스코프(애플리케이션, 리퀘스트, 세션 등)가 추가되기도 합니다.


출처 : https://unordinarydays.tistory.com/131



@ContextConfiguration(

locations={"file:src/main/webapp/WEB-INF/spring/**/*.xml"})


@ContextConfiguration :  자동으로 만들어지는 애플리케이션 컨텍스트의 설정파일 위치 지정 어노테이션


(설정파일이니까 xml)




MockMvc mockMvc; 


Spring 3.2부터 사용 가능


ajax나 client(browser)에서 요청 내용을 controller에서 받아 처리하는것과 같은 테스트를 진행할 수 있게하는 객체
그래서 결과값을 status코드로 테스트 통과여부를 결정합니다.
기존 service나 repository테스트의 경우는 controller에서 접근하지 못하여서 실제 front작업할때 예기치 못한 에러에 대하여 실제 뷰와 연결전까지는 알 수 없었던 부분을 테스트할 수 있습니다.

출처: https://pangyo-dev.tistory.com/2 [동네개발자]




@Before  //테스트 전에 호출되는 코드


메서드 위에 선언된 @Before, @After 어노테이션은 테스트 클래스 안의 메소드들이 

테스트 되기 전과 후에 각각 실행되도록 지정해줌