← 메인 화면프로젝트 자료·코드
← 자료 목록

cc/tools/smoke_test.py

프로그램·코드 · 2.9 KB원본 다운로드

원본 내용을 읽기 전용으로 표시합니다.

  1. """실제 배포 주소의 읽기 전용 확인: python tools/smoke_test.py https://..."""
  2. import json
  3. import ssl
  4. import sys
  5. import time
  6. import urllib.error
  7. import urllib.request
  8. from pathlib import Path
  9. base = (sys.argv[1] if len(sys.argv) > 1 else 'http://127.0.0.1:5000').rstrip('/')
  10. checks = []
  11. def request(path, payload=None, expected=200):
  12. data = None if payload is None else json.dumps(payload, ensure_ascii=False).encode()
  13. req = urllib.request.Request(base + path, data=data, headers={'Content-Type': 'application/json', 'User-Agent': 'SejongAppSmokeTest/1.0'})
  14. start = time.perf_counter()
  15. try:
  16. response = urllib.request.urlopen(req, timeout=30, context=ssl.create_default_context())
  17. except urllib.error.HTTPError as error:
  18. response = error
  19. with response:
  20. body = response.read()
  21. assert response.code == expected, (path, response.code, body[:200])
  22. checks.append({'path': path, 'status': response.code, 'ms': round((time.perf_counter() - start) * 1000)})
  23. return body, response.headers
  24. page, headers = request('/')
  25. assert '세종 창업 입지 도우미'.encode() in page
  26. assert "object-src 'none'" in headers.get('Content-Security-Policy', '')
  27. health = json.loads(request('/healthz')[0])
  28. assert health['status'] == 'ok' and health['rows'] == 15816 and health['model_count'] == 57
  29. metadata = json.loads(request('/api/meta')[0])
  30. assert metadata['데이터점검']['2025-06']['사용행'] == 14853
  31. assert metadata['검증통과업종수'] == 10
  32. assert len(json.loads(request('/api/boundary')[0])['features']) == 24
  33. payload = {'lat': 36.504889, 'lon': 127.262486, 'mid': '비알코올'}
  34. analysis = json.loads(request('/api/analyze', payload)[0])
  35. assert analysis['현황']['업소수'] == 40 and analysis['현황']['같은업종수'] == 3
  36. assert analysis['현황']['작년업소수'] == 39 and analysis['동'] == '어진동'
  37. assert abs(analysis['참고']['예상'] - 3.5) < 0.01
  38. assert analysis['참고']['검증비율'] == 1
  39. comparison = json.loads(request('/api/recommend', payload)[0])
  40. assert comparison['상태'] in {'비교가능', '표시대상없음'}
  41. request('/api/analyze', {**payload, 'mid': []}, 400)
  42. request('/api/analyze', {**payload, 'lat': 0}, 400)
  43. request('/api/analyze', {'lat': True, 'lon': 127.2, 'mid': '한식'}, 400)
  44. request('/api/analyze', {**payload, 'mid': 'x' * 20000}, 413)
  45. request('/missing', expected=404)
  46. for resource in ('app.js', 'app.css', 'vendor/leaflet/leaflet.js', 'vendor/leaflet/leaflet.css'):
  47. request('/static/' + resource)
  48. result = {'base': base, 'health': health, 'passed_models': metadata['검증통과업종수'], 'example': {'stores': analysis['현황']['업소수'], 'same_category': analysis['현황']['같은업종수'], 'reference': analysis['참고']['예상']}, 'checks': checks}
  49. if len(sys.argv) > 2:
  50. Path(sys.argv[2]).write_text(json.dumps(result, ensure_ascii=False, indent=2), encoding='utf-8')
  51. print(json.dumps(result, ensure_ascii=False, indent=2))
파일 확인 정보

SHA-256: b36644b9d68720960453811f1f15ae0fec12da0846b4ee481fb62339100adc0f