책책책/토비의 스프링 3.1

[Spring] 자바 테스팅 프레임워크 JUnit (개념편)

Deveun 2021. 7. 16. 03:24

토비의 스프링 2장: 테스트

JUnit (자바 테스팅 프레임워크)

기존 웹 프로젝트에서는 테스트를 위해서 화면에서 값 입력 -> 기능 수행 -> 결과확인을 위해 뷰, 컨트롤러, 서비스 클래스 등... 모든 레이어의 개발이 완료되어야 한다는 어려움과 에러 발생시에 위치 파악 문제점이 있었다.

이를 해결하기 위해 테스트 대상을 분리하여 단위테스트(Unit Test)를 가능하도록 하는 자바의 테스트 지원도구가 바로 JUnit이다.

 

JUnit의 작성 조건은 다음과 같다.

1)메소드는 Public으로 선언  2)메소드에 @Test 어노테이션

또한, JUnit에서 테스트 메소드의 실행순서는 보장되지 않는다.

 

예로 게시판 기능(Board 추가 / 조회)의 Dao를 테스트 하는 JUnit 코드를 작성해보자.

(*프로젝트 라이브러리 추가:  com.springsource.org.junit-x.x.x.jar)

 

- BoardDaoTest.java

import org.junit.Test;

public class BoardDaoTest {

    ///// 게시글 추가 테스트
    ///// 게시글추가 전, 추가 후 게시글의 갯수가 1개 증가했는지 확인
    @Test // JUnit 조건 (2) Test 어노테이션
    public void insertTest() throws SQLException { //JUnit 조건 (1) public메소드
    	ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    
    	BoardDao dao = context.getBean("boardDao", BoardDao.class);
        
        dao.deleteAll();
        assertThat(dao.count(), is(0));
        
        dao.add(new Board("제목", "글"));
        assertThat(dao.count(), is(1));
    }
    
    ///// 게시글 조회 테스트
    ///// 게시글 추가 뒤, 조회한 값이 맞는지 확인
    @Test // JUnit 조건 (2) Test 어노테이션
    public void selectTest() throws SQLException { //JUnit 조건 (1) public메소드
    	ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    
    	BoardDao dao = context.getBean("boardDao", BoardDao.class);
        
        dao.deleteAll();        
        dao.add(new Board("제목", "글"));
        Board boardGet = dao.select();
        
        assertThat(board.getTitle(), is("제목"));
        assertThat(board.getContent(), is("글"));
    }
    
    ///// 이 외 deleteAll(), count() 검증 부분은 생략한다.

 

- 어딘가.java 의 main()

import org.junit.runner.JUnitCore;
//...
public  static void main(String[] args) {
	JUnitCore.main("..board.dao.BoardDaoTest");
}

 

위에 코드에서 결과를 검증하기 위해 assertThat(variable, matcher) 를 사용했는데,

첫번째 파라미터 variable의 값이 matcher의 조건을 만족하는지 판단하여 성공 / 실패의 값을 리턴하는 함수이다.

 

 

예제에서는 간단한 기능의 테스트 코드만 작성해보았는데, 좋은 테스트는 다음을 조건들을 만족한다.

 

1) 수행뿐만 아니라 테스트 결과 검증의 자동화

2) 동일한 테스트 결과를 보장

3) 정상케이스 & 예외케이스의 포괄적인 테스트 수행 

 

그리고 조건 / 행위 / 결과 중심으로 테스트를 설계하고, 테스트를 성공하도록 개발을 진행하는 것이 TDD(Test Driven Development) 테스트 주도개발이다.

 

 

(IDE에서의 JUnit 테스트 실행방법 설명은 생략한다)

 

 

 

[참고서적] http://www.acornpub.co.kr/book/toby-spring3.1-vol1#spring3

 

토비의 스프링 3.1 Vol. 1 스프링의 이해와 원리

스프링의 핵심 프로그래밍 모델의 원리와 이에 적용된 다양한 디자인 패턴, 프로그래밍 기법의 이해를 돕는 책

www.acornpub.co.kr