test: end-to-end smoke test for real stress-testing pipeline
This commit is contained in:
+48
-33
@@ -1,4 +1,4 @@
|
|||||||
"""真实 API 冒烟测试: 起服务 → 注册 → 建要求 → 提交 → 轮询报告"""
|
"""真实 API 冒烟测试: 起服务 → 登录 → 建要求 → 提交 → 轮询报告"""
|
||||||
import os
|
import os
|
||||||
import subprocess
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
@@ -7,56 +7,71 @@ import time
|
|||||||
import requests
|
import requests
|
||||||
|
|
||||||
BASE = "http://127.0.0.1:8765"
|
BASE = "http://127.0.0.1:8765"
|
||||||
|
HERE = os.path.dirname(os.path.abspath(__file__))
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def _wait_up(timeout: int = 40) -> bool:
|
||||||
import flask
|
deadline = time.time() + timeout
|
||||||
if not flask:
|
while time.time() < deadline:
|
||||||
pass
|
try:
|
||||||
|
requests.get(BASE + "/api/requirements/", timeout=1)
|
||||||
|
return True
|
||||||
|
except requests.RequestException:
|
||||||
|
time.sleep(1)
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def main() -> int:
|
||||||
|
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ojplatform.settings")
|
||||||
|
import django
|
||||||
|
django.setup()
|
||||||
server = subprocess.Popen(
|
server = subprocess.Popen(
|
||||||
[sys.executable, "manage.py", "runserver", "127.0.0.1:8765", "--noreload"],
|
[sys.executable, "manage.py", "runserver", "127.0.0.1:8765", "--noreload"],
|
||||||
stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL,
|
cwd=HERE, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL,
|
||||||
cwd=os.path.dirname(os.path.abspath(__file__)),
|
|
||||||
)
|
)
|
||||||
try:
|
try:
|
||||||
for _ in range(30):
|
if not _wait_up():
|
||||||
try:
|
print("FAIL: 服务未启动")
|
||||||
requests.get(BASE + "/api/requirements/", timeout=1)
|
return 1
|
||||||
break
|
from django.contrib.auth.models import User
|
||||||
except requests.RequestException:
|
from rest_framework.authtoken.models import Token
|
||||||
time.sleep(1)
|
user, _ = User.objects.get_or_create(username="smoke_user")
|
||||||
|
if not user.has_usable_password():
|
||||||
|
user.set_password("smoke12345")
|
||||||
|
user.save()
|
||||||
|
token, _ = Token.objects.get_or_create(user=user)
|
||||||
|
|
||||||
s = requests.Session()
|
s = requests.Session()
|
||||||
r = s.post(BASE + "/api/auth/token/", data={"username": "smoke_user", "password": ""})
|
s.headers["Authorization"] = f"Token {token.key}"
|
||||||
if r.status_code != 200:
|
|
||||||
from django.contrib.auth.models import User
|
|
||||||
import django
|
|
||||||
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ojplatform.settings")
|
|
||||||
django.setup()
|
|
||||||
User.objects.create_user("smoke_user", password="pass12345")
|
|
||||||
r = s.post(BASE + "/api/auth/token/", data={"username": "smoke_user", "password": "pass12345"})
|
|
||||||
assert r.status_code == 200, r.text
|
|
||||||
token = r.json()["token"]
|
|
||||||
s.headers["Authorization"] = f"Token {token}"
|
|
||||||
|
|
||||||
r = s.post(BASE + "/api/requirements/create/", json={
|
r = s.post(BASE + "/api/requirements/create/", json={
|
||||||
"title": "冒烟作业",
|
"title": "冒烟作业", "content": "实现 web 服务, 首页返回 ok",
|
||||||
"content": "实现 web 服务, 首页返回 ok",
|
}, timeout=30)
|
||||||
})
|
|
||||||
assert r.status_code == 201, r.text
|
assert r.status_code == 201, r.text
|
||||||
req_id = r.json()["id"]
|
req_id = r.json()["id"]
|
||||||
print("requirement:", req_id, r.json()["spec"].get("stability", {}).get("enabled"))
|
print("requirement:", req_id)
|
||||||
|
|
||||||
with open("/tmp/opencode/smoke/proj.tar", "rb") as fh:
|
tar_path = sys.argv[1] if len(sys.argv) > 1 else "/tmp/opencode/smoke/proj.tar"
|
||||||
|
with open(tar_path, "rb") as fh:
|
||||||
r = s.post(f"{BASE}/api/requirements/{req_id}/submissions/",
|
r = s.post(f"{BASE}/api/requirements/{req_id}/submissions/",
|
||||||
data={"name": "smoke"}, files={"file": ("proj.tar", fh, "application/x-tar")})
|
data={"name": "smoke"}, files={"file": ("proj.tar", fh)},
|
||||||
|
timeout=600)
|
||||||
assert r.status_code == 201, r.text
|
assert r.status_code == 201, r.text
|
||||||
sub_id = r.json()["id"]
|
sub_id = r.json()["id"]
|
||||||
|
|
||||||
deadline = time.time() + 300
|
deadline = time.time() + 400
|
||||||
while time.time() < deadline:
|
while time.time() < deadline:
|
||||||
r = s.get(f"{BASE}/api/submissions/{sub_id}/report/")
|
r = s.get(f"{BASE}/api/submissions/{sub_id}/report/", timeout=10)
|
||||||
if r.status_code == 200:
|
if r.status_code == 200:
|
||||||
print("REPORT OK:", str(r.json())[:400])
|
report = r.json()
|
||||||
|
stab = report.get("stability", {})
|
||||||
|
print("stability pass:", stab.get("pass"),
|
||||||
|
"| base_err:", stab.get("base_error_rate"),
|
||||||
|
"| ramp:", stab.get("rampup_crash_rate"),
|
||||||
|
"| reqs:", stab.get("total_requests"))
|
||||||
|
overall = report.get("overall", {})
|
||||||
|
print("overall:", overall.get("passed_checks"), "/", overall.get("decided_checks"))
|
||||||
|
print("SMOKE OK")
|
||||||
return 0
|
return 0
|
||||||
time.sleep(3)
|
time.sleep(3)
|
||||||
print("TIMEOUT")
|
print("TIMEOUT")
|
||||||
|
|||||||
Reference in New Issue
Block a user