学习周记 #07 | 2026 年 AI Web UI 自动化平台进阶:集成 Allure 报告 + 测试历史记录 + 一键导出脚本

📅 2026/7/7 13:54:49
学习周记 #07 | 2026 年 AI Web UI 自动化平台进阶:集成 Allure 报告 + 测试历史记录 + 一键导出脚本
前言大家好第6期我们搭好了平台基本框架本期重点解决“执行完之后怎么看结果”和“怎么复用历史脚本”两个核心痛点加入Allure 报告自动生成与展示SQLite 存储测试历史记录一键导出可独立运行的测试脚本这样整个平台就更接近真实团队使用的工具了。一、环境准备新增依赖Bashpip install allure-pytest sqlalchemy alembic # alembic 用于数据库迁移可选二、核心代码升级1. 更新 agents/workflow.py增加 Allure 支持Pythonimport allure import pytest def execute_playwright_test(test_code: str, test_id: str): try: with open(fgenerated_test_{test_id}.py, w, encodingutf-8) as f: f.write(test_code) # 执行并生成 Allure 报告 result pytest.main([ fgenerated_test_{test_id}.py, --alluredir./reports/allure-results, --browserchromium ]) # 生成 Allure HTML 报告 os.system(allure generate ./reports/allure-results -o ./reports/allure-report --clean) return { status: success if result 0 else failed, report_url: /reports/allure-report/index.html } except Exception as e: return {status: error, message: str(e)}2. 添加数据库模型models.pyPythonfrom sqlalchemy import create_engine, Column, Integer, String, Text, DateTime from sqlalchemy.orm import declarative_base from datetime import datetime Base declarative_base() engine create_engine(sqlite:///test_history.db) class TestHistory(Base): __tablename__ test_history id Column(Integer, primary_keyTrue) requirement Column(Text) generated_code Column(Text) execution_status Column(String(50)) report_url Column(String(200)) create_time Column(DateTime, defaultdatetime.utcnow) Base.metadata.create_all(engine)3. FastAPI 接口升级main.py 关键部分Pythonfrom sqlalchemy.orm import Session from models import TestHistory, engine app.post(/generate-and-run) async def generate_and_run(req: TestRequest): try: result await asyncio.to_thread(run_test_workflow, req.requirement) # 保存历史记录 with Session(engine) as session: history TestHistory( requirementreq.requirement, generated_coderesult.get(final_code), execution_statusresult.get(execution_result, {}).get(status), report_urlresult.get(execution_result, {}).get(report_url) ) session.add(history) session.commit() return { status: success, history_id: history.id, report_url: result.get(execution_result, {}).get(report_url), code: result.get(final_code)[:500] ... # 预览 } except Exception as e: return {status: error, message: str(e)} # 新增接口查看历史记录 app.get(/history) async def get_history(): with Session(engine) as session: histories session.query(TestHistory).order_by(TestHistory.create_time.desc()).all() return [{id: h.id, requirement: h.requirement[:100], status: h.execution_status, time: h.create_time} for h in histories]4. 前端增强index.html 增加历史记录和导出按钮HTML!-- 在原有页面中增加 -- button onclickexportScript()导出当前脚本/button div idhistory/div script async function exportScript() { // 调用后端 /export 接口下载 .py 文件 window.location.href /export?history_id currentHistoryId; } /script三、常见报错及解决方案本期重点Allure 命令找不到解决全局安装 pip install allure-pytest 后确保 allure 命令在 PATH 中或用 Python subprocess 调用完整路径。SQLite 数据库锁OperationalError: database is locked解决使用 Session 时确保及时 commit() 和 close()高并发时考虑切换 PostgreSQL。Allure 报告生成失败no results解决在 pytest 执行时必须指定 --alluredir生成前确认 ./reports/allure-results 目录有 json 文件。导出脚本乱码或缺少 import解决在导出接口中添加 code # -*- coding: utf-8 -*-\n code 并确保 Coder Agent Prompt 要求完整代码。FastAPI 返回大代码块时超时/内存高解决只返回预览代码完整代码通过单独 /download 接口返回文件。时间不一致UTC vs 本地时间解决使用 datetime.now() 而非 utcnow()或统一用 timezone。Playwright 执行时浏览器崩溃解决增加 headlessFalse 测试或限制并发数使用 semaphore。历史记录查询慢解决给 create_time 加索引或限制返回条数分页。四、生产落地建议加入用户认证FastAPI Users 或 JWT测试报告自动邮件通知支持并行执行多个任务Celery Redis脚本版本管理保存到 Git 或数据库五、今日感悟加上 Allure 报告、历史记录和导出功能后这个平台已经具备了基本可用于小团队的条件。 我越来越觉得AI 测试平台的核心价值不是取代人工而是把重复劳动自动化把人解放出来做更有价值的测试设计和质量保障工作。下一期预告AI Web UI 自动化专栏 #06平台安全加固 权限控制 多用户支持 测试任务异步队列