尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

MeterSphere持续测试平台实战:接口、UI、性能测试与CI/CD一体化

MeterSphere持续测试平台实战:接口、UI、性能测试与CI/CD一体化 1. 项目定位与整体思路拆解1.1 为什么持续测试平台突然成了刚需做测试的人应该都有体会传统模式下测试工具是“东一块、西一块”的接口测试用 Postman、JMeter性能测试单独搞一套 LoadRunner 或者 GatlingUI 自动化又得搭 Selenium 或者 Cypress测试用例管理再来一个禅道或者 TestRail。工具链一多问题就跟着来了——测试数据对不上、用例分散在各处、CI 里串联流程要写一堆胶水代码、报告还得人工汇总。MeterSphere 这个名字乍一听可能觉得陌生但如果你用过 Jenkins、GitLab CI 这类工具再去看 MeterSphere会发现它解决的问题非常实在把接口测试、UI 测试、性能测试、测试跟踪这几件事统一放到一个平台上来做。它不是要取代你手里所有工具而是想把测试这条链路上的核心环节从“零散工具组合”变成“一体化平台”。这个项目最开始是 FIT2CLOUD飞致云开源的后来也一直在社区里迭代。它底层用了 JMeter 作为执行引擎接口测试协议上兼容 HTTP 和常见数据库协议UI 测试则基于 Selenium 做二次封装。平台本身采用微服务架构前端 Vue、后端 Spring Boot部署方式支持 Docker Compose 和 Helm方便你在测试环境、生产环境甚至离线局域网内部署。1.2 这个平台适合谁、能解决什么实际问题如果你所在的团队是下面这几种情况之一MeterSphere 大概率值得花点时间研究中小型研发团队测试人员不多没有专门的测试开发岗想找一套“开箱即用”的测试平台而不是从零搭工具链。已经有 JMeter 使用经验但脚本和测试数据散落在个人电脑上需要集中管理和多人协作。接口测试和 CI/CD 链路还没打通每次发版前靠人工点一遍接口想快速接入 Jenkins 或者 GitLab。需要给客户或者领导展示测试覆盖率、测试报告以前手动整理 Excel现在希望自动生成可视化的测试跟踪报告。MeterSphere 的核心价值可以归纳成三层第一层是“统一入口”登录一个平台就能管接口用例、UI 用例、性能脚本和测试计划第二层是“数据打通”测试计划可以同时关联接口用例和性能场景执行完自动汇总报告第三层是“持续集成”通过服务集成或者命令行工具把测试执行接入到 CI 流水线里。我自己实际用下来的感觉它最舒服的地方不是某个单点功能有多惊艳而是省掉了大量“工具之间传数据”的脏活。以前接口测试结果要转成 JIRA 缺陷得写脚本调 API现在平台里配置一下缺陷模板就能直接提交。以前性能测试跑完要手动截图整理报告现在报告页面可以直接分享链接。这些看起来都是小事但攒在一起每周能省下小半天。2. 核心功能模块拆解与实操要点2.1 接口测试从导入 Swagger 到生成用例MeterSphere 的接口测试模块支持的功能和 Postman、Apifox 这类工具高度重合支持 HTTP、HTTPS、TCP、Dubbo、SQL 等协议可以进行环境管理、参数化、断言、前后置脚本、数据驱动等操作。先讲最重要的一个流程从 Swagger/OpenAPI 文档导入接口定义并自动生成用例。在实际项目中后端开发一般会在代码里维护 Swagger 注解启动服务后能访问到/v2/api-docs或/v3/api-docs接口。在 MeterSphere 里你可以通过“接口定义”页面选择“导入接口”粘贴 Swagger JSON 地址或者上传 JSON 文件平台会自动解析出接口列表包括路径、请求方法、参数定义和响应示例。这里有个细节导入的接口默认只生成了“接口定义”不会自动生成完整的测试用例。你需要进入接口详情点击“生成用例”选择要覆盖的请求参数组合平台才会生成可执行的接口用例。生成的用例默认带上了响应状态码断言比如 200但业务字段的断言需要自己补。举个例子一个登录接口导入后你至少需要做这几步在“环境配置”里新建环境配置服务地址比如http://test.api.example.com并添加全局变量token。打开登录接口用例在“请求体”里填写测试账号密码建议用参数变量{{username}}、{{password}}而不是写死。添加“断言”校验响应 JSON 里的code字段等于0message等于success。添加“后置操作”用 JSONPath 提取响应里的data.token存入环境变量token。这样后续其他接口就可以在请求头里引用{{token}}实现登录态的自动传递。再强调一个容易踩坑的地方MeterSphere 的接口用例里断言默认是“响应内容包含”这种模糊匹配而不是精确匹配。如果你两个用例的响应都包含success模糊断言可能掩盖掉真正的错误。所以强烈建议优先用“JSONPath 断言”或者“正则断言”对关键业务字段做精确校验。2.2 UI 测试基于 Selenium 的自动录制与脚本优化UI 测试模块是 MeterSphere 相对较晚上线的功能底层是 Selenium支持 Chrome 和 Firefox。对于没写过自动化脚本的测试人员它提供了“录制”功能可以像录屏一样把操作步骤录下来再回放执行。录制功能在实际使用中不算完美因为 Selenium 录制生成的脚本元素定位方式往往是最“重”的 XPath网页稍微改个布局脚本就挂了。我的建议是录制只是辅助手段录完之后一定要到“测试场景”里检查每个步骤的定位表达式尽量改成更稳定的定位方式。举几个优先级参考优先用id定位idusername其次用name定位nameusername再考虑 CSS 选择器input[placeholder请输入用户名]最后才用绝对 XPath/html/body/div[1]/div[2]/form/input[1]为什么这么说因为前端页面重构的时候DOM 层级和 class 类名最容易变而 id 和 name 是后端交互的标识开发一般不会乱改。用稳定的定位方式脚本的维护成本会低很多。还有一个实操技巧在 MeterSphere 的 UI 测试场景里可以用“自定义脚本”步骤把一些复杂的逻辑比如时间戳生成、随机数生成用 Python 写进去这在处理“每次登录都要换手机号注册”这类场景时特别好用。2.3 性能测试不写 JMeter 脚本也能压性能测试模块的核心是“场景化压测”你可能不需要直接写 JMeter 的 JTL 脚本而是通过界面配置并发数、压测时长、压测接口平台会自动帮你生成 JMeter 脚本并执行。对于有 JMeter 经验的人来说这个模块的上手成本非常低。创建性能测试时你可以直接引用接口测试模块里定义好的接口用例也可以单独配置请求地址、请求头、请求体。然后设置线程组并发用户数、Ramp-Up 时间、循环次数。一个常见的压测配置示例场景名称登录接口压测并发用户50启动时间10 秒也就是说 50 个用户会在 10 秒内逐步增加循环次数100 次压力机本机分布式压测需要额外配置 node-controller 节点执行完成后平台会展示吞吐量、响应时间分布、错误率、CPU 占用等指标。这里需要注意的是默认的报告是聚合报告维度如果你想看 TP99 这样的分位数需要到“报告详情”里查看“响应时间百分位”图表。JMeter 里的监听器在 MeterSphere 里会以图表形式呈现信息并不少只是位置和展示方式不一样。2.4 测试跟踪把测试计划当项目管理的枢纽测试跟踪模块在一般人的印象里可能只是个“用例管理工具”但 MeterSphere 的测试跟踪做得更重——它把接口测试、UI 测试、性能测试的结果统一汇总到“测试计划”里。一个测试计划可以关联功能测试用例手工用例接口测试用例集UI 测试场景性能测试场景执行完测试计划后平台上会生成一个综合报告展示每个模块的通过率、失败用例列表、执行耗时。这个功能对于需要跟领导和客户汇报测试结果的场景价值非常大。我之前在一个项目里每轮版本迭代要跑 200 多个接口用例、30 多个 UI 场景、3 个性能场景。以前用 Excel 记录每次发布前光是汇总报告就要花半天。用 MeterSphere 的测试计划之后直接一键执行报告自动出来还能设置定时执行相当于每晚自动回归早上来直接看结果。2.5 模块之间的关系理解了这个才好用很多新手容易问接口测试和测试计划是什么关系性能测试能不能独立用我建议你按这个逻辑理解接口测试、UI 测试、性能测试是“执行层”测试计划是“调度层和汇总层”。你可以不建测试计划单独跑接口用例但如果你想做完整回归最好建一个测试计划把各种类型的用例组织在一起。MeterSphere 还支持“环境”概念。同一个测试计划通过切换环境就能在测试环境、预发环境、生产环境之间跑同一组用例。这对“多环境部署、一套用例反复跑”的场景特别友好。环境变量还可以覆盖全局变量所以你在设计用例时尽量不要把 IP、端口、账号密码写死全部走变量引用。3. 从零开始安装部署实操3.1 部署模式选择和服务器规划MeterSphere 安装部署有两种主流方式在线安装Docker Compose和离线安装。如果你所在的公司是内网环境没法直接访问 Docker Hub那需要走离线安装包的方式。先说一下服务器硬件要求这里容易低估。MeterSphere 是微服务架构默认会启动一堆容器前端、后端 API、MySQL、Redis、MinIO、Kafka、ZooKeeper、JMeter 执行节点等等。所以最低配置 4 核 8G推荐 8 核 16G 以上尤其是你要跑性能测试的时候压测节点和应用服务争抢资源很容易导致结果不准确。我自己踩过的坑一开始在 2 核 4G 的机器上装启动后 MySQL、Redis、MinIO 这些基础组件就把内存吃光了登录页面都打不开。后来换到 8 核 16G才跑得比较顺畅。磁盘方面建议预留至少 50G 空间因为测试报告、日志、上传的 Jar 包和 JMeter 脚本都会占空间。MinIO 主要存附件和资源文件如果项目多这个空间会涨得很快。3.2 Docker Compose 在线安装详细步骤在线安装其实很简单官方文档里有提供一键安装脚本。我这里把关键步骤和需要注意的细节写清楚用 CentOS 7.9 举例第一步检查 Docker 和 Docker Compose 环境docker --version docker-compose --version如果是干净系统先装 Docker。这里有一个建议不要用 CentOS 自带的旧版 Docker直接通过阿里云镜像源安装最新的社区版不然后续容器启动容易出兼容性问题。第二步下载安装脚本并执行curl -sSL https://github.com/metersphere/metersphere/releases/download/v2.10.9/metersphere-online-installer-2.10.9.tar.gz -o metersphere.tar.gz tar -zxvf metersphere.tar.gz cd metersphere-online-installer-2.10.9安装包里有install.sh执行前先看一下install.conf文件里面可以配置安装路径、服务端口、数据库密码等。第三步执行安装./install.sh安装过程会拉取镜像、初始化数据库、创建容器。我实测下来如果网络正常大概 10 到 15 分钟能完成。如果卡在拉取镜像那一步多半是网络问题这时候可以考虑配置 Docker 镜像加速器。第四步验证安装结果docker ps | grep metersphere正常情况下能看到metersphere-server、metersphere-frontend、mysql、redis、minio、kafka等容器在运行。然后浏览器访问http://你的服务器IP:8081默认管理员账号是admin初始密码metersphere。注意第一次登录后系统会强制要求修改管理员密码。修改前最好先记录下来不然忘了还得去数据库里重置比较麻烦。3.3 离线安装的关键点内网环境没法访问 Docker Hub 的话得用离线包。方法其实也简单在一台能上网的机器上用 Docker 的save命令把所有镜像导出成 tar 文件然后拷贝到内网服务器再用load命令导入。官方也提供了离线安装包体积较大我记得 v2.x 版本的离线包大概有 3-4 个 GB。下载后解压执行install.sh即可脚本会优先从本地 tar 包导入镜像。离线安装最容易出现的问题是两个一是没注意磁盘空间解压和导入镜像需要大量空间二是 Docker 版本太低导致部分镜像层无法导入。建议离线服务器的 Docker 版本不低于 20.10。3.4 部署后需要立即调整的几个配置安装完成能登录之后别急着开始建项目有几个配置项建议先改掉修改默认端口默认前端端口是 8081后端接口是 8082如果想用 80 端口对外提供服务可以改docker-compose.yml里的端口映射或者前面加一层 Nginx 做反向代理。配置邮箱服务在“系统设置-邮件设置”里配置 SMTP这样测试计划执行完可以自动发邮件通知。这是我最常用的功能每天早上来不用自己翻报告邮件直接把结果推给你。启用 LDAP/OAuth2 登录如果公司有统一认证体系可以在“系统设置-认证设置”里配置。不过要注意LDAP 配置错误可能导致你登录不进去建议先保留一个本地管理员账号做应急。4. 实际使用流程与核心环节实现4.1 项目、环境、全局变量的建模MeterSphere 的逻辑层级是工作空间 - 项目 - 环境 - 用例。第一次使用时建议先创建一个项目然后再创建环境。环境这个概念我的理解是它对应“部署环境”。比如你有测试、预发、生产三套环境每个环境有不同的 Base URL、数据库连接、账号密码。在环境配置里你还可以设置每个环境的全局变量。举个实际建模的例子配置项测试环境预发环境Base URLhttp://test-api.example.comhttp://staging-api.example.com全局变量usernametestuserstaginguser全局变量password123456123456然后在接口用例里请求地址直接写/api/loginHost 部分引用环境变量。这样同一套用例切换到预发环境跑只需要在测试计划里切换“测试环境”即可不需要改动用例。4.2 接口用例开发全流程演示我这里以一个“用户下单”接口为例演示从用例编写到执行的完整流程。订单接口的完整调用链是需要先登录拿 token然后创建订单再查询订单状态。Step 1创建登录接口用例请求方法POST请求路径/api/login请求体JSON{ username: {{username}}, password: {{password}} }后置脚本提取 token// 假设响应是 {code:0,data:{token:abc123}} const response JSON.parse(responseBody); if (response.code 0) { vars.put(token, response.data.token); }注意MeterSphere 的后置脚本语法和 JMeter 的 JSR223 一致用的是vars.put来写变量。Step 2创建下单接口用例请求方法POST请求路径/api/order请求头Authorization: Bearer {{token}}请求体JSON{ productId: 10001, quantity: 2 }这里有个很实用的技巧如果你不希望每次都真实下单可以在创建用例时把“执行方式”改成“调试”调试模式下会打印完整的请求和响应日志方便看参数透传是否正确。Step 3设置断言对下单接口加两条断言JSONPath 断言$.code等于0响应时长断言小于2000ms执行后如果断言失败平台会明确提示是哪一条断言挂了定位问题很方便。4.3 测试计划与定时任务配置测试计划配置非常简单创建一个测试计划选择要执行的用例或者场景设置执行策略。这里我想重点说定时任务。定时任务是 MeterSphere 一个很加分的功能它能让你把回归测试做成“无人值守”。我通常在测试环境配置一个每天凌晨 2 点执行的定时任务跑所有接口用例和 UI 场景第二天早上到公司第一件事就是看邮件报告。配置路径测试计划 - 创建/选择计划 - 更多操作 - 配置定时任务。定时任务支持 Cron 表达式。补充一个实用表达式每天凌晨 2 点0 0 2 * * ?每个工作日早上 7 点0 0 7 ? * MON-FRI每周一凌晨 3 点0 0 3 ? * MON配置时还有一个关键选项失败是否继续执行。如果某个用例挂了之后你希望后续用例继续跑收集更多的失败信息就选“继续”如果希望立即中断节省资源就选“停止”。我一般选择继续因为回归测试的目的就是全面发现问题。4.4 对接 Jenkins 与 CI 流水线MeterSphere 对接 CI 有几种方式最常用的是 Jenkins 插件和命令行工具msctl。我在实际项目中用的方式是 Jenkins 的“执行 Shell”。第一步下载 msctlwget https://github.com/metersphere/metersphere/releases/download/v2.10.9/msctl-linux-amd64.tar.gz tar -zxvf msctl-linux-amd64.tar.gz chmod x msctl第二步在 MeterSphere 里生成 API Key在“个人信息-API Keys”里创建一对 Access Key / Secret Key用于调用平台 API。第三步在 Jenkins 流水线里调用./msctl auth login --username admin --password yourpassword --url http://metersphere.example.com:8081 ./msctl testplan run --project-id project_id --testplan-id testplan_id --mode ci如果不想用 msctl也可以直接用 curl 调用 REST APIcurl -X POST http://metersphere.example.com:8082/testplan/run \ -H Content-Type: application/json \ -d {testPlanId:xxxx,projectId:yyyy}CI 集成最好的实践是把接口回归测试放在构建之后的“冒烟测试”阶段一旦接口用例失败直接终止流水线不让代码进入部署环节。这样能在产品上线前拦截一大部分低级问题。5. 常见问题与排查技巧实录5.1 问题速查表我整理了这几个月实际使用中团队里问得最多的问题做成一个速查表现象可能原因解决方案登录页无法访问前端容器未启动或端口被占用docker ps检查容器状态docker logs metersphere-frontend看日志接口测试执行报“连接超时”环境配置里的 Base URL 写错或者网络不通先用 curl 测试目标地址检查环境变量引用是否正确接口用例断言一直失败断言表达式写错或字段值带空格用“调试”模式看实际响应内容再调整断言UI 测试回放失败元素定位表达式失效重新录制或手动检查元素定位优先用 id/name 定位性能测试报告中吞吐量为 0压力机节点没有连接或压测参数配置错误检查压力机节点状态查看 JMeter 执行日志测试计划执行后没有收到邮件SMTP 未配置或发信失败检查系统设置-邮件设置查看后端日志中的邮件报错定时任务没触发Cron 表达式写错或服务器时区不对检查服务器时区用date确认测试 Cron 表达式的正确性上传文件大小超限MinIO 或 Nginx 限制修改网关/上传配置的最大文件大小重启容器5.2 排查问题的通用方法论很多新手遇到问题就盲目搜文档效率很低。我的建议是掌握一套排查链路第一步看容器状态docker ps -a所有容器都应该是Up状态。如果你看到某个容器Exited先看它为什么退出docker logs --tail 200 容器名第二步看平台日志MeterSphere 后端日志一般在安装目录下的logs/文件夹或者进入容器查看docker logs --tail 500 metersphere-server日志里能看到具体的异常堆栈大部分问题都能在这里找到答案。第三步复现并查看“执行结果”在 MeterSphere 里执行用例报错时点击“执行结果”可以看到完整的请求和响应信息。如果这里没显示说明是平台本身执行异常这时才需要去看后端日志。5.3 独家避坑经验这里分享几个我在实际环境中总结出来的经验属于常规文档里不会强调但非常实用的细节第一MySQL 数据备份很重要。MeterSphere 的 MySQL 数据库存了所有用例、测试计划、报告数据。每次版本升级前一定要备份数据库。我用的是docker exec导出docker exec mysql容器名 sh -c exec mysqldump -uroot -p$MYSQL_ROOT_PASSWORD --databases metersphere metersphere_backup.sql第二解决 JMeter 脚本中自定义 Jar 包的依赖问题。如果性能测试要用自定义的 JMeter 插件或者 Jar 包可以把 Jar 包放到安装目录的lib/ext目录下然后重启 node-controller 容器。直接在界面上传 Jar 包在某些版本里需要重启才会加载容易造成“明明上传了却没生效”的困惑。第三注意 Windows 上的脚本语法兼容问题。MeterSphere 支持在前置/后置脚本里写 JavaScript基于 Nashorn但要注意JS 代码里的字符编码和换行符在 Windows 上编辑后复制到平台偶尔会出现乱码。建议在平台自带的在线编辑器里直接写不要从本地编辑器粘贴。第四性能测试尽量单独部署执行节点。在正式压测场景里应用服务和压测节点放一起会让压测结果失真。可以单独准备一台机器跑ms-node-controller通过“性能测试-压力机设置”里配置添加节点。这样不仅压测结果更准确还不会影响主平台的稳定性。6. 基于个人经验的落地建议MeterSphere 算是我用过的开源测试平台中比较均衡的一个。它的优点很明显一体化程度高、社区活跃、部署门槛不高、中文文档完善。但它也有值得注意的地方——比如 UI 测试相对接口测试来说成熟度稍弱大型性能压测时平台自身的资源消耗也不小。如果你正准备引入这个平台我有几个建议。建议从接口测试模块切入先把现有项目的接口用例迁进去。这个阶段只需要部署一套测试环境跑通“用例编写-测试计划-定时回归”的闭环。等接口层面稳定了再逐步引入 UI 测试和性能测试这样的节奏团队接受度高风险也小。团队协作方面建议在项目里按“模块”和“优先级”建立用例目录结构比如“用户模块-高优先级-登录”这样的一级目录。测试计划命名规范也提前约定好一般按“版本号测试类型日期”命名例如v2.3.0-接口回归-0803。别小看这些规范等到用例几百条、计划几十个的时候命名和目录混乱会让人很头疼。我用 MeterSphere 接手团队测试工作之后最大的体会是工具只是载体真正提高效率的是把测试流程理顺了。平台提供的“持续测试”理念本质上就是让测试从“发布前的人工阶段”变成“日常反复自动执行的质量门禁”。把接口回归、UI 冒烟、性能基准这些工作沉淀到平台上团队才能把更多精力放在探索性测试和复杂业务场景上。最后分享一个小技巧升级版本前一定要先看官方发布的 Release Notes。MeterSphere 的版本迭代比较快有些版本会调整数据库表结构跨大版本升级最好走官方的升级脚本不要直接覆盖部署。如果没把握就搭建一个升级验证环境先跑一遍再动生产环境。这个习惯能帮你省掉很多不必要的麻烦。
返回列表