[리팩터링] 테스트

+ 개발자의 행복

최현섭
None
7 min readAug 2, 2021

--

안녕하세요. Humanscape Software Engineer David 입니다.

마틴 파울러의 리팩터링 2판을 공부하며 4장 테스트 구축하기에 대한 내용을 살펴보려합니다.

테스트 구축

좋은 테스트를 작성하는 일은 개발 효율을 높여준다. 테스트 작성에 시간을 빼앗기는데 효율이 높아진다니? 직관에 어긋나는 효과라서 의문이 들 수 있다. 그 이유를 살펴보자.

프로그래머들이 어떻게 일하는지 가만히 살펴보면 실제로 코드를 작성하는 시간의 비중은 그리 크지 않다.

현재 상황을 파악하기도 하고, 설계를 고민하기도 한다. 대부분의 시간을 디버깅에 쓴다. 누구나 디버깅하느라 밤늦게까지 고생한 경험(무용담)이 있을 것이다. 원인을 명확히 파악했다면 버그 수정 자체는 금방 끝난다.

버그를 찾는 여정이 오래걸리고, 버그를 잡는 과정에서 다른 버그를 심기도 하는데, 이를 한참이 지나서야 알아채기도한다. 이런 과정의 연속이다.

저자인 마틴 파울러는 상당히 게을러서 일을 줄이는 작업이라면 얼마든지 감수할 각오가 돼 있었고, 프로그램이 제대로 된 값을 출력했는지 내가 직접 확인하지 말고, 그 일을 컴퓨터에 맡겨야겠다고 생각했다고 한다.

테스트가 성공했는지 의도한 결과와 같은지만 확인하고 모든 테스트가 성공하면 화면에 “OK”만 출력하도록 하는 걸로 자가 테스트 소프트웨어를 만들었다.

모든 테스트를 완전히 자동화하고 그 결과까지 스스로 검사하게 만들자.

컴파일 할 때마다 테스트도 함께했고, 곧바로 생산성이 급상승했다. 디버깅 시간이 크게 줄어든 것이다.

직전까지 테스트가 성공했다면 마지막 테스트 이후에 작성한 코드에서 버그가 발생했음을 알 수 있다.

테스트가 컴파일 과정에 포함되어있어서 버그가 발생한 지점은 조금 전에 작성한 코드에 있다는 사실도 알 수 있었다. 의심되는 코드의 양이 많지 않고 아직 기억이 생생하니 버그를 쉽게 찾을 수 있었다.

테스트가 없으면, 코드 리뷰에서 발견되거나, 개발 환경에서 발견되거나, 스테이지 환경에서 발견 되거나, Prod 배포 후 발견될 것이다.

뒤로 갈 수록 버그를 찾는 시간과 수정하는 시간은 오래걸린다.

앞단계에서 발견할 수록 디버깅과 버그 픽스 시간은 빨라진다.

테스트는 QA 조직의 효율까지 올려준다.

마틴 파울러는 이러한 사실을 깨닫고 더 적극적으로 테스트에 임한다. 경험 후 너무 효율적이다보니 배포 주기를 기다리지 않고 함수 단위로 테스트하기 시작한다.

다른 사람에게 이런 식의 개발을 설득하기는 녹록지 않았다. 테스트를 작성하려면 소프트웨어 제품 외의 부가적인 코드를 상당량 작성해야하기 때문이다.

실제로 프로그래밍 속도를 높여주는 경험을 직접 해보지 않고서는 자가 테스트의 진가를 납득하긴 어렵다.

그래서 기업 모집공고 우대사항에 테스트 코드를 작성해보신 분이 단골로 들어가는지도 생각해보게 된다.

테스트를 작성하기 가장 좋은 시점은 프로그래밍을 시작하기 전이다. 테스트를 작성하다보면 원하는 기능을 추가하기 위해 무엇이 필요한지 고민하게 된다. 구현보다 인터페이스에 집중하게 된다는 장점도 있다. 책에서는 이를 무조건 좋은 일이라고 설명한다.

테스트를 모두 통과한 시점이 바로 코드를 완성한 시점이다.

테스트는 코딩이 완료되는 시점을 정확하게 판단할 수 있게 해준다.

이것이 켄트백의 TDD이다. 처음에는 통과하지 못할 테스트를 작성하고, 이 테스트를 통과하게끔 코드를 작성하고, 결과 코드를 최대한 깔끔하게 리팩터링하는 과정을 짧은 주기로 반복한다.

TDD는 저자인 마틴 파울러가 프로그래밍하는 방식이자 추천하는 방식이다.

리팩터링 자체만 보더라도 테스트는 필요하다. 그러니 리팩터링하고 싶다면 테스트를 반드시 작성해야 한다. 테스트가 안된 코드를 리팩터링해야 하는 상황이오면? 테스트를 작성 후 리팩터링한다.

테스트 목적은 어디까지나 현재 혹은 향후에 발생하는 버그를 찾는 데 있다.테스트 효과 극대화를 위해 잘못될 걱정이 있는 부분을 집중 테스트하자.

포인트 연산 기능을 예로 들면 포인트의 합계가 음수가 될 수는 없는지 경계 값 테스트가 먼저 필요할 수 있다.

완벽하게 만드느라 테스트를 수행하지 못하느니, 불완전한 테스트라도 작성해 실행하는 게 낫다.

어차피 모든 버그를 잡을 수 없다고 생각하여 테스트를 작성하지 않는다면, 대다수의 버그를 잡을 수 있는 기회를 날리는 셈이다.

