LabHub
学习 学习路径 课程

테스트 도구 실전 · 설정 테스트의 전역 상태를 격리한다 · 实验

설정 테스트의 전역 상태를 격리한다

在 LabHub 中继续学习

목표

잘못된 환경값·기본값·스냅샷·비밀 필드 노출 회귀를 검증합니다.

왜 중요한가

먼저 실행한 시험이 환경변수를 바꿔 뒤의 시험이 실패했다. 테스트 순서를 고정하면 문제가 숨겨졌지만 실제 앱의 설정 오타까지 정상 기본값으로 바뀌는 버그는 남았다. 입력 격리와 엄격한 파싱을 별도로 확인해야 한다.

단계

1. /root/work/test-settings-isolation-lab/test_service.py에서 제공된 service.py의 다음 공개 계약을 테스트하세요: parse_bool(value)는 대소문자를 무시한 true 또는 false만 bool로 반환합니다. 공백이 붙거나 문자열이 아니면 ValueError입니다. 정상 구현에서는 통과하고 이 계약을 어긴 구현에서는 실제 테스트 본문의 실패로 검출해야 합니다. 앞 단계 테스트를 유지하며 test_ 함수를 추가하세요.

처음 한 번 준비하세요. 기존 파일은 덮어쓰지 않습니다.

mkdir -p /root/work/test-settings-isolation-labtest -e /root/work/test-settings-isolation-lab/service.py || cp /opt/fixtures/ten_labs/test-settings-isolation-lab/service.py /root/work/test-settings-isolation-lab/service.pytest -e /root/work/test-settings-isolation-lab/test_service.py || cp /opt/fixtures/ten_labs/test-settings-isolation-lab/test_service.py /root/work/test-settings-isolation-lab/test_service.pycd /root/work/test-settings-isolation-lab

2. /root/work/test-settings-isolation-lab/test_service.py에서 제공된 service.py의 다음 공개 계약을 테스트하세요: parse_port(value)는 ASCII 숫자만 있는 문자열을 int로 바꾸고 1~65535이면 반환합니다. 나머지는 ValueError입니다. 정상 구현에서는 통과하고 이 계약을 어긴 구현에서는 실제 테스트 본문의 실패로 검출해야 합니다. 앞 단계 테스트를 유지하며 test_ 함수를 추가하세요.

3. /root/work/test-settings-isolation-lab/test_service.py에서 제공된 service.py의 다음 공개 계약을 테스트하세요: parse_timeout(value)는 문자열을 float로 변환해 0보다 크고 30 이하인 유한 값만 반환합니다. 나머지는 ValueError입니다. 정상 구현에서는 통과하고 이 계약을 어긴 구현에서는 실제 테스트 본문의 실패로 검출해야 합니다. 앞 단계 테스트를 유지하며 test_ 함수를 추가하세요.

4. /root/work/test-settings-isolation-lab/test_service.py에서 제공된 service.py의 다음 공개 계약을 테스트하세요: required_token(env)는 TOKEN이 문자열이고 strip 후 비어 있지 않을 때 strip한 값을 반환합니다. 없거나 빈 값은 ValueError입니다. 정상 구현에서는 통과하고 이 계약을 어긴 구현에서는 실제 테스트 본문의 실패로 검출해야 합니다. 앞 단계 테스트를 유지하며 test_ 함수를 추가하세요.

5. /root/work/test-settings-isolation-lab/test_service.py에서 제공된 service.py의 다음 공개 계약을 테스트하세요: load_settings(env)는 service=env의 SERVICE 또는 누락 시 'api', debug=parse_bool(DEBUG 누락 시 'false'), port=parse_port(PORT 누락 시 '8000'), timeout=parse_timeout(TIMEOUT 누락 시 '5'), token=required_token인 딕셔너리입니다. 빈 SERVICE는 ValueError입니다. 정상 구현에서는 통과하고 이 계약을 어긴 구현에서는 실제 테스트 본문의 실패로 검출해야 합니다. 앞 단계 테스트를 유지하며 test_ 함수를 추가하세요.

6. /root/work/test-settings-isolation-lab/test_service.py에서 제공된 service.py의 다음 공개 계약을 테스트하세요: public_settings(settings)는 service와 debug만 가진 새 딕셔너리입니다. 원본은 수정하지 않습니다. 정상 구현에서는 통과하고 이 계약을 어긴 구현에서는 실제 테스트 본문의 실패로 검출해야 합니다. 앞 단계 테스트를 유지하며 test_ 함수를 추가하세요.

7. /root/work/test-settings-isolation-lab/test_service.py에서 제공된 service.py의 다음 공개 계약을 테스트하세요: snapshot(env)는 load_settings 결과를 반환합니다. 호출 후 env를 수정해도 반환된 설정은 바뀌지 않습니다. 정상 구현에서는 통과하고 이 계약을 어긴 구현에서는 실제 테스트 본문의 실패로 검출해야 합니다. 앞 단계 테스트를 유지하며 test_ 함수를 추가하세요.

8. /root/work/test-settings-isolation-lab/test_service.py에서 제공된 service.py의 다음 공개 계약을 테스트하세요: create_app(env)는 snapshot을 즉시 읽으며 잘못된 설정이면 ValueError로 앱 생성을 실패시킵니다. GET /info는 public_settings만 반환합니다. 다른 env로 만든 앱끼리 설정을 공유하지 않습니다. 정상 구현에서는 통과하고 이 계약을 어긴 구현에서는 실제 테스트 본문의 실패로 검출해야 합니다. 앞 단계 테스트를 유지하며 test_ 함수를 추가하세요.

참고

8个步骤

  1. 불리언을 명시적으로 파싱한다 — 테스트
  2. 포트 범위를 검사한다 — 테스트
  3. 시간 제한을 유한 값으로 만든다 — 테스트
  4. 필수 비밀의 누락을 거절한다 — 테스트
  5. 누락에만 기본값을 적용한다 — 테스트
  6. 공개 설정에서 비밀을 제거한다 — 테스트
  7. 외부 변경과 설정을 분리한다 — 테스트
  8. 시작 실패와 공개 응답을 확인한다 — 테스트