본문 바로가기
BACK-END/SPRING

[Spring]JUnit을 이용한 단위 테스트

by 썬키 2022. 3. 11.

오늘은 Spring의 테스트 자동화 도구에 속하는

JUnit을 이용해 단위 테스트를 하는 법을 배웠다.

 

JUnit은 빨간 테두리안에 속해있는 두가지 폴더에서 진행할 수 있다.

 

 

src/test/java 폴더에 두개의 패키지를 생성 후, 클래스를 생성한다.

수업 시간에는 board(게시판)의 JUnit 테스트를 진행, notice(공지사항)의 JUnit 테스트는 각자가 진행해보기로 했다.

 

우선, 기본에 속하는 board(게시판)을 JUnit 테스트 하는 방법을 알아보자.

 

 

<BoardTest>

package com.webjjang.board;

import javax.inject.Inject;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.webjjang.board.mapper.BoardMapper;
import com.webjjang.board.vo.BoardVO;
import com.webjjang.util.PageObject;

import lombok.extern.log4j.Log4j;

// test 실행 클래스 지정
@RunWith(SpringJUnit4ClassRunner.class)
// DB 설정 파일 지정 → URL과 상관없이 JAVA만으로 실행되므로 직접 지정해줘야한다. 
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
// 로그 출력 객체
@Log4j
public class BoardTest {
	
	// mapper 자동 DI
	@Inject
	private BoardMapper mapper;
	
	// 설정과 자동 DI 테스트
	@Test
	public void testDI() {
		log.info("────────────── 자동 DI 테스트 ──────────────");
		log.info(mapper + "\n");
	}
	
	// 게시판 리스트 mapper 테스트
	@Test
	public void testList() throws Exception {
		PageObject pageObject = new PageObject();
		pageObject.setTotalRow(mapper.getTotalRow(pageObject));
		log.info("────────────── 게시판 리스트 Mapper 테스트 ──────────────");
		log.info(mapper.list(pageObject) + "\n");
	}
	
	// 게시판 글보기(- 글번호) 테스트
	@Test
	public void testView() throws Exception {
		long no = 459;
		log.info("────────────── 게시판 글보기 Mapper 테스트 ──────────────");
		log.info(mapper.view(no) + "\n");
	}
	
	
	// 게시판 글쓰기(- 제목, 내용, 작성자 → vo) 테스트
	@Test
	public void testWrite() throws Exception {
		BoardVO vo = new BoardVO();
		vo.setTitle("테스트 진행");
		vo.setContent("테스트 진행 중");
		vo.setWriter("개발자");
		log.info("────────────── 게시판 글쓰기 Mapper 테스트 ──────────────");
		log.info(mapper.write(vo) + "\n");
	}
	
	// 게시판 글수정(- 번호, 제목, 내용, 작성자) 테스트
	@Test
	public void testUpdate() throws Exception {
		BoardVO vo = new BoardVO();
		vo.setNo(459);
		vo.setTitle("Test 진행");
		vo.setContent("테스트 진행 중");
		vo.setWriter("개발자");
		log.info("────────────── 게시판 글수정 Mapper 테스트 ──────────────");
		log.info(mapper.update(vo) + "\n");
	}
	
	// 게시판 글삭제(- 글번호) 테스트
	@Test
	public void testDelete() throws Exception {
		long no = 441;
		log.info("────────────── 게시판 글삭제 Mapper 테스트 ──────────────");
		log.info(mapper.delete(no) + "\n");
	}
}

각 메소드마냥 테스트를 하기 위해서는, 어떤 데이터가 필요한지가 중요한거 같다.

@Test 어노테이션을 입력해야, 테스트를 진행하고 콘솔에 log 값이 찍힌다.

 

 

<NoticeTest>

package com.webjjang.notice;

import java.util.Date;

import javax.inject.Inject;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.webjjang.notice.mapper.NoticeMapper;
import com.webjjang.notice.vo.NoticeVO;
import com.webjjang.util.PageObject;

