신뢰성

이승한·2020년 1월 20일
0
  • 코드 주석과 관련된 테스트 냄새
  • 미흡한 기대치 관리로 인한 테스트 냄새
  • 조건부 실행과 관련되 테스트 냄새

신뢰할 수 있는 코드를 만들기 위해서는 테스트 자체도 믿음직 해야 한다.

주석으로 변한 테스트

주석으로 변한 테스트는 한낱 잡음에 불과하다.

  • 개선 방법
    1. 이해해 보려 노력하고 검증한다.
    2. 이해 된다면 주석을 풀고 파악한 목적이 더 잘 표현되게끔 리팩토링 한다.
    3. 이해가 안된다면 미련 없이 지워 버린다.

실용성을 추구해야 한다. 주석 처리한 이유를 바로 알아내지 못했다면 앞으로도 영원히 알아내지 못할 가능성이 높다.

오해를 낳는 주석

거짓말을 늘어놓는 제멋대로인 녀석이다. 도움보다는 해만 끼치는 녀석이니 없애는 쪽이 백번 낫다. 코드의 의도를 전달할 책임은 사실 코드 자신에 있다. 주석없이는 동작을 이해하기 어려운 코드가 있다면 아직 코드를 충분히 리팩토링 하지 못했다는 뜻이다.

  • 개선 방법
    1. 주석대신 적절한 변수명이나 메서드명을 사용하라.
    2. 주석으로 설명하려던 코드 블록을 메서드로 추출하고 알맞은 이름을 지어줘라.
  • 좋은 주석의 조건
    • 무엇을이 아닌 왜를 설명하는 주석이 좋은 주석이다.
    • 무엇을 하는지 설명하는 주석은 무조건 코드 냄새라고 보면 된다.
    • 성능 최적화가 꼭 필요한 부분이라 어쩔 수 없이 가독성을 다소 희생한 경우라면 의미있는 올바른 주석이 될 수 있다.
    • 주석을 작성할 때마다 무엇 보다는 왜를 설명해야 한다.

주석은 대체로 나쁘다. 테스트 코드에서도 마찮가지다. 얼핏 도움 되는 듯 보이더라도 경계의 눈초리로 세심히 살펴야 한다.
오해를 낳는 주석의 탄생과정 : 주석을 처음 작성했을 때에는 대부분 의미있고 올바른 내용을 담고 있따. 하지만 시간이 흐르고 코드가 변해가면서 서서히 괴리가 생기고 점점 혼란스럽고 제멋대로인 주석으로 변해간다.
좋은 주석이란 코드가 그렇게 작성될 수밖에 없었던 당위성을 설명하는 주석이다.

절대 실패하지 않는 테스트

통과했으니 문제 없을 것이라는 잘못된 인식을 심어줄 수 있으니 없으니만 못하다.

  • 개선 방법
    • 예외가 기대하길 기대하는 테스트를 작성할 때는 예외가 발생하지 않았을 때 반드시 fail() 을 불러줘야 한다.

테스트가 실패해야할 상황에서는 반드시 실패해야 한다.

지키지 못할 약속

훨씬 적은 것을 검사하거나, 심지어는 아무것도 검사하지 않는게 본질적인 문제다.

  • 크게 세가지 경우에 생긴다.

    • 아무일도 안 하는 테스트 - 본문 전체가 주석 처리된 테스트, 주석으로 변한 테스트 보다 더 해악을 끼친다.
    • 무언가 일은 하지만 정작 검증은 전혀 하지 않는 테스트 - 행복한 길 테스트
    • 이름값 못하는 테스트
  • 개선방법

    • @Ignore annotation 을 달아놔라
    • 테스트 작성시 단언문 부터 작성한다.
    • 테스트 이름을 지워두거나 TODO 과 같은 임시명을 쓴다. 완성 하여 동작을 온전히 파악하면 더 적당한 이름이 잘 떠오른다.
    • 약속을 제대로 지키지 않는 테스트가 있을 때 프로그래머가 쉽게 알아챌 수 있도록 한다.

낮아진 기대치

쉬운 방법을 선택하는 것이 좋으나 정도가 지나칠 수 있다. 쉬운길을 찾다보니 검증 정확도와 정밀도 까지 낮아진것. 변화에 아주 둔감하여 실패할 상황에서도 실패하지 않는다.
테스트는 자신이 명시한 동작에 문제가 생기면 실패해야 한다.
하지만, 지나치게 구체적인 단언문은 자칫 픽셀 퍼펙션 문제를 일으킬 위험이 있다.

플랫폼 편견

  • 개선방법
    • assumeTrue 라는 가정 API 를 통해서 의도한 플랫폼이 아닌 경우 테스트를 중단하게 한다.
    • platform 을 각 테스트에 맞게 교체할 수 있도록 리팩토링하면 어느 플랫폼 에서건 모든 테스트가 수행되게 할 수 있다.

테스트가 하부 플랫폼에 따라 다른 경로를 타고 다른 단언문을 호출하고 있는 상황이다. 냄새의 근원까지 깨끗이 제거해줄 해법은 코드를 리팩토링하는 것 일 수 있다.

조건부 테스트

테스트의 조건 때문에 이름이 부여하는 것과 다르게 동작하는 현상이다.
발생한 문제를 걸러내는 단언문을 모든 분기마다 빠짐없이 넣어뒀는지 확인해야 한다.

profile
software develop engineer

0개의 댓글