스프링/토비의 스프링

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

Rudtjs 2023. 4. 27. 16:55

현대의 앱이 복잡해져 가며, 테스트의 중요성은 더욱 높아지고 있고,

스프링에서는 테스트를 쉽게 해주는 도구들을 제공한다.

 

작은 단위의 테스트

한꺼번에 너무 많은 것을 몰아서 테스트하면 테스트 수행 과정도 복잡해지고, 오류가 발생했을 때 정확한 원인을 찾기가 힘들어진다. 따라서 테스트는 작은 단위로 쪼개서 하는 것이 좋다.

여기서 말하는 작은 단위는 어느 정도인지 정해진 것이 아니지만, 일반적으로 단위는 작을수록 좋다.

 

좋은 테스트의 특징

테스트의 일관성

  • 외부 영향에 상관이 없어야 하고, 반복적으로 테스트를 해도 항상 동일한 결과를 내야 한다.
  • 중복된 데이터로 문제가 일어날 수 있는 경우는 테스트를 수행 후 사용자 정보를 삭제해서 수행하기 이전 상태를 만들어주는 것이다.

포괄적인 테스트

  • 네거티브 테스트 부정적인 케이스를 만들어 테스트를 하여 비용 절감을 할 수 있다.
  • 다양한 상황과 입력 값을 고려하는 포괄적인 테스트를 만드는 것이 좋다.

테스트 주도 개발(TDD)

TDD란 만들고자 하는 기능의 내용을 담고 있으면서 만들어진 코드를 검증도 해줄 수 있도록 테스트 코드를 먼저 만드는 개발 방법이다.

TDD 기능 설계

  • 조건, 행위, 결과(when, if, then)로 표현하는 것이 좋다.

JUnit5 프레임워크의 동작 방식

  1. 테스트 클래스에서 사용될 오브젝트를 하나 만든다. 
  2. @BeforeEach가 붙은 메서드가 있는지 찾고 각 테스트 전에 먼저 실행하게 된다.
  3. @Test가 붙은 메서드를 호출하고 테스트 결과를 저장해둔다.
  4. @AfterEach가 붙은 메서드가 있는지 찾고 각 테스트 이후에 실행하게 된다.
  5. 모든 테스트 메서드에 대해 2~5번을 반복한다.
JUnit5는 스프링이 테스트하기 좋은 환경을 제공해 준다.

 

학습 테스트

자신이 작성하지 않은 라이브러리나 프레임워크에 대해 테스트를 작성해야 한다. 이를 학습 테스트라 부르며, 검증이 아닌 사용 방법을 배우는 것이 목적이다.

장점으로는

  1. 다양한 조건에 따른 기능을 손쉽게 확인할 수 있다
    자동화된 테스트 코드를 작성한다면 조건을 바꿔가며 기능이 어떻게 동작하는지 쉽고 빠르게 관측할 수 있다.
  2. 학습 테스트 코드를 개발 중에 참고할 수 있다.
    학습의 목적으로 테스트를 진행하면 실제 개발에서 샘플코드로 참고할 수 있는 좋은 자료가 된다.
  3. 프레임워크나 제품을 업그레이드할 때 호환성 검증을 도와준다.

버그 테스트테스트의 완성도를 높여준다.

버그 테스트는 코드의 오류를 가장 잘 드러내 줄 수 있는 테스트를 말한다. 실패하는 버그 테스트를 잘 작성했다면, 해당 테스트가 성공할 수 있도록 수정한다.

장점으로는

  1. 테스트의 완성도를 높여준다.
  2. 버그의 내용을 명확하게 분석할 수 있다.
  3. 기술적인 문제를 해결하는 데 도움이 된다.

정리

  • 테스트는 자동화되고 빠르게 실행할 수 있어야 한다.
  • main()을 이용하지 말고, JUnit 프레임워크를 이용하면 테스트 자동화가 가능하다.
  • 테스트 결과는 일관성이 있어야 한다.
  • 환경이나 테스트 순서에 영향을 받으면 안 된다.
  • 테스트는 포괄적으로 작성해야 한다. 충분한 검증이 없는 테스트는 없는 것보다 나쁘다.
  • 네거티브 테스트 먼저 작성하는 습관을 들이자.
  • 코드 작성과 테스트 수행의 간격이 짧을수록 효과적이다.
  • 테스트하기 쉬운 코드가 좋은 코드다.
  • 테스트를 먼저 만들고 테스트를 성공시키는 코드를 만들어가는 TDD도 유용하다.
  • 테스트 코드도 애플리케이션 코드와 마찬가지로 적절한 리팩토링이 필요하다.
  • @BeforeEach, @AfterEach를 사용해서 테스트 메소드들의 공통 준비 작업과 정리 작업을 처리할 수 있다.
  • 스프링 테스트 컨텍스트 프레임워크를 이용하면 테스트 성능을 향상할 수 있다.
  • 동일한 설정 파일을 사용하는 테스트는 하나의 애플리케이션 컨텍스트를 공유한다.
  • @Autowired를 사용하면 컨텍스트의 빈을 테스트 오브젝트에 DI 할 수 있다.
  • 학습 테스트를 이용하면 기술의 사용 방법을 익히고 이해를 도울 수 있다.
  • 오류가 발견되는 경우 버그 테스트를 만들어두면 유용하다.