Develop/Spring framework

[Spring] JUnit

자라선 2020. 7. 31. 11:47

1. JUnit

자바의 테스트 지원도구인 JUnit으로 IoC 테스트 프레임워크이다.

이전에 main메소드로 호출하여 System.out.println() 보다 좀더 편하며 강력한 테스트를 할수 있도록 지원해주는 프레임워크이다.

JUnit은 사용하기 위해 아래와 같은 2가지의 조건이 있다.

1. public 접근 제한자만 사용가능

2. @Test 어노테이션으로 사용

	@Test
	public void addAndGet() throws SQLException {
	  ...
	}

2. Test Code

기존에 main에서는 호출하면서 동시 데이터를 조건절을 사용해 비교하여 System.out.println() 으로 출력하였다.

하지만 일일히 모든 코드를 테스트 하기 위해서 main에서 호출하여 출력하는건 무리가 좀 있다.

		if(!user.getName().equals(user2.getName())) {
			System.out.println("테스트 실패 (name)"); 
		}else if(!user.getPassword().equals(user2.getPassword())) {
           ...
        } ...

게다가 매번 위와 같이 조건을 주며 출력하는건 고역이다;

그렇기 때문에 JUnit를 사용하여 위의 코드를 아래와 같이 구현할수 있다.

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

assertThat은 JUnit의 static 메소드로 실행하면 양쪽 데이터를 비교하여 결과를 출력하여 준다.

 

assertThat() 메소드는 첫 번째 파라미터의 값을 뒤에 나오는 매처(matcher)라고 불리는 조건으로 비교해서 일치하면 다음으로 넘기고 아니면 실패도록 만들어준다.

is(...) 는 매처의 일종으로 equals()로 비교해주는 기능을 가졌다.

전체적인 코드는 대력 이렇다.

public class UserDaoTest {

	@Test
	public void addAndGet() throws SQLException {
		ApplicationContext context = new GenericXmlApplicationContext("applicationContext.xml");
		UserDao userdao = context.getBean("userDao", UserDao.class);
		
		User user = new User();
		user.setId("UNIQUE_ID");
		user.setName("test");
		user.setPassword("springTest");
		
		userdao.add(user);
		
		User user2 = new User();
		user2 = userdao.get(user.getId());
		
		assertThat(user2.getName(), is(user.getName()));
		assertThat(user2.getPassword(), is(user.getPassword()));
	}
	
}

이렇게 선언된 테스트코드를 실행하기 위해선 다른 클래스에 main메소드를 정의하여

테스트코드의 해당 경로를 파라메터로 주어 선언후 실행 해본다.

	public static void main(String[] args) {
		JUnitCore.main("com.Spring.User.controller.UserDaoTest");
	}

3. Eclipse JUnit View Component

위와같이 실행하여 테스트 코드를 실행할수 있지만

여러개의 테스트코드를 테스트해보기 위해선 매번 저렇게 작성하기도 힘들것이다.

그래서 이클립스에 내장되어있는 JUnit View를 사용하여 보다 쉽게 테스트를 진행할수 있다.

이클립스의 JUnit View
테스트 할때는 Run As -> JUnit Test

그리고 프로젝트, 패키지, 클래스 등을 선택후 Alt+Shift+X 후 T 로 테스트를 하게 되면

선택한 범위 내에있는 모든 @Test 메소드를 테스트 해서 결과를 JUnit View에서 보여준다.

4. deleteAll(), getCount() add

UserDao에 모든 row를 삭제 하거나 해당 테이블의 row갯수를 가져오는 기능을 추가해보자.

	public void deleteAll() throws SQLException {
		Connection conn = dataSource.getConnection();
		
		PreparedStatement ps = conn.prepareStatement("DELETE FROM USERS");
		ps.executeUpdate();
		
		conn.close();
		ps.close();
	}
	
	public int getCount() throws SQLException {
		Connection conn = dataSource.getConnection();
		
		PreparedStatement ps = conn.prepareStatement("SELECT COUNT(*) FROM USERS");
		ResultSet rs = ps.executeQuery();
		rs.next();
		
		int count = rs.getInt(1);
		
		conn.close();
		ps.close();
		rs.close();
		
		return count; 
	}

이 2개의 기능을 테스트 해보자고 할때는

delteAll이 완료된 후 row는 0이 될것이며, 이로 인해 getCount가 결과값은 0이 나와야할 것이다.

		userdao.deleteAll();	//모든 row 삭제
		assertThat(userdao.getCount(), is(0)); // 모든 row 갯수가 0인지 확인

		User user = new User();
		user.setId("UNIQUE_ID");
		user.setName("test");
		user.setPassword("springTest");
		
		userdao.add(user);	//user Insert
		assertThat(userdao.getCount(), is(1)); //  1 user만 insert 했을테니 row가 1인지 비교

위와 같은 방식으로 사용하여 테스트를 진행할수 있다.

 


이 글은 작년에 작성한 글이라 가장 최근에 정리한 글이 있음

 

2020/07/28 - [Develop/Test Framework] - Java Test 프레임워크

 

Java Test 프레임워크

Test 1.    개요 2.    테스트란? 3.    Junit4, assertj, Mockito 소개 및 사용법 4.    Spring test 모듈 5.    controller, service, dao 테스트 개요 테스트에 대한 개념과 중요성을 알고 각종..

tony950620.tistory.com