테스트는 가능하면 작은 단위로 쪼개서 집중해서 할 수 있어야 한다.
단위 테스트 : 작은 단위의 코드에 대해 테스트를 수행한 것
JUnit 프레임워크
요구조건
public 메서드
@Test 어노테이션
assertThat() 메서드
ex) assertThat(user1.getName()), is(user2.getName()));
첫번째 파라미터를 뒤에 파라미터와 비교해서
일치하면 넘어가고 아니면 테스트가 실패 (AssertionError)
is()는 equals() 로 비교해주는 기능
EmptyResultDataAccessException
ex)
@Test(expected=EmptyResultDataAccessException.class)
public void getUser() throws SQLException {
...
}
없는 결과를 가져왔을때 예외를 던지도록 테스트 할 때 사용
테스트 중에 특정 예외가 던져지만 테스트가 성공
테스트 주도 개발 ( TDD : Test Driven Development )
- 만들고자 하는 기능의 내용을 담고 있으면서
만들어진 코드를 검증도 해줄 수 있도록 테스트 코드를 먼저 만들고,
테스트를 성공하게 해주는 코드를 작성하는 방식의 개발
- 테스트 우선 개발 ( TFD : Test First Development ) 이라고도 함
- 테스트를 먼저 만들고 그 테스트가 성공하도록 하는 코드만 만드는 방식
@Before
@Test 메서드가 실행되기 전에 먼저 실행되야 하는 메서드
@After
@Test 메서드가 실행된 후에 실행되는 메서드
Junit이 수행하는 방식
1. 테스트 클래스에서 @Test가 붙은 public, void, 파라미터가 없는 테스트 메서드를 찾음
2. 테스트 클래스의 오브젝트를 하나 만듬
- 각 테스트가 서로 영향을 주지 않고 독립적으로 샐행됨을 보장해주기 위해
3. @Before가 붙은 메서드가 있으면 실행
4. @Test가 붙은 메서드를 하나 호출하고 테스트 결과를 저장
5. @After가 붙은 메서드가 있으면 실행
6. 나머지 테스트 메서드에 대해 2~3번 반복
7. 모든 테스트의 결과를 종합해서 돌려줌
픽스처 (fixture)
- 테스트를 수행하는 데 필요한 정보나 오브젝트
- @Before 메서드를 이용해 생성해 두면 편리
@BeforeClass 메서드
- @Before 메서드가 테스트마다 실행되기 때문에
리소스가 매번 생성될 수 있어서 Junit은 @BeforeClass 스태틱 메서도를 지원
- 하지만 이보다 스프링이 직접 제공하는 애플리케이션 컨테스트 테스트 지원 기능을 사용하는 것이 더 편하다.
@RunWith(SpringJunit4ClassRunner.class)
- Junit 프레임워크의 테스트 실행방법을 확장할 때 사용하는 어노테이션
- SpringJunit4ClassRunner라는 JUnit용 테스트 컨텍스트 프레임워크 확장 클래스를 지정해주면
Junit이 테스트를 진행하는 중에 테스트가 사용할 애플리케이션 컨텍스트를 만들고 관리하는 작업을 진행해 줌
@Contextconfiguration
- 자동으로 만들어줄 애플리케이션 컨텍스트의 설정파일 위치를 지정한 것
테스트 클래스의 컨텍스트공유
- 여러 개의 테스트 클래스에서 같은 설정파일을 사용하는 경우에
단 한개의 애플리케이션 컨텍스트만 만들어지고, 그 한개로 공유해서 사용한다.
ex)
@RunWith(SpringJunit4ClassRunner.class)
@Contextconfiguration(locations="/applicationContext.xml")
public class UserDaoTest {...}
@RunWith(SpringJunit4ClassRunner.class)
@Contextconfiguration(locations="/applicationContext.xml")
public class GroupDaoTest {...}
위 예제에서 사용하는 applicationContext.xml 을 공유하게 된다.
@DirtiesContext
- 테스트 메서드에서 애플리케이션 컨텍스트의 구성이나 상태가 변경한다는 것을
테스트 컨텍스트 프레임워크에 알려준다.
- 즉, 테스트에서 applicationContext.xml 의 내용이 바뀐다면
다른 테스트 클레스에도 공유되어 양향을 미치기 때문에
해당 어노테이션을 이용하면 애플리케이션 컨텍스트 공유를 허용하지 않는다.
- 해당 어노테이션의 메서드의 실행이 끝나고 나면 이후에 진행되는 테스트를 위해
변경된 애플리케이션 컨텍스트는 폐기되고 새로운 애플리케이션 컨텍스트가 만들어짐
<정리>
- 테스트는 자동화되야 하고, 빠르게 실행할 수 있어야 한다.
- 테스트하기 쉬운 코드가 좋은 코드
- 테스트를 먼저 만들고 테스트를 성공시키는 코드를 만들어가는 게 테스트 주도 개발
'책 > 토비 스프링 2020' 카테고리의 다른 글
(토비의 스프링) 4. 예외 (0) | 2019.12.20 |
---|---|
(토비의 스프링) 3. 템플릿 (0) | 2019.12.19 |
(토비의 스프링) 1. 오브젝트와 의존관계 (IoC/DI ) (0) | 2019.12.18 |
(토비의 스프링) 1. 오브젝트와 의존관계 (DAO의 분리와 확장) (0) | 2019.12.18 |
[2017] 7. 스프링 핵심 기술의 응용 (0) | 2018.01.12 |