Upgrade to Pro — share decks privately, control downloads, hide ads and more …

단위 테스트 (4) - 좋은 단위 테스트의 4대 요소

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.

단위 테스트 (4) - 좋은 단위 테스트의 4대 요소

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

Avatar for Seongeun Yu

Seongeun Yu

August 20, 2024

More Decks by Seongeun Yu

Other Decks in Programming

Transcript

  1. 1. 좋은 단위 테스트의 관점 간 차이점 모색 2. 이상적인

    테스트 정의 3. 테스트 피라미드 이해 4. 블랙박스 테스트 및 화이트박스 테스트 사용 이번 세미나의 주제
  2. 들어가며 1부의 내용을 복습합시다. • 좋은 테스트 스위트(test suite)의 특성을

    살펴보았습니다 – 개발 주기에 통합되어 있음 → 실제로 쓰는 테스트 – 코드베이스의 가장 중요한 부분을 테스트함 → 애플리케이션의 핵심만을 테스트 (자세한 내용은 7장에서) – 최소한의 유지비로 최대 가치를 확보 (가치 있는 테스트를 잘 짜는 방법)
  3. 들어가며 이번 절에서 다룰 내용 • 주로…. – 가치 있는

    테스트를 식별하는 방안 – 테스트 스위트를 분석할 수 있는 기존 소개 – 테스트 피라미드 소개 – 블랙박스, 화이트박스 테스트 소개
  4. 4.1 좋은 단위 테스트의 4대 요소 • 좋은 단위 테스트의

    4가지 특성 – 회귀 방지(Protection against regressions) – 리팩터링 내성(Resistance to refactoring) – 빠른 피드백(Fast feedback) – 유지보수성(Maintainability)
  5. 4.1 단위 테스트를 구성하는 방법 • 회귀 방지 – 회귀(regression):

    코드를 수정한 후 기능이 의도한 대로 작동하지 않는 경우 – 코드베이스가 커지면 버그에 노출되기 쉽다 → 회귀 방지가 필요 – 이를 테스트 코드로 보호해야 함 • 회귀방지의 지표 – 테스트 중 실행되는 코드의 양 – 코드 복잡도 – 코드의 도메인 유의성(비즈니스의 주요기능을 잘 보호하는지)
  6. 4.1 단위 테스트를 구성하는 방법 • 리팩터링 내성 – 테스트가

    "빨간색"으로 바뀌지 않고 기존 코드베이스를 리팩터링 할 수 있는지에 대한 척도 • 리팩터링? – 식별할 수 있는 동작을 수정하지 않고 기존 코드를 변경하는 것 – 가독성 향상 – 복잡도 낮추기
  7. 4.1 단위 테스트를 구성하는 방법 • 리팩터링 내성 (cont’d) –

    리팩터링을 하고 난 후 테스트 빨간색이 되는 경우 – 그렇지만 리팩터링 후 기능은 정상적으로 도는 경우 – 이는 거짓 양성(false positive) – 오탐 – 의 원인이 되며, 테스트의 이점을 모조리 방해함 • 테스트의 이점 – 기존 코드가 고장 났을 때 조기경고 – 코드 변경이 회귀로 이어지지 않음 → 코드 개선을 테스트코드와 함께 함 – 하지만, 거짓 양성은?
  8. 4.1 단위 테스트를 구성하는 방법 • 거짓양성(오탐)은? – 테스트가 이유

    없이 실패 → 테스트를 포기, 운영에 버그가 발생할 수 있음 – 거짓양성이 빈번하면? → 테스트 스위트 포기, 리팩터링 감소, 구조 개선이 어려워짐 • 거짓양성의 원인? – 테스트와 테스트 대상 시스템(SUT)의 구현 세부사항이 많이 결합되면 많이 발생 – 테스트는 과정이 아닌 결과만을 검증해야 함(5장에서 이어집니다)
  9. 4.1 단위 테스트를 구성하는 방법 • 거짓양성의 최대 단점 –

    회귀가 발생해도 경고를 제공하지 못한다 (∵ 테스트가 잘못되었기 때문) – 리팩터링을 할 의지가 꺾임 (∵ 테스트 케이스가 갈피를 못 잡음)
  10. 4.1 단위 테스트를 구성하는 방법 • 구현 세부사항 대신 최종

    결과를 목표로 – 최종 결과가 무엇인지 파악하고 결과만을 검증 – 이러한 테스트는 리팩터링 내성이 생김 → 오탐률 감소 – 거짓양성이 거의 없을 것임 (없는 것 보다 훨씬 나음)
  11. 4.2 첫 번째 특성과 두 번째 특성 간의 본질적인 관계

    • 좋은 단위 테스트의 두 요소의 관계를 살펴봅시다 – 회귀 방지: 프로젝트 초반부에 특히 필요 – 리팩터링 내성: 프로젝트가 가면 갈 수록 중요성 증대
  12. 4.2 첫 번째 특성과 두 번째 특성 간의 본질적인 관계

    • 테스트 정확도 극대화 – 코드 정확도와 테스트 결과에 대한 4가지 결과 – 테스트는 통과/실패할 수 있다 – 테스트가 정상/고장 상태일 수 있다
  13. 4.2 첫 번째 특성과 두 번째 특성 간의 본질적인 관계

    • 테스트 결과에 대해 – 미탐(False negative) – 테스트는 정상이라는데 실제로는 비정상인 경우 – 회귀 방지가 훌륭한 테스트가 이를 방지할 수 있다
  14. 4.2 첫 번째 특성과 두 번째 특성 간의 본질적인 관계

    • 테스트 결과에 대해 – 오탐(False positive) – 테스트는 틀렸다 하지만 실제로는 정상인 경우 – 리팩터링 내성이 훌륭한 테스트가 이를 방지할 수 있다 – 가장 경계해야 하는 테스트 케이스!
  15. 4.2 첫 번째 특성과 두 번째 특성 간의 본질적인 관계

    • 테스트의 정확도 지표 – 테스트가 버그 있음을 얼마나 잘 나타내는가 (미탐률 줄이기) – 테스트가 버그 없음을 얼마나 잘 나타내는가 (오탐률 줄이기)
  16. 4.2 첫 번째 특성과 두 번째 특성 간의 본질적인 관계

    • 오탐, 미탐의 중요성: 역학관계 – 단기적으로는 잘못된 결과가 인입되어도 상관없지만 – 시간이 지날 수록 코드베이스를 리팩터링하고 다듬어야 함 – 그 때마다 테스트가 거짓말을 하면 리팩터링의 원동력을 잃는다!
  17. 4.3 세 번째 요소와 네 번째 요소: 빠른 피드백과 유지보수성

    • 빠른 피드백 – 빠르게 실행되는 테스트는 버그를 잡는 피드백 루프를 줄일 수 있다 – 오래 걸리면 자주 실행하지 못하므로 시간낭비가 생긴다 • 유지보수성 – 테스트의 유지비를 의미 – 테스트가 이해하기 어려운가? (테스트코드의 코드 품질도 중요!) – 테스트가 얼마나 실행하기 어려운가? (테스트의 외부 종속성 의존을 최소화해야)
  18. 4.4 이상적인 테스트를 찾아서 • 좋은 단위 테스트의 4대 특성

    – 회귀 방지 – 리팩터링 내성 – 빠른 피드백 – 유지보수성 • 테스트의 가치측정 – 0점부터 1점 사이의 값 – 네 가지 요소를 곱하여 판단 – 무엇 하나라도 0이 되면 전체가 0이 된다 • 그렇다면 이상적인 테스트는? → 불가능
  19. 4.4 이상적인 테스트를 찾아서 • 아래 특성들은 상호 배타적 –

    회귀 방지 – 리팩터링 내성 – 빠른 피드백 • 극단적 사례 (1) – 엔드 투 엔드 테스트 – 거짓양성에 면역 – 리팩터링 내성에도 우수 – 느리다!
  20. 4.4 이상적인 테스트를 찾아서 • 아래 특성들은 상호 배타적 –

    회귀 방지 – 리팩터링 내성 – 빠른 피드백 • 극단적 사례 (2) – 간단한 테스트 – 빠르고 – 피드백이 좋다 – 회귀를 나타내지 않는다 – 항상 통과하거나 검증이 무의미 → 무쓸모
  21. 4.4 이상적인 테스트를 찾아서 • 아래 특성들은 상호 배타적 –

    회귀 방지 – 리팩터링 내성 – 빠른 피드백 • 극단적 사례 (3) – 깨지기 쉬운 테스트 – 실행이 빠르고 – 회귀를 잘 잡는다 – 오탐(거짓 양성)이 많다 – 리팩터링을 못 버팀
  22. 4.4 이상적인 테스트를 찾아서 • 무엇을 포기해야 하나? – 전략적으로

    희생해야 한다 – 하지만 리팩터링 내성은 포기할 수 없다 • 리팩터링 내성을 챙겨야 하는 이유 – 리팩터링 내성은 있거나 없거나 – 회귀 방지, 빠른 피드백은 조율 가능 • 어느 쪽을 더 중요시할 것인지 조율 가능 • 4.5에서 설명
  23. 4.5 대중적인 테스트 자동화 개념 살펴보기 • 테스트 피라미드? –

    테스트 스위트에서 아래 테스트 유형간 일정 비율을 일컫는 개념 – 단위 테스트 – 통합 테스트 – 엔드 투 엔드 테스트 • 테스트 피라미드 (cont’d) – 꼭대기로 가면 갈 수록 유저를 흉내 냄 – 상단 테스트는 회귀 방지에 유리 – 하단 테스트는 실행속도를 강조
  24. 4.5 대중적인 테스트 자동화 개념 살펴보기 • 테스트 피라미드? –

    테스트 스위트에서 아래 테스트 유형간 일정 비율을 일컫는 개념 – 단위 테스트 – 통합 테스트 – 엔드 투 엔드 테스트 • 테스트 피라미드 (cont’d) – 꼭대기로 가면 갈 수록 유저를 흉내 냄 – 상단 테스트는 회귀 방지에 유리 – 하단 테스트는 실행속도를 강조 – 어느 쪽도 리팩터링 내성을 포기하지 않음
  25. 4.5 대중적인 테스트 자동화 개념 살펴보기 • 아래 두 가지

    방식을 언제 사용하는지 살펴봅시다 • 블랙박스 테스트 – 시스템 내부구조를 모르고도 시스템 검사 가능 – 무엇을 해야 하는지 중심으로 구축 – 회귀 방지에 다소 취약함 – 테스트 작성에 바람직함 • 화이트박스 테스트 – 애플리케이션 내부 작업을 검증 – 테스트가 소스코드에서 파생됨 – SUT의 구현과 결합되어 있음 (7장에서 다시 봅시다) – 테스트 분석에 바람직함
  26. Q&A