노트

테스트 냄새

Test Smells

설계#testing · 연결된 개념 8개

쉽게 말하면

테스트 냄새는 체온계가 잴 때마다 다른 숫자를 보이거나, 옷만 갈아입었는데 열이 난다고 하는 것 같은 신호예요. 테스트를 믿기 어려워졌다는 뜻이라 그 뒤의 더 깊은 문제를 찾아봐야 해요.

비유가 깨지는 곳 냄새는 테스트가 부족할 때만 나는 게 아니에요. 커버리지가 겹치는 테스트가 많으면 한 번 고칠 때 여럿이 함께 깨져 오히려 변경을 막으니, 겹침을 줄여 각 테스트가 한 부분만 맡게 해요.

테스트 코드나 테스트 습관에서 나는, 더 깊은 문제를 알리는 신호. 제라드 메스자로스의 xUnit 테스트 패턴 정리가 이름을 붙였다.

테스트에서 보이는 냄새

  • 깨지기 쉬운 테스트(Fragile Test): 동작은 그대로인데 구현을 조금 바꿨다고 실패한다. 구현 세부에 기대는 테스트다
  • 변덕스러운 테스트(Erratic Test): 같은 코드인데 통과했다 실패했다 한다. 공유 상태, 시간, 실행 순서가 흔한 원인이다
  • 알아보기 어려운 테스트(Obscure Test): 무엇을 검사하는지 한눈에 안 들어온다
  • 단언 룰렛(Assertion Roulette): 단언이 여럿이라 어느 것이 실패했는지 알기 어렵다
  • 조건부 테스트 로직(Conditional Test Logic): 테스트 안에 if가 있어 어떤 코드가 실제로 실행됐는지 모른다
  • 느린 테스트(Slow Tests), 테스트하기 어려운 코드(Hard-to-Test Code), 테스트 코드 중복(Test Code Duplication), 프로덕션 코드 속 테스트 로직(Test Logic in Production)

프로젝트에서 보이는 냄새

테스트 자체에 버그가 많음, 테스트 유지 비용이 큼, 프로덕션에서 버그가 너무 많이 나옴, 개발자가 테스트를 쓰지 않음.

처방 몇 가지

  • 필요 없는 픽스처를 걷어 최소 데이터만 남긴다
  • 테스트가 쓰는 자원(파일·DB 행) 이름을 고유하게 한다
  • 의존 대상을 테스트 대역(Test Double)으로 바꿔 의존을 끊는다(MSW로 API 모킹)
  • 테스트하기 어려운 로직은 따로 실행할 수 있는 컴포넌트로 뽑는다(함수 추출하기)

테스트가 많아서 생기는 문제

커버리지가 겹치는 테스트가 많으면 한 번 고칠 때 여러 테스트가 함께 깨져 오히려 변경을 막는다. 각 테스트가 잘 격리된 부분을 맡도록 겹침을 줄이면 적은 테스트로도 신뢰를 지킬 수 있다(구성요소 줄이기). 프로덕션 코드의 냄새는 코드 냄새에 있다.

출처: Test Smells — xUnit Test Patterns 제라드 메스자로스 · 인프런 『심플 디자인』 박영록

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 테스트 주도 개발 (TDD)

    코드를 쓰기 전에 실패하는 자동화된 테스트부터 쓰고, 그 테스트를 통과시킨 뒤 중복을 없애는 짧은 주기를 반복하는 개발 방식. 켄트 벡이 정리했다.

  • 최소 재현

    버그가 여전히 일어나는 가장 작은 코드와 조건을 만드는 것. 원인을 좁히고, 테스트로 고정하고, 남에게 묻기 쉬워진다.

  • 언어적 안티패턴

    이름, 타입, 주석이 말하는 것과 코드가 실제로 하는 일이 어긋나는 것. 읽는 사람을 잘못된 추측으로 이끈다.

  • 소프트웨어 공학의 법칙들

    소프트웨어 시스템과 팀, 의사결정에 반복해서 나타나는 경험칙들을 모아 부르는 말. 법칙이라고 부르지만 대부분 증명된 정리가 아니라 관찰과 격언이다. 판단할 때 떠올릴 이름표로 쓴다. 따로 노트를 둔 것은 링크로, 나머지는 한 줄로 적었다.

  • 심플 디자인

    켄트 벡이 XP(Extreme Programming)에서 제시한 단순한 설계의 네 가지 규칙. 우선순위 순으로 ① 모든 테스트를 통과하고 ② 의도를 드러내고 ③ 중복이 없고 ④ 요소가 가장 적다. 마틴 파울러가 이렇게 정리한 형태가 널리 쓰인다.

보기 옵션