2022. 6. 9. 21:09ㆍ토비의 스터디
2.2.1 테스트 검증의 자동화
테스트의 결과는 성공과 실패로 나뉜다. 실패는 테스트를 진행하는 동안에 에러가 발생하는 경우와, 에러가 발생하지 않았지만 결과가 기대한 바와 다른 경우로 나뉜다. 전자를 테스트 에러, 후자를 테스트 실패라고 구분한다.
테스트 중 에러가 발생하는 것은 콘솔에 출력되므로 쉽게 확인이 가능하다. 하지만 실패하는 것은 별도의 확인 작업과 그 결과가 있어야 알 수 있다.
테스트 코드를 다음과 같이 변경해보자.
if(!user.getName().equals(user2.getName()){
System.out.println("테스트 실패 (name)");
}else if(!user.getPassword().equals(user2.getPassword()){
System.out.println("테스트 실패 (Password)");
}else {
System.out.println("조회 테스트 성공");
}
기대한 바와 다른 값이 있다면 테스트가 실패 할 것이며, 콘솔창에는 어떤 것 때문에 실패했는지 알 수 있도록 필드명을 추가했다.
2.2.2 테스트의 효율적인 수행과 결과 관리
이제 main() 메소드로 만든 테스트는 필요한 기능은 모두 갖추었다. 하지만 단순한 main() 메소드로는 편리한 테스트 수행과 결과 확인이 어렵다.
다음으로 소개할 JUnit 프레임워크를 사용하면 테스트 결과를 종합해서 볼 수 있고, 실패한 곳을 빠르게 찾을수도 있다.
JUnit 테스트로 전환
지금껏 작성한 main() 테스트를 JUnit을 이용해 재작성한다. JUnit도 프레임워크 중 하나로, 개발자가 작성한 클래스에 대한 제어권한을 넘겨받아 주도적으로 애플리케이션의 흐름을 제어한다.
테스트 메소드 전환
기존 main() 테스트 메소드는 프레임워크에 적용하기엔 적합하지 않다. main() 메소드로 만들어졌다는 건 제어권을 직접 갖는다는 의미이기 때문이다.
그래서 가장 먼저, main() 메소드의 테스트 코드들을 일반 메소드로 옮기는 작업을 수행한다.
새로 만들 테스트 메소드는 JUnit 프레임워크가 요구하는 두가지 조건을 따라야 한다.
1. 메소드가 public으로 선언될 것 (책은 JUnit4를 기준으로 설명되어있다. 내 알기로 JUnit5에는 public 접근제거자를 사용해도, 안해도 된다)
2. 메소드에 @Test 애노테이션을 붙일 것
위의 조건을 갖추어 테스트 메소드를 재구성했다.
import org.junit.Test;
...
public class UserDaoTest{
@Test // 테스트 애노테이션과 public 접근제어자
public void addAndGet() throws SQLException{
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
...
UserDao dao = ac.getBean("userDao", UserDao.class);
}
}
검증 코드 전환
if(!user.getName().equals(user2.getName()){
System.out.println("테스트 실패 (name)");
}
...
위의 코드를 JUnit이 제공해주는 assertThat이라는 스태틱 메소드를 이용해 아래와 같이 변경할 수 있다.
assertThat(user2.getName(), is(user.getName()));
assertThat(user2.getPassword(), is(user.getPassword()));
assertThat() 메소드는 첫 번째 파라미터 값을 뒤에 나오는 매처(matcher)라고 불리는 조건으로 비교해서 일치하면 다음으로 넘어가고, 아니면 테스트가 실패하도록 만들어준다. is()는 매처의 일종으로, equals()로 비교해주는 기능이다.
JUnit 테스트 실행
main()메소드를 어디에든 하나 추가하고, 그 안에 JUnitCore 클래스의 main 메소드를 호출해주는 간단한 코드를 넣어 실행할 수 있다.
import org.junit.runner.JUnitCore;
...
public static void main(String[] args){
JUnitCore.main("springbook.user.dao.UserDaoTest");
}
'토비의 스터디' 카테고리의 다른 글
[토비의 스프링 3.1] 2.5 학습 테스트로 배우는 스프링 (0) | 2022.07.04 |
---|---|
[토비의 스프링 3.1] 2.4 스프링 테스트 적용 (0) | 2022.06.30 |
[토비의 스프링 3.1] 2.3 개발자를 위한 테스팅 프레임워크 JUnit (0) | 2022.06.03 |
[토비의 스프링 3.1] 2.1 UserDaoTest 다시 보기 (0) | 2022.06.01 |
[토비의 스프링 3.1] 1.7 의존관계 주입(DI) (0) | 2022.05.28 |