유지보수성

이승한·2020년 1월 15일
0
  • 인지부하를 가중시키는 테스트 냄새
  • 유지보수 악몽에 시달리게 하는 테스트 냄새
  • 불규칙한 실패를 초래하는 테스트 냄새

중복

악의 근원 : 어설픈 최적화, 중복
중복이 나쁜 이유 : 개념과 논리를 곳곳에 흩어놓아 코드를 이해하기 어렵고 불투명하게 만든다. 더욱이 코드를 수정하려면 중복된 곳을 모두 찾아 일일이 손봐줘야 한다.

  • 상수 중복 : 지역 변수로 만들어 제거 가능

  • 구조 중복 : 데이터만 다를 뿐 처리 로직이 똑같은 상황

  • 의미 중복 : 같은 기능이나 개념을 다른 방식으로 구현한 것

  • 과유불급이 될수도 있다. 최우선 목표는 읽기 쉽게 유지하며 읽는 이에게 그 의도와 기능을 명확히 전달하는 것. 그래서 일부러 중복을 남겨두는 상황도 있다.

조건부 로직

  • 조건부 로직을 포함한 테스트는 제역할을 못ㅎ랄 가능성이 높다.
  • 간소화 한다.
  • 테스트 메서드는 if, else, for, while, switch 같은 조건부 실행 구조를 가져서는 안된다. 테스트 대상이 복잡할 수록 더 중요하다.

양치기 테스트

  • 매번 실패하는데도 대수롭지 않게 취급되는 테스트
  • 매번 실패하는 테스트는 있으나 마나다. 새로운 사실이나 신뢰할 어떠한 정보도 알려주지 못한다.
  • 이따금 실패하는 테스트 개선 방법
    • 시스템 시계, 테스트를 돌리는 시각, 공유 자원에 동시 접근, 난수 발생기
    • 회피, 제어, 격리

파손된 파일 경로

  • 개발자 컴퓨터 외에는 그 어디서도 돌아가지 못하게 한다.
  • 하드코딩된 파일 경로
  • 개선 방법 : 테스트 코드에서 파일을 다룰 때 절대 경로는 무조건 피해야 한다.
  • 파일을 Stream 으로 바꾸면 테스트 더블로 교체할 수 있다.
  • 프로젝트에 필요한 모든 자원은 프로젝트 루트 디렉토리 하위에 두어야 한다.

끈질긴 임시 파일

  • 파일이 임시적이지 않고 끈덕진 파일 -> 다음번 테스트 수행시 까지도 지워지지 않는 것
  • 파일 사용은 최소한으로 해야 한다.
    • 느리다.
    • 명시적으로 지우지 않으면 스스로 사라지지 않아 유령파일이 된다.
  • 임시 파일으 대하는 지침
    • @Before 에서 미리 삭제하라.
    • 파일명을 고유하게 만들어라
    • 파일이 있어야 하는지 명시하라.
  • 테스트 목적상 반드시 필요하지 않으면 절대로 파일을 사용하지 않는다.

잠자는 달팽이

  • 결과나 부수효과를 얻기 위해 다른 스레드가 일을 끝마치기를 기다리는 코드.
  • 테스트 스레드는 작업 스레드가 일을 마치는 즉시 알수 있어야 한다.
    • java cuncurrent package 를 이용하여 개선하자.

픽셀 퍼펙션

  • 기본타입 단언, 매직넘버 의 특수한 경우.
  • 완벽하게 일치하는 이미지가 만들어 졌는지 확인해야 하거나, 생성된 이미지의 특정 픽셀의 색을 확인 하여 조금만 변화를 주어도 쉽게 실패한다.
    • 좌표와 색상을 수동으로 입력한다.
  • 값-대-값 을 단순 비교하기 보다는 실제 알고리즘을 포괄적 대조한다.

파라미터화된 혼란

  • 파라미터화된 테스트는 멋진 패턴이지만 과하거나 올바르지 않게 사용되면 곤란한다. 이해하기 어렵고 실패한 테스트를 정확히 끄집어 내기도 어렵다.
  • 대안
    • 데이터 집합을 메서드 호출로 감싸보자.
    • 들여쓰기를 활용하여 데이터 집합을 구분해 보자.
    • 테스트가 사용한 값을 assert 메세지에 포함시키면 원인 파악이 쉽다.

메서드 간 응집력 결핍

  • 응집력은 잘 작성된 객체지향 코드의 핵심 특징이다.
  • 한 클래스의 모든 테스트가 같은 픽스쳐를 이용해야 한다.
  • 픽스쳐가 필요 이상으로 복잡해 질수록 코드 흐름을 파악하기 어려워 진다.
  • 보통 나쁜 이름이나 다중인격 테스트일 수 있다.
  • 개선 방법
    • 같은 픽스쳐를 사용하도록 리팩토링
    • 픽스쳐 이름을 개선하고 줄여본다.
    • 적절한 경계를 찾아 클래스를 분리하자.
profile
software develop engineer

0개의 댓글