Be-Developer

UnitTesting 04 좋은 단위 테스트의 4대 요소

04 좋은 단위 테스트의 4대 요소

1. 버그(회귀) 방지

  • 비즈니스 로직 테스트가 중요하다.
  • 버그 방지 지표를 극대화하려면 가능한 많은 코드를 실행하는 것을 목표로 해야한다.

    2. 리팩터링 내성

  • false positive , 리팩터링 후 실제 로직은 정상 작동하지만 테스트만 실패하는 경우.
  • false positive 가 많으면 테스트 신뢰도가 떨어지고 리팩터링 의지가 줄어들수있고, 중요한 로직 검증은 빠져있을 수 있다.
  • 테스트와 SUT의 구현 세부사항이 많이 결합될수록 허위경보가 많이 생긴다.
    • ex) 테스트 내 getter 검증 등
  • 테스트는 SUT가 제공하는 최종 결과를 검증하는지 확인해야한다.

    버그방지 + 리팩터링 내성 의 본질적인 관계

    |테스트결과|기능 작동|기능 고장| |—|—|—| |통과|O|거짓 음성| |실패|거짓 양성|O|

  • 버그 방지와 리팩터링 내성은 테스트 스위트의 정확도를 극대화하는것을 목표로 한다.
  • $테스트 정확도 = 신호(발견된 버그수)/소음(허위 경보 발생수)$

    거짓 양성과 음성의 중요성.

  • 초반엔 거짓양성은 그리중요하지 않다. (리팩터링 내성)
  • 중대형 프로젝트에서는 둘다 신경써야한다.

    3. 빠른 피드백

  • 테스트를 자주 실행할수있어서 버그발견이 빠르다.

    4. 유지 보수성

  • 유지비 평가 요소
    • 테스트가 얼마나 이해하기 어려운가
    • 테스트가 얼마나 실행하기 어려운가

      이상적인 테스트

  • 소수의 매우 가치있는 테스트는 다수의 평범한 테스트보다 프로젝트가 계속 성장하는데 훨씬더 효과적이다.

    극단적인사례 : E2E test

  • 버그방지에는 탁월.
  • 리팩터링 내성에도 좋음.
  • 속도가 느리다.
  • 유지비용이 비교적 크다

    극단적인 사례 : 간단한 테스트

  • 속도가 빠르다
  • 리팩터링 내성도 우수하다.
  • 버그 방지에 효과적이지 않다.

    극단적인 사례 : 깨지기 쉬운 테스트

  • 버그 방지 좋음
  • 리팩터링 내성이 낮음.

    결론

  • 각 특성의 부족함을 조금씩 인정하는것이 최선의 전략일 수 있다.
  • 유지보수성은 가능한 최대화 시키는걸로하고
  • 그중 리팩터링 내성을 우선으로 여기자. 장기적으로 볼때 중요.
  • 그럼 남은 버그방지와 빠른 피드백중 한가지를 선택해야겠다.

    대중적인 테스트 자동화 개념 살펴보기

    테스트 피라미드 분해

    image

  • 피라미드의 테스트는 빠른 피드백과 버그방지 사이에서 선택된다.

    blackbox, whitebox

  • black box : 시스템 내부 구조를 몰라도 기능 검증. 어떻게가 아니라 무엇을에 집중
  • white box : 내부 작업 검증. 테스트는 요구사항이나 명세가아닌 코드에서 파생된다. |test|버그 방지|리팩터링 내성| |—|—|—| |whitebox|O|X| |blackbox|X|O|
  • blackbox를 기본으로 선택하자.
  • whitebox는 유틸리티 코드를 다룰때 적절하다.

BDD에서 then 으로 동작확인을 하는것은, 결과검증이 아니므로 꼭 필요한 검증일까? (void?)메서드의 동작 결과가 메서드 호출인것일수도 있겠다.