본문 바로가기
IT/Spring

토비 스프링 - 테스트

by 봉즙 2019. 10. 19.

웹을 통핸 테스트 문제점 : 서비스, 컨트롤러, 뷰 등이 완성되고 나서야 테스트를 실행하는 것이 가능

작은 단위의 테스트 (unit 테스트, 단위 테스트)

테스트하려는 대상이 명확하다면, 그 대상에만 집중해서 테스트하는 것이 좋다. 관심사의 분리라는 원리를 적용하여 가능한 적은 단위로 쪼개서 테스트 하는 것이 좋다.

 

JUnit : 프레임워크이기에 개발자가 만든 클래스에 대해 제어 권한을 넘겨 받아 주도적으로 어플리케이션의 흐름을 제어한다. 그렇기에 main메서드는 제어권을 직접 갖는다는 의미이기에 테스트 코드를 일반메소드로 정의해야한다.
JUnit이 요구하는 두가지 조건중 첫째는, 메소드가 public으로 선언돼야 하는 것이며, 다른 하난느 메소드에 @Test라는 어노테이션을 붙어주어야 한다는 것이다.

if(!user.getName().equals(user2.getName())){...}

//위의 문장을 JUnit이 제공해주는 assterThat이라는 스태틱 메소드를 활용하여 다음과 같이 변경할 수 있다.

assertThat(user2.getName(), is(user.getName()));

 

assdrtThat() 메소드 : 첫 번째 파라미터의 값을 뒤에나오는 matcher라고 불리는 조건으로 비교해서 일치하면 다음으로 넘어가고, 아니면 테스트가 실패하도록 만들어 준다. is() 는 매처의 일종으로 equals()로 비교해주는 기능을 가졌다.

 

@Test(expected = 예외클래스.class)

expected는 테스트 메소드 실행 중에 발생하리라 기대하는 예외 클래스를 넣어주며, 보통의 테스트와는 반대로, 정상적으로 테스트 메소드를 마치면 테스트가 실패한다. expected에서 지정한 예외가 던져진 경우에만 테스트가 성공한다.  반드시 예ㅣ외가 발생해야하는 경우를 테스트 하고 싶은 경우 유용하게 사용할 수 있다.

 

테스트 주도 개발(TDD, Test Driven Development) or 테스트 우선 개발(Test First Development) : 만들고자하는 기능의 내용을 담고 있으면서 만들어진 코드를 검증도 해줄 수 있도록 테스트 코드를 먼저 만들고 , 테스트를 성공하게 해주는 코드를 작성하는 방식의 개발 방법

 

JUnit의 테스트 실행 순서

1. 테스트 클래스에서 @Test가 붙은 public이고 void 형이며 파라미터가 벗는 테스트 메소드를 모두 찾는다.

2.테스트 클래스의 오브젝트를 하나 만든다.

3.@Before가 붙은 메소드가 있으면 실행한다.

4.@Test가 붙은 메소드를 하나 호출하고 테스트 결과를 저장해둔다.

5.@After가 붙은 메소드가 있으면 실행한다.

6.나머지 테스트 메소드에 대해 2~5번을 반복한다.

7.모든 테스트의 결과를 종합해서 돌려준다.

각 테스트 메소드를 실행 할때마다 테스트 클래스의 오브젝트를 새로 만든다. 즉 한번 만들어진 테스트 클래스의 오브젝트는 하나의 테스트 메소드를 사용하고 나면 버려지게 된다. 테스트가 서로 영향을 주지않고 독립적으로 실행됨을 보장해주기 위해  매번 새로운 오브젝트를 생성한다. (application context와 같이 생성에 많은 시간과 자원이 소모되는 경우에는 테스트 전체가 공유하는 오브젝트를 만들기도 한다.)

 

픽스처 : 테스트를 수행하는데 필요한 정보나 오브젝트, 일반적으로 픽스쳐는 여러 테스트에서 반복적으로 사용되기 때문에 @Before 메소드를 이용해 생성해두면 편리하다.

 

@RunWith(SrpingJUnit4ClassRunner.class) //스프링의 테스트 컨텍스트 프레임 워크의 JUit 확장기능 지정
@ContextConfiguration(locations="/applicationcontext.xml")//테스트 컨텍스트가 자동으로 만들어줄 어플리케이션 컨텍스트의 위치 지정
public clas UserDaoTest {
	@Autowired
    private ApplicationContext context;//테스트 오브젝트가 만들어지고 나면 스프링컨텍스트에 의해 자동으로 값이 주입
    ...
    
    @Before
    public void setUp(){
    	this.dao = this.context.getBean("userDao", userDao.class);
        ...
   }

 여러개의 테스트 클래스가 있더라도 모두 같은 설정파일을 가진 어플리케이션 컨텍스트를 사용한다면, 스프링은 테스트 클래스 사이에서도 어플리케이션 컨텍스트를 공유하게 해준다. 다음과 같이 두개의 테스트 클래스가 같은 설정 파일을 사용하는 경우에는 테스트 수행 중에 단 한개의 어플리케이션 컨텍스트만 만들어지며, 두 개의 클래스의 모든 메소드가 하나의 어플리케이션 컨텍스트를 공유하게 된다.

 

@Runwith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locatios="/applicationContext.xml")
pulic class UserDaoTest{..}

@Runwith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locatios="/applicationContext.xml")
pulic class GroupDaoTest{..}

'IT > Spring' 카테고리의 다른 글

토비 스프링 - 학습 테스트, 버그 테스트  (0) 2019.10.20
토비 스프링 - @Autowired  (0) 2019.10.19
REST API  (0) 2019.10.15
토비 스프링 - XML 이용한 설정  (0) 2019.10.14
토비 스프링 - 의존관계 주입  (0) 2019.10.13

댓글