본문 바로가기

Spring

토비의 스프링 2장 - 테스트

2장을 읽고난 후 든 생각, '테스트'는 개발의 '전부'이자, '테스트'가 없으면 '개발'도 없다

TDD 방식이 너무 매혹적으로 다가왔고, 차주부터는 반드시 적용해볼 생각이다

 

토비님의 정리

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

- main()테스트 대신 JUnit 프레임워크를 이용한 테스트작성이 편리하다

- 테스트 결과는 일관성이 있어야 한다. 코드의 변경 없이 환경이나 테스트 실행 순서에 따라 결과가 달라지면 안된다

- 테스트는 포괄적으로 작성해야 한다. 충분한 검증을 하지 않는 테스트는 없는것보다 나쁠 수 있다

- 코드 작성과 테스트 수행의 간격이 짧을수록 효과적이다

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

- 테스트를 먼저 만들고 테스트를 성공시키는 코드를 만들어가는 테스트 주도 개발방법(Test Driven Development)도 유용하다 <- 개인적으로 너무 매력적이었다

- 테스트 코드도 애플리케이션 코드와 마찬가지로 적절한 리팩토링이 필요하다

- @Before, @After를 사용해서 테스트 메소드들의 공통준비 작업과 정리 작업을 처리할 수 있다

- 스프링 테스트 컨텍스트 프레임워크를 이용하면 테스트 성능을 향상시킬 수 있다

- 동일한 설정파일을 사용하는 테스트는 하나의 애플리케이션 컨텍스트를 공유한다

- @Autowired를 사용하면 컨텍스트의 빈을 테스트 오브젝트에 DI 할 수 있다

- 기술의 사용방법을 익히고 이해를 돕기 위해 학습 테스트를 작성 하자 <- 새로운 서비스를 접할때, 써보도록

- 오류가 발견될 경우 그에 대한 버그테스트를 만들어두면 유용하다 <- 버그테스트를 만들 정도면, 이미 그 버그는 수정되있지 않을까?

 

개인적으로 정리

JUnit 프레임워크를 사용하기 위한 조건

- 테스트를 하기위한 메소드에 @Test를 붙여줄것

- public void형 메소드여야 함

- 파라메터가 없어야 함

 

JUnit 프레임워크를 사용한 테스트 수행 방식

  1. 테스트 클래스에서 @Test가 붙은 public void형 파라메터가 없는 테스트메소드를 모두 찾는다
  2. 테스트 클래스의 오브젝트를 하나 만든다
  3. @Before가 붙은 메소드가 있으면 실행한다
  4. @Test가 붙은 메소드를 하나 호출하고 테스트 결과를 저장해둔다
  5. @After가 붙은 메소드가 있으면 실행한다
  6. 나머지 테스트 메소드에 대해 2~5번을 반복한다
  7. 모든 테스트의 결과를 종합해서 돌려준다

픽스처, Fixture

테스트를 수행하는 데 필요한 정보나 오브젝트를 픽스처라고 한다. 일반적으로 픽스처는 여러 테스트에서 반복적으로 사용되기 때문에 @Before 메소드를 이용해 생성해두곤 한다.

 

스프링 테스트 컨텍스트 프레임워크

스프링은 JUnit을 이용하는 테스트 컨텍스트 프레임워크를 제공한다. 테스트 컨텍스트의 지원을 받으면 간단한 애노테이션 설정만으로 테스트에서 필요로 하는 애플리케이션 컨텍스트를 만들어서 모든 테스트가 공유할 수 있게 할 수 있다.

애노테이션 이름 사용 대상 내용
@RunWith(SpringJUnit4ClassRunner.class) 테스트 Class 스프링의 테스트 컨텍스트 프레임워크의 JUnit 확장기능 지정
@ContextConfiguration(locations="/applicationContext.xml") 테스트 Class 테스트 컨텍스트가 자동으로 만들어줄 애플리케이션 컨텍스트 위치 지정
@Autowired 인스턴스 변수 테스트 오브젝트가 만들어지고 나면 스프링 테스트 컨텍스트에 의해 자동으로 값이 주입된다
@DirtiesContext 테스트 Class 혹은 테스트 Method 

스프링 테스트 컨텍스트에 의한 DI 말고, 별도로 직접 DI를 하고자 하는경우 붙여준다.

테스트 Class에 붙는 경우, 변경된 Context로부터 다른 테스트에 영향을 주지 않게 하기 위해 각 테스트 메소드마다 Context를 생성한다

 

테스트 Method에 붙는 경우, 해당 메소드에서 Context를 변경한 후 다음 테스트 메소드를 진행할 때에 변경된 Context는 폐기한 후 새로운 Context를 만들어 진행한다

 

@Autowired

@Autowired가 붙은 인스턴스 변수가 있으면, 테스트 컨텍스트 프레임워크는 아래와 같이 빈을 찾는다

  1. @Autowired가 붙은 변수 타입과 일치하는 컨텍스트 내의 빈을 찾는다
  2. 혹, 같은 타입의 빈이 두 개 이상 있는 경우에는 변수의 이름과 같은 이름의 빈을 찾는다
  3. 변수 이름마저 동일하거나, 해당하는 빈을 찾지 못하는 경우 예외가 발생한다

2번의 이해를 돕기 위해 추가 설명을 하자면,

아래와 같이 @Autowired로 인스턴스가 선언되어 있다. 그리고 컨텍스트 내에 DataSource 타입의 빈이 두개 있는데, 하나는  dataSource이고 다른하나는 dataSource2라면 첫번째 빈이 주입될 것이다.

@Autowired
DataSource dataSource;

'Spring' 카테고리의 다른 글

AbstractRoutingDataSource  (0) 2020.01.28
QueryDSL  (0) 2020.01.28
Spring Cloud Data Flow  (0) 2020.01.06
토비의 스프링 1장 - 오브젝트와 의존관계  (0) 2019.06.01