테스트는 가능하면 작은 단위로 쪼개서 집중해서 할 수 있어야 한다.

단위 테스트 : 작은 단위의 코드에 대해 테스트를 수행한 것



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 의 내용이 바뀐다면 

다른 테스트 클레스에도 공유되어 양향을 미치기 때문에 

해당 어노테이션을 이용하면 애플리케이션 컨텍스트 공유를 허용하지 않는다. 

- 해당 어노테이션의 메서드의 실행이 끝나고 나면 이후에 진행되는 테스트를 위해 

변경된 애플리케이션 컨텍스트는 폐기되고 새로운 애플리케이션 컨텍스트가 만들어짐


<정리>

- 테스트는 자동화되야 하고, 빠르게 실행할 수 있어야 한다.

- 테스트하기 쉬운 코드가 좋은 코드

- 테스트를 먼저 만들고 테스트를 성공시키는 코드를 만들어가는 게 테스트 주도 개발



+ Recent posts