测试用例躺在共享盘里,谁改过哪一条全靠聊天记录考古,这种状态我待过整整三年。后来团队迁到 Jira,缺陷归了位,用例却还留在 Excel,需求一改就没人说得清该重跑哪些。Xray就是补这个窟窿的——它是挂在 Jira 上的测试管理插件,把用例、前置条件、测试集、测试计划、执行记录全部变成 Jira 里的原生问题类型与结构化数据,让"需求—用例—执行—缺陷"这条链路第一次能被一条 JQL 串起来。这篇内容讲的是 Jira 生态里那个测试管理方向的 Xray,不是别的同名东西,别搞混了。我会从应用市场安装、项目级配置、用例资产化、计划与执行、覆盖率报表、自动化结果回传,一路讲到实际踩过的坑。适合已经用 Jira 管需求、但测试环节还在裸奔的测试同学和项目负责人,也适合刚接手测试平台建设的研发同学照着抄。
1. 先想清楚 Xray 在 Jira 生态里补的是哪块拼图
1.1 它到底把什么变成了"可查询的数据"
很多人第一次打开 Xray,看到一堆新问题类型就懵了,觉得不过是给 Jira 加了几张表。真正的价值不在界面上,而在于测试活动从"文档"变成了"数据"。在 Excel 时代,一条用例就是一行文本;在 Xray 里,一条用例是一个 Jira 问题(Test),它有自己的键值、负责人、标签、组件、关联需求、执行历史。这意味着你可以用 JQL 去查"某需求下所有标记为手动的、最近一次执行失败且没有被修复的用例"——这句话在 Excel 里没法用一条语句表达,在 Xray 里就是几行查询条件。
再往深一层看,Xray 把测试拆成了几个互相咬合的实体:Test 描述"要测什么",Pre-Condition 描述"测之前环境要满足什么",Test Set 是一批用例的逻辑归组,Test Plan 是一次测试活动的范围与策略,Test Execution 是一次具体执行的容器,Test Run 则是容器里每一条用例的单次结果。这套模型的精妙之处在于:用例是长期资产,执行是短期快照,两者分开存储,所以同一条用例可以挂在一百次执行记录下面,历史趋势才跑得出来。
1.2 三类团队收益差异很大
不是所有团队装上 Xray 都立刻见效。我的观察是收益差距非常大:
- 需求频繁变更的产品团队:收益最高。需求条目和用例之间建立关联之后,需求变更时可以直接看"受影响用例清单",回归范围不用靠人肉回忆。
- 有自动化流水线但结果散落的团队:收益次高。自动化报告统一回传到 Xray 之后,手工和自动的结果能放在同一张执行记录里看,覆盖率口径才统一。
- 纯粹为了应付审计、流程一年不变的团队:收益有限。这种情况下安装和培训成本可能几个月都收不回来,反而多了一套要维护的数据。
判断标准很简单:过去一个季度里,你们有没有出现过"上线后才发现某条老用例没跑"的情况?如果有三次以上,Xray 值得上。
1.3 与 Excel、独立测试平台的取舍
我把三条路线拉平对比如下,方便你做决策:
| 维度 | Excel / 共享文档 | 独立测试管理平台 | Xray(Jira 插件) |
|---|---|---|---|
| 需求关联 | 手工贴链接,易失效 | 需二次集成 | 原生问题链接,随需求走 |
| 缺陷闭环 | 手工复制粘贴 | 需配置同步 | 执行失败一键提 Bug 并回填结果 |
| 执行历史 | 一堆版本文件 | 有,但独立库 | 每次执行一条记录,可 JQL 查 |
| 权限与账号 | 靠文件夹权限 | 独立账号体系 | 复用 Jira 用户与权限方案 |
| 自动化结果 | 手工汇总 | 需定制对接 | 官方 REST API + 常见 CI 插件 |
| 主要短板 | 无结构、无追溯 | 双系统维护成本高 | 依赖 Jira 版本与许可档位 |
表格里最后一行的短板是真实存在的,选型时不要只看优点。如果团队本身对 Jira 依赖很浅,硬上 Xray 会变成"为了插件而用 Jira",得不偿失。
2. 安装与初始化:从应用市场装到第一个项目能跑通
2.1 版本与许可模式怎么选
Xray 在 Jira 应用市场里是按用户数分级收费的商业插件,通常提供试用期(默认 30 天,部分情况下可申请延长),试用期内功能是全开的,包括自动化导入与高级报表。我的建议是:别拿生产项目做试用,单独开一个测试项目,把真实的用例导入进去跑两周,再决定是否采购。
版本这块要注意 Jira 的部署形态。云端版和 Data Center 版的安装路径、配置项位置、API 的基础地址都不一样,很多网上抄来的教程在你环境里跑不通,就是因为混用了两种部署形态的截图。安装前先在「管理」里确认三件事:Jira 版本号、部署形态、当前登录账号是否有"管理应用"权限。这三条不满足,后面全是白折腾。
2.2 安装与项目启用的完整顺序
顺序错了会出现"装完了却找不到入口"的假象,这是我见过最多的第一次使用翻车点。正确顺序是:
- 用系统管理员账号进入应用管理页面,搜索 Xray 并安装,等待状态变成已启用。
- 安装完成后刷新页面,Xray 会为所有项目自动开启,但部分项目类型(尤其是自定义工作流较重的业务项目)需要手动检查问题类型是否被正确加入问题类型方案。
- 进入目标项目,打开项目设置,找到 Xray 相关配置区,确认测试相关的问题类型在该项目中可用。
- 给项目成员分配权限:普通测试人员至少需要浏览项目、创建问题、编辑问题、链接问题这四项;能改项目级配置的只有拥有"管理项目"权限的人。
- 用普通测试账号登录,尝试创建一条 Test 问题,成功即代表最小闭环打通。
注意:第 2 步里"问题类型方案"是最容易被忽略的环节。如果项目用的是自定义问题类型方案而没有把 Test、Test Execution 等类型加进去,界面上会出现菜单存在但无法创建的情况,看起来像权限问题,其实不是。
2.3 项目级设置里必须提前定的四件事
这四件事如果边用边改,后期迁移成本极高,建议在正式录入用例之前一次性定好:
第一件,测试类型(Test Types)。常见大类是手工、Gherkin、通用、自动化。测试类型决定了这条用例的字段结构和导入方式,后期改类型会导致步骤数据丢失,所以要一次想清楚。我一般只保留"手工"和"Gherkin"两类给业务测试用,"自动化"留给 CI 回传的结果,避免同事乱选。
第二件,测试步骤字段。默认的步骤结构是"操作 / 数据 / 预期结果"三列,如果需要记录前置数据准备脚本或断言表达式,就在项目设置里加自定义列。加的列越多,录入越慢,我的经验是不超过四列,超过就说明这条用例粒度太粗,应该拆。
第三件,测试环境(Test Environments)。这是最被低估的一块。环境值一旦在几百条执行记录里用了几种不同写法(比如"Chrome120"和"chrome 120"),后期按环境统计失败率就废了。建议提前把环境按"系统 + 分辨率 + 浏览器版本"的格式固定下来,例如"Windows11-Chrome124-1920x1080",谁都不许自由发挥。
第四件,测试状态(Test Statuses)。默认会有待办、执行中、通过、失败、中止这几个。要点是每个状态都有"是否为最终状态"的标记,这个标记直接决定覆盖率报表把哪些结果算作"已执行"。自定义状态可以加,比如"阻塞",但一定要想清楚它算不算最终状态,否则报表会和你的直觉打架。
2.4 装完当天就该做的验证清单
配置完别急着大规模导入,先花半小时做一次端到端验证,用下面这份清单对着走:
- 创建一条 Test,填两步步骤,保存成功。
- 创建一条 Test Execution,把刚才的 Test 加进去,执行一次并标记为通过。
- 打开该 Test 的关联面板,确认执行记录里能看到这次的 Test Run。
- 随便建一个需求类问题,用"关联测试"功能把 Test 挂上去,确认覆盖率面板有数。
- 从一次失败的 Test Run 里提一条缺陷,确认新建的缺陷自动带上了用例键值和执行链接。
- 用一条简单 JQL 查"项目 = xxx AND 类型 = Test",确认能列出刚才的用例。
这六条走完,你的环境才算是"能用"而不是"装上了"。
3. 用例资产化:Test、Pre-Condition、Test Set 的组织方式
3.1 Test 问题类型的字段结构
一条 Test 问题里,真正有用的字段就那么几个:摘要、测试类型、步骤、关联需求、标签、组件、优先级、负责人。摘要写什么非常关键——我见过太多团队写成"登录功能测试",一周之后就没人知道它到底测的是哪种登录。好的写法是"手机号+验证码登录-验证码错误三次锁定",一句话就包含了场景和核心断言。
步骤区是使用频率最高的区域,也是最容易录成废话的地方。判断一条步骤是否合格的土办法是:换一个没参与过这个需求的人按步骤执行,能不能得到同样的结论。如果做不到,说明步骤里混进了"隐含知识",要么补上去,要么承认这是探索性测试不该写进用例。
3.2 手工步骤与 Gherkin 的取舍
Gherkin 格式(Given / When / Then)看起来很美,但不是所有团队都适合。我的分界线是这样的:
| 场景 | 推荐格式 | 原因 |
|---|---|---|
| 业务流程长、参与人多的验收测试 | Gherkin | 业务方能读懂,评审效率高 |
| 界面细碎、数据依赖强的功能测试 | 手工步骤 | 写成 Gherkin 会变成嵌套从句地狱 |
| 准备接自动化的核心用例 | Gherkin | 后续转自动化脚本成本低 |
| 一次性探索性记录 | 手工步骤 | 不必过度设计 |
实际操作中,我见过最舒服的配置是两条腿走路:核心业务流用 Gherkin,界面细节用手工步骤,两者都能挂到同一个 Test Execution 里。不要试图统一成一种,那会让某一类用例的录入变成负担。
3.3 Test Repository 目录树与命名规范
Xray 的用例目录树是整个插件里最像"文件管理器"的部分,也是长期使用后最容易变垃圾场的部分。我的规范是三层,最多四层:业务域 → 功能模块 → 场景类型。例如"订单 / 下单 / 异常流"。
命名上,我强烈建议不要在目录名里写版本号和日期。目录是长期结构,版本信息应该用标签(Label)表达,比如给一批用例打上v2.3-回归。目录里塞版本号的结果就是第二年你有十七个叫"v1.x-下单"的文件夹,没法用也不想清理。
还有一个具体技巧:Test Set 和目录树别重复维护。目录树负责长期归类,Test Set 负责临时打包(比如"这次热修的十二条用例")。如果发现自己在目录树里按"某一批"来分文件夹,那批就应该做成 Test Set。
3.4 可复用步骤与参数化
当同一个操作步骤在几十条用例里重复出现时,复制粘贴会让维护成本爆炸——改一次登录流程要改四十条用例。Xray 支持在步骤库中维护可复用步骤,我的做法是:
- 把"进入后台并登录管理员账号""清空购物车"这类高频动作抽成复用步骤。
- 在具体用例里引用,而不是重新写一遍。
- 参数化的部分(账号、商品编号)放在步骤的数据列里,不要嵌在操作描述里。
实操中的一个坑是:复用步骤一旦被大量引用,修改前必须查引用范围。建议修改前用 JQL 或步骤库的引用视图确认影响面,否则一次"顺手优化"就能改乱几十条用例的执行预期。
4. 计划与执行:Test Plan、Test Execution、Test Run 的关系别搞反
4.1 三层结构各自解决什么问题
这是新手最容易糊掉的部分。我用一个类比说清楚:Test Plan 是"这次考试的科目和考场",Test Execution 是"某个考场的某一场考试",Test Run 是"某个考生某道题的得分"。
- Test Plan回答的是范围问题:这个版本要跑哪些用例、在哪些环境跑、谁负责。它上面可以挂多个 Test Execution。
- Test Execution回答的是记录问题:一次具体执行里,每条用例的结果、执行人、时间、缺陷。
- Test Run是执行记录里的最小单位,对应一条用例在某个环境下的一次结果。
搞反的典型症状是:所有用例直接挂在 Test Plan 上执行,结果一个版本要重跑三次的时候,历史结果全糊在一起,没有办法区分"第一次跑失败、修完之后第二次通过"。每次执行必须新建一个 Test Execution,这是纪律问题,不是技术问题。
4.2 用例的 Issue Status 与 Test Run Status 是两回事
这是我在团队里讲了无数遍的知识点。一条 Test 问题本身有 Jira 工作流状态,比如"草稿 / 待评审 / 可用 / 已废弃";而它每次执行又有一个执行结果状态,比如"通过 / 失败 / 中止"。
**前者描述用例本身的成熟度,后者描述本次执行的质量。**一条状态为"可用"的用例,某次执行结果完全可以是失败;一条结果通过的用例,也可能因为业务下线而被标记为"已废弃"。把这两者混起来用,会出现"用例失败了就把用例状态改成失败"这种操作,三个月后你的用例库全是被污染的状态,没法判断哪些用例还值得维护。
我建议在项目工作流里把这两个维度的命名刻意区分开,比如问题状态用"待完善 / 已评审 / 生效 / 已失效",执行状态用"通过 / 失败 / 阻塞 / 中止",从命名上就不给人混淆的机会。
4.3 失败后一键提缺陷与字段回填
Xray 最提效的功能之一是失败结果的缺陷联动。操作路径是:在一次执行里把某条用例标记为失败,系统会弹出创建缺陷的入口,新建的缺陷会自动带上执行记录链接、用例键值、当前环境。
为了让它更好用,建议提前做两件事:
- 在缺陷类型里加上"发现阶段""测试环境""关联执行"这类字段,并在创建界面里配置成必填或默认值。
- 让执行结果和缺陷状态做弱联动——比如缺陷关闭后提示"是否需要重跑该用例"。不要做成强制联动,否则开发批量关缺陷的时候会触发一堆无意义的执行记录。
提示:回填字段时最容易漏的是"实际结果"。很多团队把失败原因写在缺陷描述里,执行记录里却空着,导致后面做失败原因分析时,只能一条条点开缺陷看,报表根本没法聚合。
4.4 回归筛选的 JQL 套路
回归测试范围怎么定,是测试管理者每周都要面对的问题。用 JQL 可以搭出几条很实用的查询:
-- 某需求下所有生效状态的测试用例 project = "DEMO" AND issuetype = Test AND issue in linkedIssues("DEMO-123", "is tested by") AND status = 生效 -- 最近一轮执行中失败或阻塞的用例 project = "DEMO" AND issuetype = Test AND issue in testExecutionTests("DEMO-456", "FAILED") -- 标了高风险标签且三个月没被执行过的用例 project = "DEMO" AND issuetype = Test AND labels = "high-risk" AND issue not in testExecutionTests("*", "PASSED", "90d")第三条在实际环境下语法可能要按你的版本调整,思路是用"最近未执行"来反查过期用例。这条查询救过我一次——它在一次版本发布前找出了四十多条半年没跑过、但业务上仍然在用的老用例。
5. 覆盖率与自动化回传:报表读法 + CI 落地
5.1 覆盖率的三种口径,先对齐再谈数字
覆盖率这个词在 Xray 里有至少三种算法,团队内部不先说清楚,数字就会变成吵架的素材:
- 需求覆盖率:有多少需求条目关联了至少一条测试用例。它只回答"有没有人管",不回答"测得够不够"。
- 执行覆盖率:在某次 Test Execution 里,有多少条用例被执行了(有最终状态)。它回答"这一轮跑了多少"。
- 通过覆盖率:执行结果里通过的比例。它回答"这轮跑得怎么样"。
我见过最典型的误用是拿需求覆盖率当质量指标向上汇报,结果数字长期漂亮,线上照样出事。**需求覆盖率是工作完成的检查项,不是质量结论。**真正要盯的是执行覆盖率乘以通过覆盖率之后的综合情况,以及失败用例的缺陷闭环率。
5.2 REST API 导入自动化结果
自动化结果回传是 Xray 真正发挥价值的地方。核心思路是:CI 跑完测试,生成标准格式的结果文件(JUnit XML、Cucumber JSON 等),调用 Xray 的接口把结果导入成一条 Test Execution。
下面是一段可以直接改成你环境参数的命令行示例:
curl -X POST \ -H "Authorization: Bearer ${JIRA_TOKEN}" \ -F "file=@target/surefire-reports/junit.xml" \ "https://jira.your-domain.com/rest/raven/1.0/import/execution/junit?projectKey=DEMO&testExecKey=DEMO-456"几个关键参数说明:projectKey决定结果归到哪个项目;testExecKey指定已有执行记录时表示把结果合并进去,不传则自动新建一条执行记录;文件格式决定了 Xray 用哪套解析规则,格式和接口路径必须匹配,用 JUnit 文件打 Cucumber 的接口是最常见的 400 报错来源。
如果需要先批量创建用例再回传结果,可以走测试导入接口,字段结构通常是摘要、步骤、类型这几列,具体字段名以你版本的导入模板为准。建议先用官方模板导出一次空模板,按模板填数据,比自己猜列名快得多。
5.3 Jenkins 与 GitLab 里的最小可用集成
Jenkins 环境下,官方提供了对应插件,在流水线里加一个结果导入步骤即可,需要配置服务器地址、凭据、项目键值和结果文件路径。G