fix: 回归脚本 Windows 可用 + 加"禁止对生产库跑"安全闸;迁移脚本去掉 GBK 控制台会崩的符号
- scripts/regression_test.py:
* signal.alarm 加 hasattr 守卫(Windows 上直接 AttributeError 退出,
backlog A4)→ 本机终于能跑"一条命令扫全接口 500"
* 新增安全闸:.env 声明 prod、或目标库 app_meta.deployment_env=prod 时
**拒绝运行**(exit 3)。本脚本会发真实写请求(设备池增删/剪贴板注入/
亮灭屏),跑在生产配置上就是拿正式数据做实验
- scripts/migrate_sqlite_to_mysql.py: stdout 重设为 UTF-8 并去掉 ✔/✘ 符号。
实测在 GBK 控制台里打印 ✔ 会抛 UnicodeEncodeError,而且崩在"写库标签"之前,
看起来像迁移失败(数据其实已搬完)
- doc/backlog/TODO.md: A4 移入已完成;gitignore 条目更新(mcp_audit.log 已补,
uiauto.pid 仍缺);登记 MySQL 迁移与回归安全闸
实测(对 192.168.2.27 的 auto_control_dev):数据迁移 12 张表逐表 SHA-256 一致;
应用直连 MySQL 全部接口 200,设备名/指纹唯一索引语义与 SQLite 一致(空值可重复、
非空重复被拦、大小写敏感 A08≠a08);备份导出→预览→应用往返正常。
This commit is contained in:
@@ -40,6 +40,14 @@ import uuid
|
||||
ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
sys.path.insert(0, ROOT)
|
||||
|
||||
# Windows 控制台默认 GBK,输出里带 ✔ 之类的符号会直接抛 UnicodeEncodeError
|
||||
# (本脚本是运维在终端里手跑的,崩在最后一步会让人以为迁移失败)
|
||||
try:
|
||||
sys.stdout.reconfigure(encoding="utf-8", errors="replace")
|
||||
sys.stderr.reconfigure(encoding="utf-8", errors="replace")
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
from sqlalchemy import inspect as sa_inspect, text as sa_text # noqa: E402
|
||||
|
||||
|
||||
@@ -306,7 +314,7 @@ def main():
|
||||
with app.app_context():
|
||||
stats, ok = copy_and_verify(args.sqlite, tables, "verify")
|
||||
print_stats(stats)
|
||||
print("\n校验结果: " + ("全部一致 ✔" if ok else "存在不一致 ✘"))
|
||||
print("\n校验结果: " + ("全部一致 OK" if ok else "存在不一致 FAIL"))
|
||||
sys.exit(0 if ok else 1)
|
||||
|
||||
# 目标库环境标签检查(防止误把 dev 数据灌进生产库)
|
||||
@@ -331,7 +339,7 @@ def main():
|
||||
print_stats(stats)
|
||||
if not ok:
|
||||
_fail("搬运后校验不一致 —— 事务已回滚,目标库保持原样。请把上面的表格发给我排查")
|
||||
print(f"\n搬运完成,用时 {time.time() - t0:.1f}s,逐表校验一致 ✔")
|
||||
print(f"\n搬运完成,用时 {time.time() - t0:.1f}s,逐表校验一致 OK")
|
||||
|
||||
# 4) 写库标签与版本
|
||||
src = sqlite3.connect(_readonly_uri(args.sqlite), uri=True)
|
||||
|
||||
@@ -25,11 +25,34 @@ sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
# 干扰回归/占用设备——实测 ocr关键字任务每 30 分钟触发导致回归超时)
|
||||
os.environ["DISABLE_SCHEDULER"] = "1"
|
||||
|
||||
# 单接口超时保护:adb 相关接口可能慢(连接/查询设备),给足时间
|
||||
signal.alarm(300)
|
||||
# 单接口超时保护:adb 相关接口可能慢(连接/查询设备),给足时间。
|
||||
# Windows 没有 signal.alarm(会 AttributeError 直接崩),那里就靠调用方自己掐时间。
|
||||
if hasattr(signal, "alarm"):
|
||||
signal.alarm(300)
|
||||
|
||||
from web_server import app # noqa: E402 (导入即完成 app 装配,与生产一致)
|
||||
|
||||
# ================== 安全闸:绝不对生产库跑写操作 ==================
|
||||
# 本脚本会发真实写请求(设备池增删、剪贴板注入、亮灭屏…)。跑在连生产库的配置上
|
||||
# 就是拿正式数据做实验——直接拒绝启动。
|
||||
from core import db_config # noqa: E402
|
||||
|
||||
if db_config.DEPLOY_ENV == "prod":
|
||||
print("=" * 70)
|
||||
print("拒绝运行:当前 .env 声明 DEPLOY_ENV=prod,本脚本会发真实写请求。")
|
||||
print("回归测试请在 dev 环境跑(或先把 .env 指向 dev 库/临时库)。")
|
||||
print("=" * 70)
|
||||
sys.exit(3)
|
||||
with app.app_context():
|
||||
_labeled = db_config.meta_get("deployment_env")
|
||||
if _labeled == "prod":
|
||||
print("=" * 70)
|
||||
print("拒绝运行:目标库 %s 被登记为 prod 环境(app_meta.deployment_env)。"
|
||||
% db_config.describe_target())
|
||||
print("回归测试会写数据,不能对生产库执行。")
|
||||
print("=" * 70)
|
||||
sys.exit(3)
|
||||
|
||||
|
||||
# 流式/二进制接口:无法用普通 GET 断言,跳过(已有单独验证路径)
|
||||
_SKIP_PREFIXES = (
|
||||
|
||||
Reference in New Issue
Block a user