[Spring] JUnit
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를 사용하여 보다 쉽게 테스트를 진행할수 있다.
그리고 프로젝트, 패키지, 클래스 등을 선택후 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