테스트 도구 실전 · 실패 경로와 부작용을 격리해 테스트한다 · 실습
실패 경로와 부작용을 격리해 테스트한다
목표
네트워크와 실제 대기 없이 호출 수·백오프·파일 보존·저장 실패를 재현합니다.
왜 중요한가
정상 요청 한 번의 성공은 경계값과 장애 복구를 보장하지 않습니다. 이 실습은 각 함수의 계약을 작게 구현하거나 테스트한 뒤 실제 실행으로 연결합니다. 코드가 존재하는지나 보고서 문구만 보지 않고 결과·예외·저장 상태를 검사합니다. 앞 단계의 코드를 유지하며 다음 단계로 진행하세요.
단계
1. /root/work/test-failures-lab/test_service.py에서 fetch가 send의 문자열을 그대로 반환하고 send를 정확히 한 번 호출하는지 테스트하세요. cache는 tmp_path 아래 pathlib.Path로 전달합니다. 첫 준비는 다음 명령으로 합니다.
mkdir -p /root/work/test-failures-labcp /opt/fixtures/practice_depth/test-failures-lab/* /root/work/test-failures-lab/cd /root/work/test-failures-lab2. /root/work/test-failures-lab/test_service.py에서 첫 send는 TimeoutError, 두 번째는 'fresh'를 반환하도록 구성하고 fetch가 'fresh'를 반환하는지 확인하세요.
3. /root/work/test-failures-lab/test_service.py에서 계속 TimeoutError인 send를 넣고 총 3회 호출 뒤 TimeoutError가 전파되는지 확인하세요.
4. /root/work/test-failures-lab/test_service.py에서 ValueError를 내는 send는 정확히 1회만 호출되고 같은 종류의 예외가 전파되는지 테스트하세요.
5. /root/work/test-failures-lab/test_service.py에서 모든 send가 TimeoutError일 때 sleep에 전달한 값이 정확히 [0.1, 0.2]인지 검사하세요. 실제로 잠들지 않습니다.
6. /root/work/test-failures-lab/test_service.py에서 한글 문자열로 성공시킨 뒤 cache 파일을 UTF-8로 읽어 같은 내용이 저장됐는지 확인하세요.
7. /root/work/test-failures-lab/test_service.py에서 cache에 'old'를 미리 쓴 뒤 send를 계속 실패시키세요. 예외 후 파일 내용이 여전히 'old'인지 확인합니다.
8. /root/work/test-failures-lab/test_service.py에서 send가 성공해도 cache 쓰기가 실패하면 OSError가 전파되는지 테스트하세요. cache에 tmp_path 디렉터리 자체를 전달하면 결정적으로 쓰기가 실패합니다.
참고
- 패키지는 이미지에 설치돼 있습니다. 인터넷 연결이나 pip install은 필요하지 않습니다.
- 준비 복사는 최초 한 번만 하세요. 다시 복사하면 작업 파일이 초기화됩니다.
- 테스트는
from service import ...로 제공 함수를 불러오세요. 채점은 별도 임시 디렉터리에 테스트만 복사해 정상·결함 구현에서 실행합니다. 단계별로 실제 테스트 실행 중 해당 결함을 잡아야 하며, 정상 코드에서는 실행한 테스트가 모두 통과해야 합니다. 수집 오류·임포트 오류·강제 종료는 검출로 인정하지 않습니다. 외부 파일이나 네트워크에 기대지 마세요. - 각 단계 채점은 45초 안에서 실행됩니다. 무한 루프나 실제 대기를 만들지 마세요.
8단계
- 성공 경로의 불필요한 호출을 잡는다
- 한 번 실패한 뒤 복구시킨다
- 총 시도 횟수와 마지막 예외를 검사한다
- 영구 오류의 재시도를 막는다
- 백오프 수열과 마지막 대기를 확인한다
- 반환값과 디스크 내용을 함께 확인한다
- 네트워크 실패가 기존 캐시를 지우지 못하게 한다
- 저장 실패를 가짜 성공으로 바꾸지 않는다