cc/tools/smoke_test.py
원본 내용을 읽기 전용으로 표시합니다.
"""실제 배포 주소의 읽기 전용 확인: python tools/smoke_test.py https://..."""import jsonimport sslimport sysimport timeimport urllib.errorimport urllib.requestfrom pathlib import Pathbase = (sys.argv[1] if len(sys.argv) > 1 else 'http://127.0.0.1:5000').rstrip('/')checks = []def request(path, payload=None, expected=200):data = None if payload is None else json.dumps(payload, ensure_ascii=False).encode()req = urllib.request.Request(base + path, data=data, headers={'Content-Type': 'application/json', 'User-Agent': 'SejongAppSmokeTest/1.0'})start = time.perf_counter()try:response = urllib.request.urlopen(req, timeout=30, context=ssl.create_default_context())except urllib.error.HTTPError as error:response = errorwith response:body = response.read()assert response.code == expected, (path, response.code, body[:200])checks.append({'path': path, 'status': response.code, 'ms': round((time.perf_counter() - start) * 1000)})return body, response.headerspage, headers = request('/')assert '세종 창업 입지 도우미'.encode() in pageassert "object-src 'none'" in headers.get('Content-Security-Policy', '')health = json.loads(request('/healthz')[0])assert health['status'] == 'ok' and health['rows'] == 15816 and health['model_count'] == 57metadata = json.loads(request('/api/meta')[0])assert metadata['데이터점검']['2025-06']['사용행'] == 14853assert metadata['검증통과업종수'] == 10assert len(json.loads(request('/api/boundary')[0])['features']) == 24payload = {'lat': 36.504889, 'lon': 127.262486, 'mid': '비알코올'}analysis = json.loads(request('/api/analyze', payload)[0])assert analysis['현황']['업소수'] == 40 and analysis['현황']['같은업종수'] == 3assert analysis['현황']['작년업소수'] == 39 and analysis['동'] == '어진동'assert abs(analysis['참고']['예상'] - 3.5) < 0.01assert analysis['참고']['검증비율'] == 1comparison = json.loads(request('/api/recommend', payload)[0])assert comparison['상태'] in {'비교가능', '표시대상없음'}request('/api/analyze', {**payload, 'mid': []}, 400)request('/api/analyze', {**payload, 'lat': 0}, 400)request('/api/analyze', {'lat': True, 'lon': 127.2, 'mid': '한식'}, 400)request('/api/analyze', {**payload, 'mid': 'x' * 20000}, 413)request('/missing', expected=404)for resource in ('app.js', 'app.css', 'vendor/leaflet/leaflet.js', 'vendor/leaflet/leaflet.css'):request('/static/' + resource)result = {'base': base, 'health': health, 'passed_models': metadata['검증통과업종수'], 'example': {'stores': analysis['현황']['업소수'], 'same_category': analysis['현황']['같은업종수'], 'reference': analysis['참고']['예상']}, 'checks': checks}if len(sys.argv) > 2:Path(sys.argv[2]).write_text(json.dumps(result, ensure_ascii=False, indent=2), encoding='utf-8')print(json.dumps(result, ensure_ascii=False, indent=2))
파일 확인 정보
SHA-256: b36644b9d68720960453811f1f15ae0fec12da0846b4ee481fb62339100adc0f