import json import subprocess import sys import time import urllib.error import urllib.request process = subprocess.Popen( [sys.executable, "-u", "app/app.py"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, ) try: base_url = "http://127.0.0.1:8000" response = None for _ in range(30): if process.poll() is not None: raise RuntimeError("Приложение завершилось до запуска") try: response = urllib.request.urlopen( f"{base_url}/health", timeout=1 ) break except (urllib.error.URLError, TimeoutError): time.sleep(1) if response is None: raise RuntimeError("Приложение не ответило за 30 секунд") with response: assert response.status == 200 data = json.loads(response.read().decode("utf-8")) assert data.get("status") == "ok", data with urllib.request.urlopen(base_url, timeout=3) as response: assert response.status == 200 try: urllib.request.urlopen(f"{base_url}/unknown", timeout=3) except urllib.error.HTTPError as error: assert error.code == 404, error.code else: raise AssertionError("Для /unknown ожидался HTTP 404") print("Smoke tests passed!") finally: process.terminate() try: process.wait(timeout=5) except subprocess.TimeoutExpired: process.kill() process.wait()