정리

  • 테스트는 버그를 찾는 데 걸리는 시간을 대폭 줄여준다.
  • 테스트 용이성을 아키텍처 평가 기준으로 활용하는 사례도 많다.
  • 기능 뿐 아니라 테스트 코드도 지속해서 보강한다.
  • 새 기능을 추가할 때마다 테스트 추가는 물론 기존 테스트도 다시본다.
  • 버그 리포트를 받으면 가장 먼저 그 버그를 드러내는 단위 테스트부터 작성하자.
  • 테스트 커버리지와 코드 품질은 어떤 관련이 있을까? 커버리지는 코드에서 테스트하지 않은 영역을 찾는 데만 도움될 뿐, 테스트 코드의 품질과는 크게 상관이 없다.
  • 테스트가 충분한지는 주관적이다. 가령 ‘누군가 결함을 심으면 테스트가 발견할 수 있다는 믿음'을 기준으로 할 수 있다. 객관적이지않다. 하지만 테스트 코드의 목적은 주관적이지만 이 믿음을 갖게해주는 것.
  • 모든 테스트 통과를 보고 버그가 없다고 믿을 수 있다면 좋은 테스트이다.
  • 이렇게 해보고, 제품 코드보다 테스트 코드를 수정하는 데 시간이 더 걸린다면, 그리고 테스트 때문에 개발 속도가 느려진다고 생각되면 테스트를 과하게 작성한건 아닌지 의심해보자.
  • 하지만 테스트는 너무 많은 경우보다는 너무 적은 경우가 훨씬 훨씬 많다.

개발자의 행복과 리팩터링

패스트 캠퍼스 리팩터링 완독반의 리팩터링과 개발자의 행복 강의(디필드 임도형님)의 내용을 참고해서 작성하였습니다.

SW의 생산성이 좋아야 회사의 이익이다.

회사의 이익은 매출을 늘리거나 비용을 줄이거나인데, SW의 생산성 향상은 비용을 줄이는 쪽으로 이익을 준다.

코딩은 크게 버그 픽스 아니면 신규 기능 추가이다.

이 둘은 죄다 기존 코드를 기반으로 이루어지는데, 코드 파악이 어려우면 작업하기 힘들다. 그래서 기존 코드가 깔끔해야 생산성이 좋다. 리팩토링은 깔끔한 코드를 만들고 생산성을 향상시켜 회사의 비용을 줄이는 쪽으로 이익을 준다.

리팩터링의 목적은 생산성 향상!

개발자를 행복하게 해주는 요인으로는 아래가 있다.

  • 훌륭한 동료 / 높은 연봉 / 역량 향상 / 역량 발휘 / 지속적인 작업 / 보람된 작업 / 동기부여 / 자기 개발 / 여유 에너지

개발자를 행복하게 해주는 요인이 충족되기 위해서는 아래가 뒷받침 되어야한다.

  • 적절한 일정 / 의욕적인 업무 / 적은 버그

이것들을 방해하는 요인으로는

  • 코드 파악의 어려움 / 더딘 업무 진행 / 스파게티 코드

가 있으며 이것은 정리되지 못한 코드에서 나온다.

정리하면 리팩토링으로 코드를 정리하면 코드 파악이 쉬워지고, 스파게티 코드가 없어져 업무진행이 빨라진다. 그럼 적절히 일정을 지킬 수 있고, 버그가 적어지며 여유와 함께 의욕적으로 업무하게 된다. 이때 개발자는 개발자를 행복하게 해주는 요인(훌륭한 동료 / 높은 연봉 / 역량 향상 / 역량 발휘 / 지속적인 작업 / 보람된 작업 / 동기부여 / 자기 개발 / 여유 에너지)을 챙길 수 있다.

테스트 케이스는 어떤 역할을 할까?

  • 테스트 케이스는 리팩터링의 전제이다.
  • 테스트 케이스는 삽질 예방의 전제이다.
  • 테스트 케이스는 회사 이익의 전제이다.
  • 테스트 케이스는 개발자 행복의 전제이다.

테스트 케이스 작성은 아래를 보장하는 유일한 방법, 테스트 케이스 말고 아래를 보장하는 방법은 없다.

  • 버그 픽스한 코드의 기존 동작을 보장
  • 기능 추가한 코드의 의도한 동작을 보장
  • 정리한 코드의 기존 동작을 보장

기간이 정해져있는 프로젝트 성 개발이 아닌 운영되는 프로덕트라면 점점 테스트는 하기 힘들어진다.

유튜브, 링크드인, 페이스북이라고 생각해보자. 테스트 코드 없이 개발할 수 있을까?

리팩터링은 개발자의 필수 역량이다. 할 줄 모르면 행복하기 힘들다. 개발업무의 하나이다. 리팩터링은 따로 티켓의 일정으로 잡지는 않는다. 일상이 되어야하는 역량이다.

감사합니다.

[참고] 리팩터링 2판 / 패스트 캠퍼스 리팩터링 완독반, 리팩터링과 개발자의 행복 강연(디필드 임도형님)

Walk with us!

기술이 세상을 더 아름답게 할 수 있다고 믿으신다면, 휴먼스케이프와 함께 소중한 뜻을 펼칠 수 있습니다.
함께 걸어가며 성장하실 분, 언제든지 연락해주세요 :)

휴먼스케이프 개발자 채용공고 보러가기

--

--