TDD(Test Driven Development) 테스트 주도 개발

TDD(Test Driven Development)란?

  • 테스트 주도 개발
  • 우선 테스트 코드를 작성하고 이를 통해서 테스트를 하여 제대로 동작하는지에 대한 피드백을 받아가면 진행하는 개발 방법이다.
  • 매주 짧은 개발 사이클의 반복에 의존하는 개발 프로세스로, 개발자는 우선 요구되는 기능에 대한 테스트케이스를 작성하고, 그에 맞는 코드를 작성하여 테스트를 통과한 후에 상황에 맞게 리팩토링하는 개발 방식을 의미한다.
  • 개발자는 테스트를 작성하기 위해 해당 기능의 요구사항을 확실히 이해해야 하기 때문에 개발 전에 요구 사하에 집중할 수 있도록 도와주지만, 테스트를 위한 진입 장벽과 작성해야 하는 코드의 증가는 단점으로 뽑한다.

Mock 이란?

실제 객체를 만들어 사용하기에는 비용이 크고, 객체간 의존성이 높아 구현하기 힘들 경우 만드는 가짜 객체를 말한다.

Mock 사용 예시

  • 테스트 작성을 위한 환경 구축
  • 테스트가 특정 경우나 순간에 의존적인 경우
  • 테스트 시간이 오래 걸리는 경우
  • 개인 PC나 서버의 성능 문제로 동작이 오래 걸릴 수 있는 경우

Mockito란?

  • 유닛 테스트를 위한 Java mocking framework이다.
  • 자바 단위테스트에서 모의(Mock) 객체를 지원해주는 테스트 프레임워크이다.
  • 즉, 단위 테스트를 하기 위해 Mock을 만들어주는 프레임워크이다.
  • Mock 객체 생성, Mock 객체 동작을 지정, 그리고 테스트 대상 로직이 제대로 수행되었는지 확인 가능하다.
  • 일반적으로 Spring과 같은 웹 어플리케이션을 개발한다고 하면, 여러 객체들 간의 의존성이 존재한다. 이러한 의존성은 단위 테스트를 작성하는 것을 어렵게 하는데, 이를 해결하기 위해 가짜 객체를 주입시켜주는 Mockito 라이브러리를 활용ㅎ할 수 있다.
  • Mockito를 활용함으로써 가짜 객체에 원하는 결과를 Stub하여 단위 테스트를 진행할 수 있다.

Mock 객체 의존성 주입

  • Mockito에서 Mock(가짜) 객체의 의존성 주입을 위해서 크게 3가지 어노테이션이 사용된다.
    • @Mock
      • Mock 객체를 만들어 반환해주는 어노테이션
    • @Spy
      • Stub하지 않은 메소드들은 원본 메소드 그대로 사용하는 어노테이션
    • @InjectMock
      • @Mock 또는 @Spy로 생성된 가짝 객체를 자동으로 주입시켜주는 어노테이션
      • 예를 들어 UserController에 대한 단위 테스트를 작성하고자 할때, UserService를 사용하고 있다면 @Mock 어노테이션을 통해 가짜 UserService를 만들고, @injectMocks을 통해 UserController에 이를 주입시킬 수 있다.