Webman本身不是测试框架,不能直接生成自动化测试报告,而是作为报告服务后端接收、存储并转发结构化测试结果(如JUnit XML、Playwright JSON等),通过轻量API实现与CI集成和静态报告分发。

Webman 本身不是测试框架,它是一个基于 Swoole 的高性能 PHP Web 框架,**不能直接生成自动化测试报告**。想用它实现“高性能的自动化测试报告系统”,本质是把它当作**报告服务后端**——即接收测试结果、存储、聚合、渲染 HTML/JSON 报告,而非执行测试。
下面直奔实操重点:
Webman 能接哪些测试结果数据?
它不跑测试,只收结果。常见来源有:
-
PHPUnit输出的JUnit XML(通过--log-junit report.xml) -
Playwright/Puppeteer的 JSON 报告(如--reporter=json) -
pytest的pytest-json-report插件输出 - CI 工具(如 Jenkins、GitLab CI)通过 HTTP POST 推送的结构化结果
关键点:所有输入必须是结构化数据(XML/JSON),不能是截图或日志文本流——否则 Webman 需额外解析,性能会掉。
如何用 Webman 快速暴露一个报告 API?
不要重写前端,复用成熟报告格式(如 Allure、JUnit Viewer),Webman 只做两件事:存 + 转发。
示例路由(app/Route.php):
Route::post('/api/report/upload', function (Request $request) {
$file = $request->file('report');
if (!$file || $file->getMimeType() !== 'application/xml') {
return json(['error' => 'Only JUnit XML allowed']);
}
$content = file_get_contents($file->getRealPath());
$uuid = uniqid('rep_');
file_put_contents("storage/reports/{$uuid}.xml", $content);
return json(['id' => $uuid]);
});
Route::get('/report/{id}', function ($id) {
$path = "storage/reports/{$id}.xml";
if (!is_file($path)) {
return response('Not found', 404);
}
// 直接返回原始 XML,由前端 JS 渲染(如 junit-report-viewer)
return response(file_get_contents($path), 200, ['Content-Type' => 'application/xml']);
});
注意:storage/reports/ 目录需确保 Webman 进程有写权限;生产环境建议用 Redis 缓存解析后的摘要,避免每次读 XML。
Webman 2.2.0版本强化了 TCP/UDP 服务支持,优化路由组管理,并增强异步任务处理能力。结合协程与连接池技术,Webman 能轻松应对高并发场景,适用于网站、接口服务、即时通讯、物联网及游戏开发,兼具高性能、灵活扩展与稳定可靠,是多场景 PHP 服务开发的理想选择。
为什么不用 Webman 做完整报告生成?
因为没必要,且容易翻车:
-
DOMDocument解析大 XML 报告(>10MB)会吃光内存,Swoole 协程也扛不住 - 前端已有成熟方案(Allure、ReportPortal),Webman 强行渲染 HTML 模板反而拖慢响应
- 并发高时,PHP 的文件锁(
flock)在写入报告时易阻塞,不如用file_put_contents(..., FILE_APPEND | LOCK_EX)或直接上MySQL/SQLite
真正高性能的做法:Webman 只做轻量中转,把原始报告扔进对象存储(如 MinIO),再用 Nginx 直接 alias 静态服务,完全绕过 PHP。
Webman 和 CI 集成的关键配置点
让 GitLab CI 或 GitHub Actions 自动推送报告到 Webman:
- Curl 命令里必须加
-H "Content-Type: multipart/form-data",否则$request->file()拿不到 - Webman 默认关闭
upload_max_filesize,需在php.ini中调大(建议 ≤50MB) - 若用 Swoole 5.x,记得开启
http_compression => false,否则 XML 压缩后前端 JS 无法解析 - 别把报告 ID 当作敏感信息——它只是文件名,无鉴权,生产环境务必加
auth middleware或反向代理层拦截
最常被忽略的是路径权限和 MIME 类型校验。一旦上传失败,curl -v 看响应头比查日志快得多。


















