테스트 코드

[TDD] 테스트 코드가 필요한 이유?

후뿡이 2023. 11. 12. 00:12

아래의 글은 패스트캠퍼스 강의 "The RED : 이규원의 현실 세상의 TDD : 안정감을 주는 코드 작성 방법"을 수강하고 작성한 글입니다.

 

🐳 도대체 왜 테스트코드가 필요해 ?

 

본인이 수백억 대의 매출 규모를 가진 서비스를 유지보수하고 있다고 생각해 보자.

그런데 여기에 신규 기능으로 새로운 할인 쿠폰을 추가하려고 한다고 가정하자.

기능 개발 후에 작성한 시나리오 기반으로 여러 가지 실험을 하면서 테스트를 완료했다.

 

하지만 그럼에도 불길한 기분은 떨칠 수 없을 것이다.

"내가 테스트를 잘못했으면 어떡하지?"

"놓친 테스트가 있으면 어떡하지"

"다른 기능에 이상이 생기면 어떡하지"

위와 같은 불길한 생각이 떠나지 않을 것이다.

 

그렇다고 신규 기능을 개발한 부분 외에 모든 기능을 일일이 테스트하는 것 또한 너무 많은 시간과 노력이 소요될 것이다.

 

그래서 필요한 게 테스트 자동화이다 !

이 상황에 테스트코드가 있다고 생각해 보자

신규 기능을 개발한 후에 테스트코드를 실행하고 모든 테스트코드에 초록불이 들어왔다.

그렇다면 안심하고 배포할 수 있지 않을까? ( 테스트를 전부 통과한다고 오류가 전혀 없진 않겠지만 )

 

켄트 백은 "TDD by example"이라는 책에서 "테스트코드 작성은 불안함을 지루함으로 바꾸는 과정"라고 말했다

불안함을 지루함으로 바꿀 수 있다니, 실로 배부른 소리가 아닌가 !?

 

🐳 테스트 자동화

사실 우리는 이미 테스트를 진행하고 있다.

포스트맨이든, 노트북을 놓고 팀원들과 함께 실제로 사용하던 다양한 방법을 통해 테스트를 진행하고 있다.

 

하지만 위의 방법들은 모두 인간이 수행해야 한다.

그 말은 즉 실수를 발생할 가능성이 높으며, 많은 자원이 든다는 것을 의미한다.

게다가 피드백 속도 또한 느릴 수밖에 없다.

 

그래서 테스트코드 작성을 통해 테스트 자동화가 필요하다.

테스트 자동화는 작성한 테스트코드를 컴퓨터가 실행해 주기 때문에

실행 속도가 빠르고 언제든지 가능하며 비용이 저렴하다 !

즉 피드백 주기가 짧다는 것을 의미한다.

 

짧은 피드백 주기를 통해 계속해서 코드를 검증하고 오류를 찾아내는 것이다.

여러분들의 코드에 화재가 발생하는 것을 감지하고 알려줄 것이다 !

이제는 가스레인지에 불 올려놓고 집 밖으로 나가는 것을 테스트 코드가 여러분을 위해 잡아줄 것이다 !

 

🐳 TDD의 단계

테스트코드 작성의 필요성은 알겠는데 그렇다면 어떻게 테스트 코드를 작성해야 할까 ?

 

TDD의 단계는 크게 세 단계로 이루어진다.

  1. 레드
  2. 그린
  3. 리팩토링

 

1. 레드 단계

레드 단계는 테스트 코드를 작성하고 테스트코드를 실행해 실패하는 단계를 의미한다.

그런데 코드 실패 단계는 왜 해야 할까? 

  • 요구사항 정의
  • 테스트코드의 검증력 테스트

우선 레드 단계는 요구사항을 정의하는 단계이다. 운영코드가 요구하는 것을 테스트코드에서 미리 정의하는 것이다.

그리고 테스트를 실행해 테스트가 실패함으로써 테스트 코드가 검증력이 있다는 것을 확인하는 단계이다

 

이때 중요한 것은 복잡한 것을 테스트하는 것이 아니라 구체적인 하나의 테스트 코드를 작성해야 한다는 것이다.

 

2. 그린 단계

운영코드를 작성해 테스트를 통과하는 단계이다.

요구사항을 만족시키는 단계라고 할 수 있다.

여기서 중요한 것은 테스트를 통과시킬 만큼만의 운영코드를 작성해야 한다.

왜냐하면 필요 이상의 코드를 추가하게 되면 테스트되지 않은 코드가 발생하기 때문이다.

켄트벡은 "Fewest Elements"를 사용하라고 한다.

테스트 통과에 필요한 코드가 아닌 코드는 전부 삭제하라는 의미이다.

이렇게 테스트 통과에 도움이 되지 않는 불필요한 코드를 삭제하면 테스트되지 않은 코드가 추가되는 일을 방지할 수 있다.

 

3. 블루 단계

리팩터링 단계이다.

이는 인터페이스(클라이언트가 보는 인터페이스)를 바꾸는 것이 아닌 내부의 구현설계 과정을 바꾸는 것

리팩토링을 하는 목적은 크게 세 가지로 분류할 수 있다.

  • 가독성
  • 적응성 - 환경변화에 대한
  • 성능

이 단계에서 중요한 것은 인터페이스는 동일하고 또한 테스트를 통과해야 한다.

 

이러한 세 가지 과정을 통해 테스트 주도 개발이 진행된다.

 

🐳 오늘의 결론

누구나 서비스를 운영해 본 경험이 있다면 테스트코드의 작성의 필요성을 느꼈을 것이다.

더는 지체하지 말고 테스트코드 작성을 습관화해보자!