LabHub
学习 学习路径 课程

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

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

在 LabHub 中继续学习

한 줄 요약

장애 테스트에서는 최종 반환값과 함께 호출 횟수·대기·파일 상태까지 관찰한다.

概念图: 한 줄 요약 · 왜 이게 필요했나 · 어떻게 동작하나 · 현장에서 만나는 모습

왜 이게 필요했나

잠깐 끊어진 연결은 재시도로 복구할 수 있지만 잘못된 입력은 같은 요청을 반복해도
고쳐지지 않는다. 두 오류를 모두 except Exception으로 묶으면 성공 응답이 나오더라도
숨겨진 중복 호출과 불필요한 대기가 생긴다. 실제 외부 서버를 끊거나 수 초씩 기다리지
않고도 실패 경로를 시험할 수 있어야 개발자가 매번 테스트를 돌린다.

어떻게 동작하나

fetch(send, sleep, cache)는 인자로 받은 send를 호출하고 TimeoutError에만 재시도한다.
총 호출은 최대 3회이며 첫 실패 뒤 0.1초, 둘째 실패 뒤 0.2초를 sleep에 넘긴다.
세 번째 실패에서는 더 기다리지 않고 예외를 올린다. ValueError 같은 영구 오류는
즉시 전파한다. 성공한 문자열은 pathlib.Path인 cache에 UTF-8로 저장한 뒤 반환한다.
저장 자체가 실패해도 오류를 숨기지 않는다.

성공 → 파일 저장 → 반환시간 초과 → 시도 남음? → 대기 → 재호출           └─ 없음 → 예외, 기존 파일 그대로영구 오류 → 즉시 예외

현장에서 만나는 모습

가짜 send는 호출 기록을 리스트에 남기고 정해진 순서로 오류와 값을 반환한다.
가짜 sleep은 지연 값을 기록만 한다. tmp_path는 테스트마다 다른 디렉터리를 제공하므로
이전 테스트의 캐시가 다음 테스트를 통과시키지 못한다. 기존 캐시를 보존하는 계약은
네트워크 실패에 대한 것이다. 단순 write_text는 쓰는 도중 디스크 장애까지 원자적으로
보호하지 않으므로 이 구현을 원자적 파일 교체로 부르지는 않는다.

다음 실습에서 할 것

성공, 일시 실패 후 복구, 소진, 영구 오류, 대기 수열, 성공 저장, 실패 시 보존, 저장 오류를
각각 검증한다. root 환경에서는 chmod만으로 쓰기 실패를 만들 수 있다고 가정하면 안 된다.
디렉터리에 파일 내용을 쓰게 하는 등 환경에 덜 의존하는 실패 조건을 선택한다.
채점은 같은 테스트를 정상·결함 구현에 실행하며 보고서 문구나 목 호출 선언만으로 통과하지 않는다.

참고: [pytest tmp_path](https://docs.pytest.org/en/stable/how-to/tmp_path.html)