Python 주니어 테스트·코드품질 기술면접
새 면접Q. Python에서 unittest와 pytest의 차이점은 무엇이며, 각각의 장단점을 비교해주세요. 실무에서 pytest가 더 선호되는 이유는 무엇인가요?
테스트 작성 방식, 어설션 문법, 픽스처 관리 측면에서 비교해보세요.
unittest는 Python 표준 라이브러리로 클래스 기반의 테스트 작성을 요구하며, assertEqual 같은 특정 메서드를 사용해야 합니다. pytest는 함수 기반으로 간단하게 테스트를 작성할 수 있고, assert 문만으로 직관적인 테스트가 가능합니다. pytest는 픽스처 시스템이 강력하고, 플러그인 생태계가 풍부하며, 테스트 실패 시 더 자세한 오류 정보를 제공합니다. 또한 파라미터화된 테스트를 쉽게 작성할 수 있어 실무에서 생산성이 높습니다. 이러한 이유로 최근 프로젝트에서는 pytest가 더 많이 사용되는 추세입니다.
- • unittest는 클래스 기반, pytest는 함수 기반
- • pytest는 assert 문만으로 테스트 가능
- • pytest의 강력한 픽스처와 플러그인 생태계
- • 파라미터화된 테스트 작성 용이성
새로운 기능 개발 시 빠르고 유지보수하기 쉬운 테스트 코드를 작성할 때 프레임워크 선택이 중요합니다.
pytest의 fixture에서 scope 파라미터(function, class, module, session)는 어떤 역할을 하며, 각각 언제 사용해야 하나요?
Q. 테스트 커버리지가 80%라는 것은 무엇을 의미하나요? 커버리지가 높다고 해서 반드시 품질이 좋은 테스트라고 할 수 없는 이유를 설명하고, 의미 있는 테스트를 작성하기 위해 무엇을 고려해야 하는지 설명해주세요.
코드 실행 여부와 실제 검증의 차이를 생각해보세요.
테스트 커버리지 80%는 전체 코드의 80%가 테스트 실행 중에 한 번 이상 실행되었다는 의미입니다. 하지만 코드가 실행되었다고 해서 올바르게 동작하는지 검증했다는 보장은 없습니다. 예를 들어, 함수를 호출만 하고 반환값이나 부수효과를 확인하지 않으면 커버리지는 올라가지만 버그는 발견하지 못합니다. 의미 있는 테스트를 위해서는 경계값 테스트, 예외 상황 처리, 비즈니스 로직의 핵심 시나리오를 검증해야 합니다. 또한 단순히 커버리지 수치를 높이기 위한 테스트가 아니라, 실제 사용자 시나리오와 버그가 발생할 가능성이 높은 부분에 집중해야 합니다.
- • 커버리지는 코드 실행 비율일 뿐 검증 품질을 보장하지 않음
- • 실행만 하고 검증하지 않는 테스트는 무의미함
- • 경계값, 예외상황, 핵심 비즈니스 로직 검증 필요
- • 커버리지 수치보다 의미 있는 시나리오 테스트가 중요
코드 리뷰나 배포 전 품질 점검 시 커버리지 리포트를 확인하지만, 수치만 보지 않고 실제 테스트 내용을 검토해야 합니다.
Python에서 테스트 커버리지를 측정하기 위해 사용하는 도구는 무엇이며, 어떻게 설정하고 리포트를 확인할 수 있나요?
Q. 외부 API를 호출하는 함수를 테스트할 때 실제 API를 호출하면 안 되는 이유는 무엇이며, Mock 객체를 사용하는 목적과 방법을 설명해주세요. Python의 unittest.mock 모듈에서 patch 데코레이터는 어떻게 사용하나요?
테스트의 독립성, 속도, 안정성 측면에서 생각해보세요.
실제 외부 API를 호출하면 테스트 실행 시간이 느려지고, 네트워크 상태나 외부 서비스 장애에 따라 테스트가 불안정해집니다. 또한 비용이 발생하거나 외부 시스템에 부작용을 일으킬 수 있으며, 테스트 환경에서 외부 서비스에 접근하지 못할 수도 있습니다. Mock 객체는 실제 객체를 대체하여 원하는 반환값을 설정하고, 호출 여부를 검증할 수 있게 해줍니다. unittest.mock의 patch 데코레이터를 사용하면 특정 모듈이나 함수를 Mock으로 교체할 수 있으며, with 문이나 데코레이터 형태로 사용합니다. 예를 들어 @patch('module.function')처럼 사용하고, return_value나 side_effect로 동작을 정의합니다.
- • 실제 API 호출은 느리고 불안정하며 비용 발생 가능
- • Mock은 외부 의존성을 제거하고 테스트를 독립적으로 만듦
- • unittest.mock의 patch로 함수나 객체를 Mock으로 교체
- • return_value와 side_effect로 Mock 동작 정의
결제 API나 이메일 발송 같은 외부 서비스를 호출하는 코드를 테스트할 때 Mock을 사용하여 안전하게 검증합니다.
Mock 객체에서 assert_called_once_with()와 assert_called_with()의 차이점은 무엇이며, 각각 언제 사용해야 하나요?
아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!