
기본/개요: 테스트 코드는 왜 필요한가
파이썬은 표준 라이브러리에 unittest 모듈을 기본 내장하고 있어 별도 설치 없이 테스트를 작성할 수 있다. 반면 pytest는 서드파티 패키지로, pip install pytest로 설치해야 하지만 더 간결한 문법과 강력한 부가 기능(픽스처, 파라미터라이즈 테스트, 플러그인 생태계)으로 실무에서 널리 쓰인다. 두 프레임워크 모두 "코드가 의도한 대로 동작하는지"를 자동으로, 반복적으로 검증한다는 목적은 같다.
내 생각으로는, 테스트 코드의 진짜 가치는 "버그를 잡는 것" 자체보다 "리팩터링을 두려워하지 않게 해주는 것"에 있다고 본다. 테스트가 없는 코드는 수정할 때마다 회귀(regression)를 걱정해야 하지만, 테스트가 갖춰진 코드는 변경 후 테스트만 돌려보면 안전 여부를 즉시 확인할 수 있다.
기능/스펙: unittest와 pytest의 핵심 차이
unittest
unittest.TestCase를 상속받아 클래스 기반으로 테스트를 작성한다.assertEqual,assertTrue,assertRaises등 다양한 assert 메서드를 제공한다.setUp/tearDown메서드로 테스트 전후 준비/정리 작업을 정의한다.- 커맨드라인에서
python -m unittest명령으로 실행 가능하다.
pytest
- 클래스 없이 함수 기반으로
assert문 하나만으로 테스트를 작성할 수 있어 코드가 짧아진다. fixture데코레이터로 테스트 간 공유 자원(DB 연결, 임시 파일 등)을 관리한다.@pytest.mark.parametrize로 동일한 테스트 로직에 여러 입력값을 손쉽게 대입할 수 있다.- unittest로 작성된 기존 테스트도 대부분 그대로 인식하고 실행할 수 있어 마이그레이션 부담이 적다.
pytest-cov,pytest-mock등 풍부한 플러그인 생태계가 있다.
장단점
unittest 장점: 표준 라이브러리라 추가 설치가 필요 없고, Java의 JUnit과 유사한 구조라 다른 언어 경험자에게 친숙하다. 단점: 클래스와 self, assert 메서드 이름을 매번 기억해야 해서 문법이 다소 장황(verbose)하다.
pytest 장점: 일반 assert 문을 그대로 쓰면서도 실패 시 상세한 diff를 자동으로 보여주고, 픽스처와 파라미터라이즈 기능 덕분에 테스트 코드 중복이 크게 줄어든다. 단점: 서드파티 의존성이 추가되고, 픽스처의 스코프(function, module, session 등) 개념을 이해하지 못하면 예상치 못한 상태 공유 버그가 생길 수 있다.
개인적인 비판을 덧붙이면, pytest의 "마법 같은" 자동 발견(discovery) 방식은 편리하지만 대규모 프로젝트에서는 어떤 픽스처가 어디서 주입되는지 추적하기 어려워지는 부작용이 있다. 이 점에서 pytest를 쓰더라도 conftest.py 구조와 픽스처 스코프에 대한 팀 내 컨벤션을 별도로 문서화하는 것이 필요하다고 생각한다.
추천 대상
- 처음 테스트를 배우는 입문자에게는 unittest로 assert의 기본 개념(기대값 vs 실제값 비교)을 익히고, 이후 pytest로 넘어가는 순서를 추천한다.
- 이미 실무에서 협업 중이거나 CI/CD 파이프라인을 구축해야 하는 경우에는 픽스처와 플러그인 생태계가 풍부한 pytest가 더 적합하다.
- 레거시 코드베이스에 unittest 테스트가 이미 쌓여 있다면, 전면 재작성보다는 pytest 러너로 unittest 테스트를 그대로 실행하며 점진적으로 전환하는 방식을 권한다.
FAQ
Q. pytest에서 unittest 테스트를 그대로 실행할 수 있나요?
A. 가능하다. pytest는 unittest 스타일의 TestCase 클래스도 인식하고 실행할 수 있도록 설계되어 있다.
Q. 테스트 커버리지는 몇 %가 적정한가요?
A. 프로젝트 성격, 팀의 리스크 허용도에 따라 달라지는 문제라 일률적인 숫자를 제시하기는 어렵다. "이것은 확인할 수 없습니다"에 해당하며, 흔히 회자되는 80~90%라는 수치도 맥락에 따라 의미가 다르다는 점을 감안해야 한다.
Q. Mock은 언제 사용하나요?
A. 외부 API 호출, DB 접근, 파일 시스템 등 테스트를 느리거나 불안정하게 만드는 외부 의존성을 격리하고 싶을 때 사용한다. unittest.mock 모듈이나 pytest-mock 플러그인을 활용할 수 있다.
출처
- Python 공식 문서, unittest 모듈, https://docs.python.org/ko/3/library/unittest.html
- pytest 공식 문서, https://docs.pytest.org