본문 바로가기

JAVA/Spring

[spring] 2. 테스트

해당 글에 사용된 토비의 스프링 3의 그림 및 소스 등에 대한 저작권은 이일민 님께 있습니다. 문제가 발생시 해당 글은 언제든지 내려질 수 있습니다.

해당 글은 이일민 님의 허락하에 작성되었습니다.

덧. 본인의 복습과 정리를 목적으로 작성하였기에 토비의 스프링을 읽지 않으셨다면 잘 안맞는 부분이 있을 수 있습니다.




토비의 스프링 2장은 테스트에 관한 이야기 입니다.


단위테스트

한가지의 관심에만 집중할 수 있도록 작성한 작은 단위의 테스트 코드.

개발자가 설계하고 만든 코드가 의도한 대로 작동하는지 개발자 스스로 빠르게 확인하기 위해 사용.


포괄적인 테스트

전반적인 기능의 동작을 모두 테스트하는 것이라 볼 수 있다.

예를 들어 Dao를 테스트 한다면 CRUD기능들과 예외발생 부분 등을 모두 검증 하는 것이다.



1장에선 초난감 Dao를 개선하였다면, 이번 장에서는 UserDaoTest라는 테스트케이스를 개선하는 작업이 이루어진다.

UserDaoTest 의 

기능

  • main() 메소드를 이용

  • 테스트할 대상인 UserDao의 오브젝트를 가져와 메소드를 호출

  • 테스트에 사용할 입력 값을 직접 코드에서 만듬

  • 테스트 결과를 콘솔에 출력

  • 각 단계가 에러없이 끝나면 콘솔에 성공메세지 출력

문제점

  • 수동 확인 작업의 번거로움

    • 일일히 실행하고 직접 확인하여야 함

  • 실행 작업의 번거로움

    • 테스트할 클래스가 많아질 수록 실행할것도 많아짐


UserDaoTest 개선하기

main() 메소드를 jUnit 메소드로 전환

  -> 수행 부담 감소

테스트 메소드 전환, jUnit 제공 메소들 검증코드 전환

  -> 코드 검증 자동화

사용자 정보가 없는 예외조건에 대한 테스트 

  -> 예외처리 검증

스프링 컨텍스트 사용을 위해 @RunWith, @ContextConfigration 어노테이션 사용 

  -> 스프링을 이용한 DI 가 가능해진다.

@before 어노테이션을 이용하여 초반에 항상 테이블을 초기화 해 줌으로써 동일한 결과의 보장

@Autowired 어노테이션을 이용하여 간편한 DI - 차후 설명

ApplicationContext는 자기 자신도 Spring Bean으로 만든다.

테스트를 위한 별도의 ApplicationContext 설정 파일 

  -> 실제 코드와 테스트 코드의 관리 용이 및 실수 방지(실서버 디비가 날라간다던가...)


jUnit ?

자바 개발자를 위한 테스팅 프레임워크


jUnit 이 테스트 클래스를 가져와 테스트를 수행하는 방식


  1. 테스트 클래스에서 @Test가 붙은 public void 형, 파라미터가 없는 테스트 메소드를 모두 찾는다.

  2. 테스트 클래스 오브젝트를 하나 만든다.

  3. @Before가 붙은 메소드가 있으면 실행

  4. @Test 가 붙은 메소드를 하나 호출하고 테스트 결과 저장

  5. @After 가 붙은 메솓가 있으면 실행

  6. 나머지 테스트 메소드에 대해 2~5번 반복

  7. 모든 결과를 종합하여 돌려줌



TIP

침투적 기술과 비 침투적 기술

침투적 기술은 기술을 적용 했을 때 코드에 기술관련 api가 등장하거나, 특정 인터페이스나 클래스를 사용하도록 강제하는 기술.

침투적 기술을 사용하면 코드가 해당 기술에 종속되는 결과를 가져온다.

비침투적 기술은 어플리케이션 로직을 담은 코드에 아무런 영향을 주지 않고 적용이 된다. 따라서 기술에 비 종속적인 순수한 코드를 유지할 수 있게 해준다. 스프링은 이런 비침투적 기술의 대표적인 예다.


동등분할(equivalence partitioning)

같은 결과를 내는 값의 범위를 구분해서 각 대표 값으로 테스트를 하는 방법. 어떤 작업 결과가 총 세가지라면(true, false, exception) 각 결과를 내는 입력 값이나 상황에 따른 조합을 만들어 모든 경우에 대한 테스트를 하는 것이 좋다.


경계값 분석(boundary value analysis)

에러는 동등분할 범위의 경계에서 주로 발생하는 특징을 이용하여 경계의 근처에 대한 값을 이용해 테스트 하는 방법. 숫자의 경우 0이나 그 주변 값, 혹은 정수의 최대값 최소값 등으로 테스트를 하면 도움이 된다.




샘플 코드

https://github.com/maximinhan/mytobyspring3/tree/master/spring02


'JAVA > Spring' 카테고리의 다른 글

[Spring] 1. 오브젝트와 의존관계  (0) 2013.10.17
[Spring] 스프링 정리 시작합니다.  (0) 2013.10.17