본문 바로가기

소프트웨어 이야기/테스트 자동화

유닛테스트를 작성하는 3가지 접근방법 - Test First VS Test Last VS Test Driven

해당 글은 Unit Testing with Python: Why and When Should You Write Unit Tests? 세션의 요약본입니다 ㅎㅂㅎ.



개발할 때, 테스트 코드를 작성하는 접근 방식은 크게 3가지가 있다. 



Test Last




개발 다 하고, 오류가 없는지 검증하기 위한 목적으로 회귀 테스트를 작성하는 방식이다. 


Test Last 방식도 개발 중간에 테스트를 한다. 중간 중간에 수동테스트를 하면서, 기대한대로 코드가 동작하는지 확인한다. 


테스트 케이스를 개발 이후, 마지막에 작성하는걸 선호하는 사람들이 많다. 나도 수동테스트를 할 때는, 개발을 다 하고나서 작성하는 편이다. 


( 회귀 테스트란? 

회귀 테스트는 한 모듈의 수정이 다른 부분에 영향을 끼칠 수도 있다고 생각하여 수정된 모듈뿐 아니라 관련된 모듈까지 문제가 없는지 테스트하는 것이다. 따라서 회귀 테스트는 한 모듈의 수정이 다른 부분에 미치는 영향을 최소화하기 위해 필요하다.)



장점

  • 코드 설계가 안정화될 때까지, 자동화 테스트 설계에 시간을 쓰지 않아도 된다. 
  • 중간에 설계를 바꿀 때마다, 테스트 케이스를 고치거나, 다시 작성하지 않아도 된다.
  • 만약, A클래스에 있던 함수를 B클래스로 옮기는 방식으로 설계를 변경했다고 생각해보자.
  • 이 함수에 테스트코드가 달려있었다면, 테스트 코드도 A클래스에 대한 테스트코드에서 B클래스에 대한 테스트코드로 변경해줘야한다. 

단점

  • 테스트하기 어려운 방식으로 코드가 설계되었을 가능성이 높다. 
  • 코드의 의존성이 높아서, 코드의 일부만 테스트하는 테스트코드를 작성하기 어렵다.
  • 그래서 테스트를 하기 쉽게 코드를 변경하려고 하면, 기존 코드를 많이 고쳐야해서, 건드리기 어려운 상황이 된다. 
  • 게다가 테스트케이스를 작성하다가, 버그가 발견될 수도 있다. 테스트 케이스를 먼저 작성했다면, 버그를 좀더 빨리 찾았을거다.
  • 그러다보면, 일을 다 끝났다고 생각했지만, 다시 일해야하는 경우가 잦아진다. 
  • 그래서 테스트하기 좋은 방식으로 코드를 재설계하고, 결함발견으로 인한 디버깅으로 시간을 쏟게된다.
  • 그래서 지치고, 멘붕겪기 쉽다. 그래서 테스트를 작성할 시간이 부족해지고, 중요한 테스트 케이스를 놓치게 될 가능성이 높아진다. 


Test First



개발 초기에 테스트코드를 작성하는 방법이다. 


순서는 이렇다. 

  1. 코드 작성을 위한 러프한 인터페이스를 만든다.
  2. 고려해야하는 모든 테스트 케이스 설계한다. 
  3. 모든 테스트 케이스가 작성되면, 이제 이 테스트들이 통과하도록 코드 작성을 시작한다. 

장점

  • 코딩 단계에서, 코딩에만 집중할 수 있다.
  • 그리고 작업이 다 완료되면, 테스트 케이스를 돌려서, 내가 예상한 데로 소프트웨어가 잘 동작하는지 확인할 수 있다.
  • 그리고 업무의 진척도를 파악하기도 쉽다.  
  • 구현 전에 테스트 가능한 인터페이스를 설계한다. 
  • 그래서 Test Last 때처럼, 함수 단위가 테스트하기 어려워서 고생하는 일이 줄어든다.
  • 미리 테스트케이스를 작성하는 방식은, 주요 기능의 테스트 커버리지를 높이는 데에 도움이 된다. 
  • Test Last 때처럼 중간에 지쳐서, 중요한 테스트 케이스를 놓치는 것을 방지할 수 있다.


단점


 

이게 현실.


  • 이것도 반복작업이 있다. 완벽한 테스트케이스 리스트업은 어렵다. 개발도중 계속 테스트케이스를 추가하고, 리팩토링을 해야한다. 처음부터 이걸 인정하는게 좋다.


Test Driven



  • 개발 단계에서 코드 작성 + 테스트 케이스 작성을 같이 하는 방식이다. 
  • 반복적으로, 그리고 점진적으로 코드와 테스트 케이스 커버리지를 높여가는 방식이다. 
  • 한번에 1개의 테스트코드를 작성하고, 이 테스트 코드가 통과하는 코드를 구현하는 방식이다. 
  • 점진적으로 코드 / 테스크 케이스 작성이 완성되어가는 거여서, 재작업이 필요하지 않다.