학습 목표
UserDaoTest의 두 가지 문제점을 개선해보자.
테스트 검증의 자동화
첫 번째 문제점인 테스트 결과의 검증 부분을 코드로 만들어보자. 이 테스트를 통해 확인하고 싶은 사항은 add()로 등록한 사용자 정보와 get()으로 가져온 사용자 정보가 일치하는가이다.
테스트는 성공과 실패라는 두 가지 결과를 보여준다. 테스트에 실패했을 경우 "테스트 실패"이라는 메시지를 출력하고, 성공했을 경우 "테스트 성공"이라는 메시지를 출력하도록 하자.
테스트 결과가 우리가 원하는 대로 잘 나온 것을 확인할 수 있다.
하지만 UserDao 클래스에서 get() 메소드의 user.setName(rs.getNString("name")); 이 부분을 주석 처리하고
테스트를 진행한다면 아래와 같은 테스트 실패 메시지가 나올 것이다.
등록에는 성공을 했지만 보이는 대로 조회를 하는 과정에서 에러가 나는 것을 확인할 수 있다. 이렇게 해서 테스트의 수행과 테스트 값 적용, 그리고 결과를 검증하는 것까지 모두 자동화했다. 이제 거의 모든 과정을 자동화한 테스트가 만들어졌다.
테스트의 효율적인 수행과 결과 관리
자바에는 단순하면서 실용적인 테스트를 위한 도구가 여러 가지 존재한다. 그중에서도 자바 테스팅 프레임워크라고 불리는 JUnit는 누구가 들어봤을 법한 유명한 테스트 지원 도구다. JUnit는 이름 그대로 자바로 단위 테스트를 만들 때 유용하게 쓸 수 있다.
- JUnit 테스트로 전환
지금까지 만든 main() 메소드 테스트를 JUnit를 이용해 다시 작성해보겠다. JUnit는 프레임 워크다. 프레임 워크는 개발자가 만든 클래스에 대한 제어 권한을 넘겨받아서 주도적으로 애플리케이션의 흐름을 제어한다. 개발자가 만든 클래스의 오브젝트를 생성하고 실행하는 일은 프레임워크에 의해 진행된다. 따라서 프레임 워크에서 동작하는 코드는 main() 메소드도 필요 없고 오브젝트를 만들어서 실행시키는 코드를 만들 필요도 없다.
- 테스트 메소드 전환
테스트가 main() 메소드로 만들어졌다는 건 제어권을 직접 갖는다는 의미이므로 프레임 워크에 적용하기엔 적합하지 않다. 그래서 가장 먼저 할 일은 main() 메소드에 있던 테스트 코드를 일반 메소드로 옮기는 것이다.
새로 만드는 테스트 메소드는 JUnit 프레임 워크가 요구하는 두 가지 조건을 따라야 한다.
1. 메소드가 public으로 선언되어야 한다.
2. 메소드에 @Test라는 어노테이션을 붙어야 한다.
main() 대신에 일반 메소드로 만들고 적절한 이름을 붙여준다. 이왕이면 테스트의 의도가 무엇인지 알 수 있는 이름이 좋다. public 액세스 권한을 주는 것을 잊으면 안 된다. JUnit는 전통적으로 public 메소드만을 테스트 메소드로 허용하고 있다. 마지막으로 @Test 어노테이션을 붙여주면 된다.
- 검증 코드 전환
테스트의 결과를 검증하는 if/else 문장을 JUnit가 제공하는 방법을 이용해 전환해보자.
assertThat() 메소드는 첫 번째 파라미터 값을 뒤에 나오는 매처 matcher라고 불리는 조건으로 비교해서 일치하면 다음으로 넘어가고 아니면 실패하도록 만들어준다. is()는 매처의 일종으로 equals()로 비교해주는 기능을 가졌다.
JUnit는 예외가 발생하거나 assertThat()에서 실패하지 않고 테스트 메소드의 실행이 완료되면 테스트가 성공했다고 인식한다. JUnit가 테스트를 실행하고 나면 테스트 결과를 다양한 방법으로 알려주기 때문에 "테스트 성공"이라는 메시지를 굳이 출력할 필요가 없다.
- JUnit 테스트 실행
JUnit 프레임 워크를 이용해 앞에서 만든 테스트 메소드를 실행하도록 코드를 만들어보자. 스프링 컨테이너와 마찬가지로 JUnit 프레임워크도 자바 코드로 만들어진 프로그램이므로 어디선가 한 번은 시작시켜줘야 한다.
어디에든 main() 메소드를 하나 추가하고 그 안에서 JUnitCore 클래스의 main 메소드를 호출해주는 간단한 코드를 넣어주면 된다.
메소드 파라미터에는 @Test 테스트 메소드를 가진 클래스의 이름을 넣어준다. UserDaoTest를 실행할 테니 아래와 같이 넘겨준다.
클래스를 실행하면 다음과 같은 메시지가 출력될 것이다.
테스트를 실행하는 데 걸린 시간과 테스트 결과, 그리고 몇 개의 테스트 메소드가 실행됐는지 알려준다.
만약에 코드에 이상이 있어 assertThat()의 검증에서 실패하면 다음과 같이 에러 메시지가 출력된다.
테스트에 실패하면 FAILURES!!라는 내용이 출력되고 총 수행한 테스트 중에 몇 개가 실패했는지 알려준다.
'Spring > 토비의 스프링 정리' 카테고리의 다른 글
2.5 학습 테스트로 배우는 스프링 (0) | 2022.04.06 |
---|---|
2.4 스프링 테스트 적용 (0) | 2022.04.05 |
2.3 개발자를 위한 테스팅 프레임워크 JUnit (2) | 2022.04.04 |
2-1 UserDaoTest 다시보기 (0) | 2022.03.31 |
1장 오브젝트와 의존관계 (0) | 2022.03.31 |