UserDaoTest를 개선해보자.
1. 테스트 검증의 자동화
모든 테스트는 성공과 실패의 두 가지 결과를 갖는다.
실패의 경우 에러가 발생한 경우와, 개발자의 의도와 다른 결과가 나온 경우가 있다.
전자를 테스트 에러, 후자를 테스트 실패라고 하자.
테스트 에러의 경우 콘솔에 에러 메시지와 긴 호출 스택 정보가 출력되어 파악하기 쉽다.
테스트 실패의 경우 별도의 확인 작업과 그 결과가 있어야만 알 수 있다.
테스트 실패를 쉽게 확인할 수 있게 코드를 변경해보자.
수정 전 테스트 코드
더보기
System.out.println(user2.getName());
System.out.println(user2.getPassword());
System.out.println(user2.getId() + "조회 성공");
수정 후 테스트 코드
더보기
if(!user.getName().equals(user.getName())){
System.out.println("테스트 실패 (name)");
}
else if(!user.getPassword().equals(user.getPassword())) {
System.out.println("테스트 실패 (password)");
}
else {
System.out.println("조회 테스트 성공");
}
위와 같이 코드를 변경함으로써 테스트 수행과 결과의 기대치까지 보다 명확하게 확인할 수 있게 되었다.
2. 테스트의 효율적인 수행과 결과 관리
위에서 작성한 main() 메소드로 만든 테스트는 테스트로서 필요한 기능은 모두 갖췄다.
하지만 좀 더 편리하게 테스트를 수행하고 결과를 확인하려면 main() 메서드로는 한계가 있다.
JUnit 테스트로 전환
JUnit은 프레임워크다. 프레임워크의 기본 동작원리는 제어의 역전(IoC)이다.
즉 개발자가 만든 클래스에 대한 제어 권한을 넘겨받아 주도적으로 애플리케이션의 흐름을 제어한다.
따라서 main() 메소드도 필요 없고 오브젝트를 만들어서 실행시키는 코드를 만들 필요도 없다.
테스트 메소드 전환
기존 테스트 코드를 JUnit에서 사용하기 적합하게 변경해보자.
main() 메서드에선 직접 제어하겠다는 의미니 일반 메서드로 변경하자.
그리고 JUnit 프레임워크의 두 가지 요구조건을 따르자.
첫번째는 메서드를 public으로 선언할 것
두 번째는 메서드에 @Test 애노테이션을 붙이는 것
Junit 프레임워크에서 동작할 수 있는 테스트 메서드로 전환
더보기
import org.junit.jupiter.api.Test;
public class UserDaoTest {
@Test
public void addAndGet() throws SQLException {
ApplicationContext context = new GenericXmlApplicationContext("applicationContext.xml");
UserDao dao = context.getBean("userDao", UserDao.class);
...
}
}
검증 코드 전환
if(!user.getName().equals(user2.getName())) { ... }
JUnit이 제공해주는 assertThat이라는 스태틱 메서드를 이용해 다음과 같이 변경할 수 있다.
import static org.junit.jupiter.api.Assertions.*; <- 해당 라이브러리 사용
assertEquals(user2.getName(), is(user.getName()));
JUnit을 적용한 UserDaoTest
더보기
import static org.assertj.core.internal.bytebuddy.matcher.ElementMatchers.is;
import static org.junit.jupiter.api.Assertions.*;
...
public class UserDaoTest {
@Test
public void addAndGet() throws SQLException, ClassNotFoundException{
ApplicationContext context = new GenericXmlApplicationContext("applicationContext.xml");
UserDao dao = context.getBean("userDao", UserDao.class);
User user = new User();
user.setId("낙곱새");
user.setName("배고파");
user.setPassword("소주한잔");
dao.add(user);
User user2 = dao.get(user.getId());
assertEquals(user2.getName(), is(user.getName()));
assertEquals(user2.getPassword(), is(user.getPassword()));
}
}
JUnit 테스트 실행
JUnit을 이용해 테스트를 실행해주는 main() 메소드
import org.junit.runner.JUnitCore;
...
public static void main(String[] args) {
JUnitCore.main("springbook.user.dao.UserDaoTest");
}
출간된 지 10년이나 돼서 지금 쓰는 방식과 차이가 나는 것 같아 요즘 스타일 소스코드가 있는 깃허브 링크를 첨부하겠습니다.
Junit5 Dependency Diagram
References By
https://github.com/junit-team/junit4
https://junit.org/junit5/docs/current/user-guide/
'BackEnd > Spring & Springboot Study' 카테고리의 다른 글
[토비의 스프링] 2.4 스프링 테스트 적용 (0) | 2022.12.23 |
---|---|
[토비의 스프링] 2.3 개발자를 위한 테스팅 프레임워크 JUnit (0) | 2022.12.22 |
[토비의 스프링] 2.1 UserDaoTest 다시 보기 (0) | 2022.12.12 |
[토비의 스프링] 1장 정리 [IoC와 DI] (0) | 2022.12.08 |
[토비의 스프링] 1.8 XML을 이용한 설정 (0) | 2022.12.08 |