2.1 UserDaoTest
- 테스트란, 예상하고 의도했던 대로 코드가 정확히 동작하는지 확인해서 코드를 확신할 수 있게 해주는 작업
- 테스트를 통해 결함을 제거하는, 일명 디버깅 과정을 거치게 되고, 최종적으로 테스트가 성공하면 모든 결함이 제거됐다는 확신을 가질 수 있다.
- 웹을 통한 테스트의 문제점 :
1. 특정 기능만을 테스트하고 싶은데(ex.DAO), DAO뿐만 아니라, 해당 코드를 웹에서 실행시키기 위해 서비스 클래스, 컨트롤러, JSP뷰 가지 다 만들어야 테스트가 가능함.
2. 테스트 하는 도중에 에러가 나면, 어디에서 에러가 났는지 전체 코드를 뒤져야 함.
=> 이를 해결하기 위해서는, 한가지 관심사에 집중할 수 있게 작은 단위로 코드를 짜야하고,
이 작은 단위의 코드에 대해서 Unit Test(단위테스트)를 수행하면 된다. 단위테스트를 통해 개발자가 설계하고 만든 코드가 원래 의도대로 동작하는지, 개발자 스스로 빠르게 확인할 수 있다.
2.2 테스트 검증의 자동화
- JUnit은 자바 테스트 지원 도구로, 단위테스트를 만들때 사용하는 도구
- JUnit 프레임워크가 테스트를 위해 요구하는 조건은 2가지
1. 메소드가 public으로 선언되어야 한다는 것
2. 메소드에 @Test라는 어노테이션을 붙여주는 것.
- assertThat(): 첫번째 파라미터의 값을 뒤에 나오는 matcher라고 불리는 조건으로 비교해서, 일치하면 다음으로 넘어가고 아니면 test가 실패하게끔 한다.=> 기대한 결과가 아니면 이 AssertionError를 던진다.
- is() : 매처의 일종으로 equals()와 비교해주는 기능을 함
2.3 개발자를 위한 테스팅 프레임 워크 JUnit
- 테스트 주도 개발 : 만들고자 하는 기능의 내용을 담고 있으면서, 만들어진 코드를 검증도 해줄 수 있도록 테스트 코드를 먼저 만들고, 테스트를 성공하게 해주는 코드를 작성하는 방식
- 개발자가 테스트를 만들어 가며 개발하는 방법이 주는 장점을 극대화한 방식
=> 장점1. 테스트를 실행하는 그 사이의 간격이 매우 짧기 때문에 오류를 금방 찾을 수 있다.
=> 장점2. 작은 단위에서부터 검증을 하기 때문에, 서버를 매번 켜서 전체 테스트하는 것보다 디버깅하는 시간이 절약된다.
- @Before: Junit이 제공하는 어노테이션으로, @Test메서드가 실행되기 전에 먼저 실행되야하는 메서드를 정의한다.
- Junit으로 하나의 테스트 클래스르 가져와 테스트를 수행하는 방식
1. 테스트 클래스에서 @Test가 붙은 public이고 void형이며 파라미터가 없는 테스트 메서드를 모두 찾는다.
2. 테스트 클래스의 오브젝트를 하나 만든다.
3. @Before가 붙은 메소드가 있으면 실행한다.
4. @Test가 붙은 메소드를 하나 호출하고 테스트 결과를 저장해둔다.
5. @After가 붙은 메소드가 있으면 실행한다.
6. 나머지 테스트 메소드에 대해 2~5번을 반복
7. 모든 테스트의 결과를 종합해서 돌려준다.
- 특이한 점은 각 테스트 메소드를 실행할 때마다 테스트 클래스의 오브젝트를 새로 만든다는 것임
=> 각 테스트가 서로 영향을 주지 않고 독립적으로 실행됨을 확실히 보장해주기 위해 그렇게 하였음.
- 테스트를 수행하는데 필요한 정보나 오브젝트를 픽스쳐라고 하며, 픽스쳐는 일반적으로 여러 테스트에서 반복적으로 사용되기 때문에 @Before메소드를 이용하여 중복을 제거하여 생성해두면 편리함.
2.4 스프링 테스트 적용
- 애플리케이션 컨텍스트를 한번만 생성하여 모두 공유할 수 있게끔 Junit에서 테스트 컨텍스트 프레임워크를 제공함.
- 테스트 컨텍스트의 지원을 받으면 간단한 애노테이션 설정만으로 테스트에서 필요로 하는 애플리케이션 컨텍스트를 만들어서 모든 테스트가 공유할 수 있음.
- @ContextConfiguration(loations='/context xml파일 경로')로 하나의 애플리케이션 컨텍스트를 공유할 수 있게 해줌
- @Autowired : 스프링의 DI에서 사용하는 특별한 애노테이션으로, 변수 타입과 일치하는 컨텍스트 내의 빈을 찾고 타입이 일치하는 빈이 있으면 인스턴스 변수에 주입해준다. 생성자나 수정자 같은 메서드에서 따로 설정을 안해줘도 된다는 특징이 있다. 단, 같은 타입의 빈이 2개이상인 경우, 변수의 이름과 같은 빈이 있는지 확인함.
- @DirtiesContext: 해당 애노테이션을 통해 해당 클래스의 테스트에서 애플리케이션 콘텍스트의 상태를 변경해준다는 것을 알려줌
2.5 학습 테스트로 배우는 스프링
- 학습 테스트 : 자신이 만들지 않은 프레임워크나 다른 개발팀에서 만들어서 제공한 라이브러리등에 대해서 테스트 => API나 프레임워크의 기능을 테스트로 보면서 사용방법을 익히는 것.
- 버그 테스트: 코드에 오류가 있을때 그 오류를 가장 잘 드러내줄 수 있는 테스트. => 일단 실패하도록 만든 뒤, 해당 테스트가 성공할 수 있도록 애플리케이션 코드를 수정하는 것.
'Spring' 카테고리의 다른 글
Reactive Programming & Spring Webflux (0) | 2023.10.30 |
---|---|
토비의 스프링 3장 (0) | 2022.09.26 |
토비의 스프링 1장. 오브젝트와 의존관계 (0) | 2022.09.11 |
업무에 쓰인 Bean Validation 정리 (0) | 2022.02.17 |
ClassPathResource (0) | 2022.02.14 |