Files
2026-08-21 16:00:13 +08:00

79 lines
2.4 KiB
Python

"""
天目健康检查测试(pytest)。
需先启动天目服务:
cd tianmu && source .venv/bin/activate && python3 -m src.main
"""
from __future__ import annotations
import base64
import json
import os
import subprocess
import time
import urllib.request
import pytest
API_BASE = os.environ.get("TIANMU_API_BASE", "http://localhost:8101")
def test_healthz():
"""健康检查应返回 200 并包含引擎状态。"""
req = urllib.request.Request(f"{API_BASE}/healthz")
with urllib.request.urlopen(req, timeout=5) as resp:
assert resp.status == 200
data = json.loads(resp.read())
assert "status" in data
assert "engines" in data
assert "version" in data
assert data["version"] == "0.2.0"
assert "ppocrv6" in data["engines"]
def test_ocr_empty_image():
"""发送空数据应得到有效的错误响应(而非崩溃)。"""
body = json.dumps({"image": ""}).encode("utf-8")
req = urllib.request.Request(
f"{API_BASE}/v1/ocr",
data=body,
headers={"Content-Type": "application/json"},
)
with urllib.request.urlopen(req, timeout=5) as resp:
assert resp.status == 200
data = json.loads(resp.read())
# 空图片不会触发 422,而是返回 engine 处理结果或错误
assert "engine" in data
assert "error" in data # 可能是 None 或错误消息,但字段必须存在
def test_ocr_png_image():
"""PP-OCRv6 应正确识别简单图片中的文字。"""
from PIL import Image, ImageDraw
# 生成白底黑字图片
img = Image.new("RGB", (400, 60), color="white")
draw = ImageDraw.Draw(img)
draw.text((10, 20), "Hello World 123", fill="black")
import io
buf = io.BytesIO()
img.save(buf, format="PNG")
b64 = base64.b64encode(buf.getvalue()).decode("ascii")
body = json.dumps({"image": b64, "engine": "ppocrv6"}).encode("utf-8")
req = urllib.request.Request(
f"{API_BASE}/v1/ocr",
data=body,
headers={"Content-Type": "application/json"},
)
with urllib.request.urlopen(req, timeout=30) as resp:
data = json.loads(resp.read())
assert data["engine"] == "ppocrv6"
assert data["error"] is None
assert len(data["text"]) > 0 # 识别到文字
assert len(data["blocks"]) > 0
assert data["blocks"][0]["confidence"] > 0.5
assert data["duration_ms"] > 0