"코드가 제대로 동작하는지 어떻게 확인하세요?" 유닛 테스트는 개발자의 무기입니다.
개발하면서 이런 경험 있지 않나요? 분명 어제까지 잘 되던 코드가 오늘 갑자기
오류를 내기 시작합니다. 함수 몇 개 바꾼 것뿐인데, 어디서 꼬였는지 알 수가
없죠. 이럴 때마다 로그 뒤지고 프린트 찍고 디버깅 돌리고… 시간은 시간대로 쓰고,
멘탈은 탈탈 털리고요.
사실 이런 불안감, 단 하나의 기술로 해결할 수 있습니다. 바로 "UnitTest". 특히
파이썬의 unittest
모듈은 내장되어 있어 추가 설치 없이 바로 쓸 수
있고요. 자동으로 코드의 안정성을 검증해주는 이 멋진 도구를 아직 안 쓰고
있다면, 진짜 손해 보는 거예요.
이번 글에서는 파이썬에서 유닛 테스트를 어떻게 작성하고 실행하는지, 실무에서는
어떤 패턴으로 쓰이는지, 그리고 TDD처럼 테스트 중심 개발을 실현하는 방법까지
전부 다뤄볼게요. 이제는 코드를 믿지 말고, 테스트로 검증하세요.
왜 UnitTest가 필요한가?
"테스트는 나중에 하지 뭐"라고 생각하다가, 그 '나중'이 진짜 폭탄으로 돌아오는 경우 많죠. 특히 팀 프로젝트에서는 버그 하나가 다른 기능을 깨뜨릴 수 있어서, 테스트 없이는 신뢰할 수 없는 코드가 됩니다. UnitTest는 개별 함수나 클래스 단위로 정확히 원하는 대로 동작하는지를 자동으로 확인해 주기 때문에, 코드의 신뢰도를 높이고 유지보수 비용을 줄이는 데 핵심적인 역할을 합니다.
UnitTest 기본 구조 살펴보기
파이썬의 unittest
는 Java의 JUnit, C#의 NUnit과 매우 유사한 구조를
가지고 있어요. 테스트 클래스는 unittest.TestCase
를 상속하고,
테스트 함수는 test_
로 시작해야 자동으로 인식됩니다.
구성 요소 | 역할 |
---|---|
setUp() | 각 테스트 전마다 실행되는 초기화 코드 |
test_* | 각각의 테스트 함수. 반드시 접두어 필요 |
tearDown() | 테스트 후 정리용 코드 실행 |
자주 쓰는 assert 메서드
unittest
에는 다양한 assert 메서드가 내장되어 있어서 비교, 예외,
포함 여부 등을 검증할 수 있어요. 테스트에서 실패한 부분은 정확히 어떤 조건이
어긋났는지 메시지로 알려주기 때문에 디버깅도 쉬워집니다.
- assertEqual(a, b) – 두 값이 같은지
- assertTrue(x) – x가 참인지
- assertRaises(Error, func) – 특정 예외가 발생하는지
테스트 케이스 패턴과 구조화
무작정 테스트 함수를 늘리다 보면, 금세 테스트 코드도 유지보수가 어려워집니다. 이럴 땐 테스트 패턴을 적용해보세요. 예: AAA 패턴(Arrange, Act, Assert)은 테스트 흐름을 구조화하는 데 효과적이에요.
단계 | 의미 |
---|---|
Arrange | 테스트에 필요한 데이터와 객체 준비 |
Act | 테스트 대상 메서드 실행 |
Assert | 예상한 결과와 실제 결과 비교 |
Mocking으로 외부 의존성 차단하기
유닛 테스트는 "하나의 기능만" 검증해야 합니다. 그런데 DB, API, 파일 시스템
같은 외부 요소가 테스트 결과에 영향을 주면 곤란하죠. 이럴 때는
unittest.mock
모듈로 외부 의존성을
Mock 객체로
대체하세요. 예측 가능하고 안정적인 테스트 환경을 만들 수 있어요.
- patch()로 특정 함수나 클래스 임시 대체
- MagicMock() 객체로 원하는 동작 설정
TDD 실전: 테스트 주도 개발 흐름
TDD(Test-Driven Development)는 '테스트부터 먼저 작성하고 코드를 나중에 구현'하는 개발 방식입니다. 이 접근 방식은 코드 품질 향상, 유지보수 용이성, 리팩토링의 자유로움을 제공합니다.
- 실패하는 테스트 먼저 작성
- 테스트를 통과하는 최소한의 코드 구현
- 테스트가 통과되면 코드 리팩토링
가장 이상적인 시점은 기능 구현 전에 테스트를 먼저 작성하는 TDD 방식입니다.
unittest는 기본 모듈, pytest는 더 많은 기능과 간결한 문법을 제공하는 서드파티 프레임워크입니다.
실패 메시지를 분석하고 관련 로직을 점검하세요. 테스트 자체의 오류일 수도 있습니다.
네, coverage
모듈을 사용하면 함수별로 테스트 범위를 시각화할
수 있습니다.
외부 시스템 호출뿐 아니라 시간 지연, 랜덤 값 등 예측 불가능한 요소도 모두 모킹 가능합니다.
물론입니다. 테스트도 소프트웨어의 일부이므로 Git 등으로 함께 관리해야 합니다.
코드를 짜는 것도 중요하지만, 그 코드가 제대로 동작하는지 확인하는 건 더
중요해요. 그리고 그걸 자동화해주는 게 바로 UnitTest입니다.
한 번 테스트를 작성해두면 그 뒤로는 마음이 정말 편해져요. "이 코드 바꿔도
되나?" 고민하지 말고, 테스트 돌려보면 되니까요. 특히 협업할 때는 팀 전체의
신뢰를 지켜주는 강력한 방패가 되죠.
아직 테스트 안 써봤다면, 이번 주말에 작은 프로젝트부터 시도해보세요. 시작은
어렵지 않아요. 그리고 결과는 생각보다 훨씬 멋질 거예요.