import lombok.extern.log4j.Log4j;

// test 실행 클래스 지정
@RunWith(SpringJUnit4ClassRunner.class)
// DB 설정 파일 지정
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
// 로그 출력 객체
@Log4j
public class NoticeTest {
	
	// mapper 자동 DI
	@Inject
	private NoticeMapper mapper;
	
	// 설정과 자동 DI 테스트
	@Test
	public void testDI() {
		log.info("─────────────────── 자동 DI 테스트 ───────────────────");
		log.info(mapper + "\n");
	}

	// 공지사항 리스트 mapper 테스트
	@Test
	public void testList() throws Exception {
		PageObject pageObject = new PageObject();
		pageObject.setTotalRow(mapper.getTotalRow(pageObject));
		log.info("─────────────────── 공지사항 리스트 mapper 테스트 ───────────────────");
		log.info(mapper.list(pageObject) + "\n");
	}
	
	// 공지사항 글보기(:글번호) 테스트
	@Test
	public void testView() throws Exception {
		long no = 43;
		log.info("─────────────────── 공지사항 글보기 mapper 테스트 ───────────────────");
		log.info(mapper.view(no) + "\n");
	}
	
	// 공지사항 글쓰기(:제목, 내용, 시작일, 종료일) 테스트
	@SuppressWarnings("deprecation")
	@Test
	public void testWrite() throws Exception {
		NoticeVO vo = new NoticeVO();
		vo.setTitle("3월 11일 공지사항");
		vo.setContent("3월 11일 공지사항");
		vo.setStartDate(new Date(2022, 03, 11));
		vo.setEndDate(new Date(2022, 03, 31));
		log.info("─────────────────── 공지사항 글쓰기 mapper 테스트 ───────────────────");
		log.info(mapper.write(vo) + "\n");
	}
	
	// 공지사항 글수정(:글번호, 제목, 내용, 시작일, 종료일, 수정일) 테스트
	@SuppressWarnings("deprecation")
	@Test
	public void testUpdate() throws Exception {
		NoticeVO vo = new NoticeVO();
		vo.setNo(43);
		vo.setTitle("3월 11일 금요일 공지사항");
		vo.setContent("3월 11일 금요일 공지사항");
		vo.setStartDate(new Date(2022, 03, 11));
		vo.setEndDate(new Date(2022, 03, 31));
		log.info("─────────────────── 공지사항 글수정 mapper 테스트 ───────────────────");
		log.info(mapper.update(vo) + "\n");
	}
	
	// 공지사항 글삭제(:글번호) 테스트
	@Test
	public void testDelete() throws Exception {
		long no = 41;
		log.info("─────────────────── 공지사항 글삭제 mapper 테스트 ───────────────────");
		log.info(mapper.delete(no) + "\n");
	}
}

 

오류

notice(공지사항)게시판은 일반 게시판과 다르게

VO 객체 생성시, 시작일ㆍ종료일을 Date 타입으로 생성했기 때문에 String 값을 넣게 되면 오류가 발생한다.

 

그래서, 위와 같이 코드를 작성하고 @SuppressWarnings 어노테이션을 이용해 오류를 잡아주는것이 바람직하다.

 

처음에는 이 오류 때문에 Date 타입을 String 타입으로 변환하려면 어떻게 해야하나

구글링 해봤는데, 타입 변환보다는 이 방법이 훨씬 더 깔끔해져서 이 방법을 선택했다. 

 

 

코드가 완성 되었으면, Run As - JUnit Test을 이용해 테스트를 진행해본다.

 

 

테스트를 진행하면 Console 창에 위와 같이 테스트 결과 값이 잘 나온다.

글쓰기, 삭제, 수정 같은 데이터의 변동 값이 있는 경우에는 1과 0으로 표시되는데

실행이 되었으면 1, 그렇지 않으면 0이다.

 

만약 없는 글 번호를 선택해 글 삭제를 테스트 한다면 결과값은 0이 나오게 된다.

 

 

댓글