이 레슨과 관련된 학습 키워드
컴퓨터 과학 & 프로그래밍 — 문제 해결의 도구 → Python 프로그래밍 — 첫 코드에서 실전까지 → Python 프로그래밍 — 첫 코드에서 실전까지 → 실전
pytest, fixture, mock, parametrize, coverage, TDD, pdb, breakpoint, 로깅, 타입 힌트, mypy, ruff, CI 자동화
오늘은 테스트와 디버깅을 왜 배워야 하는지 살펴보겠습니다.
실제 참사 사례 세 가지로 이야기를 시작해 볼게요.
1999년 나사 화성 탐사선은 단위 변환 버그 하나로 소멸됐습니다.
2012년 나이트 캐피털은 배포 오류로 45분 만에 4억 달러를 잃었습니다.
2014년 하트블리드는 경계 검사 코드 단 한 줄이 빠진 버그였습니다.
그 한 줄 때문에 전 세계 서버 30퍼센트의 개인키가 유출됐습니다.
세 사례의 공통점, 자동화된 테스트로 배포 전에 잡을 수 있던 버그들입니다.
그림 왼쪽을 보세요.
버그 수정 비용은 발견 시점에 따라 1배에서 100배 이상으로 급증합니다.
요구사항 단계에서 잡으면 1배, 프로덕션 단계에서는 100배가 넘습니다.
테스트를 개발 초기로 당기는 쉬프트 레프트 테스팅이 중요한 이유입니다.
그림 오른쪽을 보시면 테스트 피라미드가 나옵니다.
맨 아래 단위 테스트가 전체의 약 80퍼센트를 차지합니다.
빠르고 저렴해서 많이 작성하는 것이 핵심입니다.
위로 올라갈수록 통합, 엔드투엔드 테스트로 느리고 비싸집니다.
가운데 VS 비교를 보세요.
테스트가 없으면 리팩토링이 두렵고, 임시 땜질 코드가 쌓입니다.
기술 부채가 누적돼 결국 건드리면 터지는 코드가 됩니다.
반대로 자동 테스트가 있으면 깨지는 순간 즉시 알림이 옵니다.
안심하고 변경할 수 있어 코드 품질이 지속적으로 좋아집니다.
하단을 보시면 엠엘 코드만의 특별한 위험이 나옵니다.
일반 소프트웨어 버그는 크래시가 나서 바로 발견됩니다.
하지만 엠엘 버그는 모델이 학습되면서 성능만 조용히 하락합니다.
이 침묵하는 버그를 잡는 수단이 바로 테스트입니다.
마지막으로 하단 도구 스택 네 가지를 확인해 봅시다.
pytest는 테스트 실행 프레임워크, 함수 하나로 자동 발견·실행합니다.
mypy는 정적 타입 검사로, 실행 전에 타입 버그를 사전 차단합니다.
ruff는 Rust 기반 초고속 린터로, flake8보다 100배 빠릅니다.
CI는 커밋마다 자동으로 테스트를 실행하는 배포 품질 게이트입니다.
마이클 피더스의 말처럼, 테스트 없는 코드는 레거시 코드입니다.
테스트는 비용이 아니라 보험, 이것이 오늘의 핵심 메시지입니다.
경제적 절감, 엠엘 특수성, 프로 개발자 표준, 이 세 가지를 기억하세요.