LabHub
学习 学习路径 课程

테스트 도구 실전 · 실패 경로와 부작용을 격리해 테스트한다 · 实验

실패 경로와 부작용을 격리해 테스트한다

在 LabHub 中继续学习

목표

네트워크와 실제 대기 없이 호출 수·백오프·파일 보존·저장 실패를 재현합니다.

왜 중요한가

정상 요청 한 번의 성공은 경계값과 장애 복구를 보장하지 않습니다. 이 실습은 각 함수의 계약을 작게 구현하거나 테스트한 뒤 실제 실행으로 연결합니다. 코드가 존재하는지나 보고서 문구만 보지 않고 결과·예외·저장 상태를 검사합니다. 앞 단계의 코드를 유지하며 다음 단계로 진행하세요.

단계

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-lab

2. /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 디렉터리 자체를 전달하면 결정적으로 쓰기가 실패합니다.

참고

8个步骤

  1. 성공 경로의 불필요한 호출을 잡는다
  2. 한 번 실패한 뒤 복구시킨다
  3. 총 시도 횟수와 마지막 예외를 검사한다
  4. 영구 오류의 재시도를 막는다
  5. 백오프 수열과 마지막 대기를 확인한다
  6. 반환값과 디스크 내용을 함께 확인한다
  7. 네트워크 실패가 기존 캐시를 지우지 못하게 한다
  8. 저장 실패를 가짜 성공으로 바꾸지 않는다