Postman Collection Runner 自动化接口测试实战
1. 从逐个点 Send到一键跑完整条链路Collection Runner 的真实定位我见过不少同事用 Postman 的方式还停留在打开一个请求、改参数、点 Send、看返回这个循环里。单接口调试这么干没问题但一旦遇到需要把登录拿 token → 下单 → 查订单状态串起来验证或者拿几十组测试数据去刷同一个接口的场景手工点就会点到怀疑人生。Collection Runner就是为这件事存在的它读一个集合按集合里的顺序把请求依次发出去边发边跑你写在 Tests 里的断言脚本最后一口气给你一张通过率、耗时、失败明细都齐全的结果表。说得再直白点它把一个 Collection 变成了可以批量执行的测试用例集。你平时写的那些断言脚本、变量提取逻辑在单发请求时只是顺手验一下到了 Runner 里才真正变成自动化资产。这也是很多人第一次接触 Postman 做自动化接口测试的入口——不用装额外框架不用写配置文件集合排好、数据备好、点一下 Run 就出结果。不过它的定位也要摆正Runner 是串行执行的执行器不是压测工具。它擅长的是功能回归、数据驱动校验、链路串联验证和冒烟测试不擅长高并发和性能压测。把这两件事分清楚后面的选型和参数设置才不会走偏。1.1 手工点 Send 最容易崩的三个时刻第一种是回归测试。后端改了一个字段的返回结构理论上要把相关的三十多个接口全跑一遍确认没被带崩手工点一遍至少半小时而且点到第二十个的时候人已经麻了容易漏看。第二种是数据驱动。同一个登录接口你要验证正确密码、错误密码、空密码、超长密码、特殊字符密码这五种情况每换一次参数就要重新改 body 再点一次 Send改到第三遍就会手抖改错地方。第三种是链路依赖。登录接口返回的 token 要填到下一个请求的 Header 里下单接口返回的 orderId 要填到查询接口的 URL 里。手工复制粘贴这些值不但费时间还特别容易粘错位置而且一旦中间某个接口挂了后面的值就全断了得从头再来。这三个场景本质上都是重复劳动 状态传递而 Runner 恰好把这两件事都接管了重复交给迭代次数和数据文件状态传递交给变量和脚本。1.2 执行模型迭代次数、数据集和请求总数之间的关系理解 Runner 的执行模型最核心的一条公式是实际发出的请求总数 集合内请求数 × 迭代次数比如一个集合里有 6 个请求迭代次数设成 5那这一轮跑下来总共会发 30 次请求每一次迭代都会从头到尾把 6 个请求按顺序走一遍。数据文件的加入会让这件事变得稍微绕一点。当你挂上一个 CSV 或 JSON 数据文件之后Postman 通常会把迭代次数自动同步成数据文件的行数在较新的版本里这个行为比较明显但迭代次数这一栏你仍然可以手动改。如果你把迭代次数改得比数据行数大数据会从头循环取用——也就是说第 6 次迭代会重新用第 1 行的数据。反过来改小后面的数据行就用不到。这个行为在两处特别关键一是你想用小数据集多跑几轮来观察接口稳定性二是你数据文件里有十几行但只想先跑前 3 行做验证。搞不清这个对应关系很容易出现我明明准备了 10 行数据怎么只跑了 3 组或者怎么第 4 组的参数跟第 1 组一模一样这类困惑。1.3 哪些活适合交给它哪些别硬塞场景是否适合 Runner原因接口功能回归几十个接口跑一遍适合串行执行结果统计清晰数据驱动参数校验同一接口多组数据适合数据文件 动态断言天然匹配业务流程串联登录到下单到查询适合变量提取回传即可上线前冒烟检查适合一条命令或一次点击出结论高并发压力测试不适合Runner 本身是顺序执行没有并发模型复杂逻辑分支、循环嵌套勉强可用脚本能实现但维护成本陡增大文件流式传输验证不适合结果面板会把响应存内存容易爆这里有个经验如果你的需求已经复杂到要根据上一个接口返回的不同分支走不同请求那基本已经不是 Runner 的舒适区了该考虑用代码化的测试框架。Runner 的价值在于简单、直观、零门槛把简单的事做到极致而不是硬扛所有场景。2. 跑之前先把地基铺好集合结构、变量分层与脚本分工很多人第一次用 Runner 的结果是一堆红叉然后开始怀疑是不是工具坏了。绝大多数时候问题不在工具而在于集合本身没整理好、变量作用域没理清、脚本写得不是地方。Runner 只是执行器它会忠实地暴露你集合里的所有问题。2.1 目录和请求的排列顺序就是执行顺序Postman 执行集合时是按集合树的顺序来的从最上面往下走遇到文件夹就先钻进去把里面的请求跑完再回到外层继续。这个深度优先的规则听起来简单实际用起来非常容易踩坑你把获取订单列表放在外层把创建订单放在一个子文件夹里执行顺序就完全不是你以为的那样了。我的习惯是按照业务流程建文件夹比如01-认证、02-订单、03-支付、04-查询数字前缀强迫自己保持顺序清晰。拖动排列在 Postman 里是生效的改完顺序记得再看一眼左侧树的实际样子。文件夹本身还能写描述把这个文件夹依赖 01 返回的 token这种前提写在描述里团队里其他人接手时能省很多沟通成本——这个小习惯比任何文档都实在。另外如果集合里有明显的这条请求必须先跑的依赖不要指望靠命名约定让别人记住直接在请求的 Pre-request Script 里写一句防御性校验比如检查 token 变量是否存在不存在就pm.expect.fail()或者抛错。让集合自己会说话比口头交接靠谱得多。2.2 变量分层搞不清优先级就永远在猜这个值哪来的Postman 的变量作用域是分级覆盖的这一点必须刻进脑子里因为你引用{{token}}的时候Postman 是按优先级去逐层找的找到第一个就用不会告诉你它用了哪一层。作用域设置方式优先级典型用途全局变量 Global集合列表里单独维护最低全团队共用的常量慎用集合变量 Collection集合右键 Edit次低整个集合内部的共享变量如 token环境变量 Environment右上角环境切换器中不同环境的域名、账号数据文件 DataCSV/JSON 文件较高每次迭代变化的参数局部变量 Localpm.variables.set()最高单次请求内的临时值优先级从低到高依次是全局 集合 环境 数据文件 局部。这个顺序直接决定了很多诡异现象的解释。比如你在环境变量里定义了usernamealice又在数据文件里写了usernamebob请求里发出去的会是bob因为数据文件优先级更高。还有个更隐蔽的点pm.variables.set()写进去的是局部变量它的生命周期非常短基本只在这一条请求的执行过程中有效。很多人在 Tests 里用pm.variables.set(token, xxx)存 token然后下一个请求死活取不到就是栽在这里。要跨请求传值老老实实用pm.collectionVariables.set()或者pm.environment.set()。2.3 Pre-request Script 和 Tests 的分工别搞反这两个标签页经常有人随手混用其实分工很清楚Pre-request Script 负责发之前准备Tests 负责收到之后判定和存值。发之前要做的事情包括生成时间戳、计算签名、拼装随机的手机号或订单号、设置动态 Header。这些逻辑写在 Pre-request 里发请求时自然生效。收到之后要做的事情包括断言状态码和业务码、比较返回字段、从响应体里抠出需要往下传的值存到变量。混用的代价是排查难度翻倍。如果你把断言写在 Pre-request 里它在请求发出之前就执行了你根本没拿到响应断言必然失败。反过来把数据准备写在 Tests 里那这次的请求参数还是上一轮的旧值。位置错了逻辑再对也没用。2.4 用环境区分 dev、test 和预发换环境只需要动右上角的下拉框而不是去每个请求里改域名这是环境变量最大的价值。我的做法是每个环境一份独立的 Environment 文件里面至少放三类变量baseUrl域名前缀、username和password测试账号、以及几个跟环境强相关的开关比如mockEnabled。请求 URL 全部写成{{baseUrl}}/api/order/list这种形式永远不出现硬编码域名。这样切环境的时候 Runner 只需要选一下 Environment 就完成迁移不用碰集合里的任何一条请求。这一步看起来是小事但在做持续集成的时候它是能不能把同一份集合复用到多个环境的决定性因素。3. 实操演示用数据文件驱动一批接口跑通铺垫讲完进入实操。这一节我按准备数据 → 配置 Runner → 读结果的完整路径走一遍中间会穿插几个我实际踩过的点。3.1 数据文件的字段规范CSV 和 JSON 各有讲究以登录接口为例CSV 数据长这样username,password,expectCode,caseName alice,Passw0rd1,200,正常登录 bob,Passw0rd2,200,备用账号登录 carol,wrongpass,401,错误密码 ,Passw0rd3,400,用户名为空对应的 JSON 版本是这样[ {username: alice, password: Passw0rd1, expectCode: 200, caseName: 正常登录}, {username: carol, password: wrongpass, expectCode: 401, caseName: 错误密码} ]几个硬性要求必须说清楚。第一CSV 文件保存成UTF-8 无 BOM编码用 Excel 直接另存为 CSV 默认可能是 GBK中文进去就是乱码断言里再引用中文字段就全崩了。第二字段值里如果本身含逗号必须用双引号把整个字段包起来否则列会错位——这类问题最恶心的地方在于它不会报错只是数据悄悄错位。第三JSON 文件顶层必须是数组不能是单个对象写成对象会直接读不进去。第四点是我自己的习惯数据文件里加一列caseName纯做标识用。跑完之后出报告一眼就能看出是哪条用例挂了比盯着iteration 7这种编号去反查数据行高效太多。3.2 在请求里引用数据字段数据文件挂载之后每个字段都变成了一个变量用{{字段名}}引用即可URL、Headers、Body、Pre-request 脚本里都能用。Body 如果是 raw JSON写出来是这样{ username: {{username}}, password: {{password}} }这里有个细节值得注意Body 里的{{username}}是字符串替换Postman 会把变量值原样塞进去。如果你的数据里有个数字类型的字段想让它以数字形式出现在 JSON 里不带引号那就在数据文件里别加引号、也别在 Body 里加引号。CSV 里的值本质都是字符串Postman 替换进去之后是跟着 Body 里有没有引号走的这个行为在拼装数字字段时要特别注意。另外URL 里也能用变量比如{{baseUrl}}/api/user/{{userId}}。但 URL 路径参数对特殊字符敏感如果数据里有空格、斜杠、中文记得用encodeURIComponent在 Pre-request 里编码一下或者干脆把这类参数放到 query string 里。3.3 Runner 面板上的每一项逐个说清楚打开集合右键 Run弹出配置面板。这里每一项的含义和取舍直接决定跑得顺不顺。配置项含义建议Collection / Folder跑整个集合还是只跑某个文件夹调试阶段先跑单文件夹快很多Environment使用哪个环境变量文件千万别空着空着就是一堆变量未定义Iterations迭代次数挂了数据文件后会自动同步成行数可手动调Delay每个请求之间的间隔毫秒生产或测试环境接口有限流时必设Data数据文件CSV/JSON文件路径别用相对路径选绝对路径最稳Save responses是否保存每个响应体只在排查时开全开容易卡死界面Keep variable values运行时变量是否回写持久化谨慎开会造成下一轮变量污染Log responses响应日志级别全部/仅失败平时选仅失败出问题再打开全部Delay 这一项特别值得强调。批量跑接口最容易触发的不是断言失败而是服务端限流。你本地手工点的时候一次一个请求间隔好几秒当然没事Runner 一秒钟能发十几个请求出去中间件那边直接给你返回 429然后一堆和业务无关的断言挂了。设个 200 到 500 毫秒的 Delay很多玄学失败就消失了。Keep variable values 是另一把双刃剑。打开它Runner 跑完后变量值会保留在环境里下次单发请求还能用看起来很方便。但它同时意味着上一轮迭代里设置的变量会被下一轮继承如果某轮断言把 token 覆盖成了错误值后面全挂。我的建议是默认关掉需要复用的场景单独处理。Save responses 只在排错的时候开。开着的状态下每一轮的完整响应体都留在内存和结果面板里跑几百个请求基本就是卡死。真要留存响应用 Export Results 导出 JSON 更靠谱。3.4 结果面板到底该看哪几行跑完之后的结果面板分三块。最上面是通过/失败的统计条看一眼通过率就能判断这轮是不是整体健康。中间是每个请求的运行明细包括耗时、状态码、断言条数可以展开看逐条断言的结果。最值得关注的是失败项里的断言差异信息。Postman 会把期望值和实际值都打出来比如expected 200 to equal 401这种一眼就知道是数据文件里的期望值和实际返回不匹配还是接口真的出问题了。另外面板上有个 Compare 之类的对比视图不同版本命名略有差异可以横向比较不同迭代对同一个请求的响应差异验证同一接口在不同参数下返回是否按预期变化时特别有用。至于更细的调试信息直接开 Postman Console菜单里 View → Show Postman Console看console.log输出比在面板里点开一个个响应体快得多。3.5 把运行结果导出来做二次分析结果面板右上角通常有 Export Results 之类的入口能把整轮运行导出成一个 JSON 文件。里面包含每个请求的 URL、请求头、请求体、响应状态码、响应体、每条断言的 name 和结果。这个文件的价值在于后续处理。比如你想统计哪个接口平均耗时最高或者哪几条用例最近三次跑都在失败拿这个 JSON 写个脚本跑一下就有结论了。我一般把导出的结果按日期命名归档接口频繁变动的那段时间靠历史结果对比定位新引入的问题非常高效。4. 让批量运行产生判断力断言、提取与变量回传如果只是把请求批量发出去、不管返回对不对那 Runner 和写个循环脚本没什么区别。它真正变成测试工具的分水岭是断言和变量传递这两件事。4.1 从响应体里抠字段传给下一个请求最常见的链路是登录拿 token。在登录请求的 Tests 里写// 先确认接口本身是通的 pm.test(登录接口返回 200, function () { pm.response.to.have.status(200); }); const body pm.response.json(); pm.test(业务码为 0, function () { pm.expect(body.code).to.eql(0); }); // 提取 token 存到集合变量后面的请求才能用 pm.collectionVariables.set(token, body.data.token);然后在下一个请求的 Headers 里加一条Authorization: Bearer {{token}}链路就接上了。这里有几个必须注意的点。第一pm.response.json()在响应不是合法 JSON 时会抛异常导致后面所有断言都跑不起来所以在不确定响应格式时先用pm.response.text()看看原始内容。第二提取路径要写对body.data.token里的每一层都要真实存在中间某一层是 null 的话会直接报错。稳妥的写法是先判断再取const token body body.data body.data.token; pm.test(成功拿到 token, function () { pm.expect(token).to.be.a(string).and.not.empty; }); if (token) { pm.collectionVariables.set(token, token); }第三存哪里要想清楚。集合变量适合这个集合内部共享环境变量适合跨集合、跨环境共享全局变量最不推荐因为它会污染同一台机器上的所有集合和请求调试时会莫名其妙读到一个不知道从哪来的旧值。4.2 断言写法从状态码到响应时间断言的作用是把人眼判断变成机器判断写的时候要尽量具体避免只要不是 500 就算过这种宽泛判定。几类常用断言如下// HTTP 状态码 pm.test(状态码为 200, () pm.response.to.have.status(200)); // 响应时间 pm.test(响应时间小于 800ms, () { pm.expect(pm.response.responseTime).to.be.below(800); }); // 字段存在性与类型 pm.test(返回列表是数组且非空, () { const list pm.response.json().data.list; pm.expect(list).to.be.an(array).that.is.not.empty; }); // 字段值精确匹配 pm.test(订单状态为已支付, () { pm.expect(pm.response.json().data.status).to.eql(PAID); });响应时间的断言在批量运行时特别有价值。串行跑几十个接口总耗时数据很直观给每个核心接口加一条时间断言就能在接口变慢的早期发现苗头而不是等用户投诉。4.3 按数据文件里的期望值做动态断言这是数据驱动测试的核心技巧。数据文件里有一列expectCode断言就不要写死成 200而是从当前迭代的数据里读const row pm.iterationData.toObject(); pm.test([ row.caseName ] 状态码符合预期, function () { pm.response.to.have.status(Number(row.expectCode)); });pm.iterationData.toObject()拿到的是当前这一轮迭代对应的整行数据这样同一段断言脚本就能覆盖成功、失败、参数缺失等各种情况数据文件里多写一行就多一条测试用例扩展成本几乎为零。一个常见坑是类型不匹配。CSV 里读出来的值全是字符串row.expectCode是200而不是200直接拿去比对状态码就会一直失败。所以上面那段里用Number()转一下或者在数据文件里就把这列当纯标识、在脚本里自己映射。JSON 数据文件不会有这个问题数字会保持数字类型这也是我更偏爱 JSON 数据文件的原因之一。4.4 断言挂了怎么快速定位我排查的顺序固定是这三步。第一步看 Console。在 Tests 里加console.log(pm.response.text())把原始响应打出来。很多断言失败其实是接口实际返回了你没预料的内容看一眼原始文本立刻明白。注意打console.log的时候别把整个大响应打出来几千行的 JSON 会把 Console 淹掉截取关键字段就好。第二步核对变量实际值。在 Pre-request 里加console.log(token , pm.collectionVariables.get(token))确认传出去的确实是你以为的那个值。链路测试里十次失败有七次是变量没传对。第三步区分真失败和误报。常见误报包括把200和200做严格比较用pm.response.json()去解析一个纯文本响应数组对比用了引用相等而不是深比较中文响应体读取时编码不对导致字符串匹配不上。把这几类排掉剩下的基本就是真问题了。5. 脱离界面批量跑newman 与流水线集成界面上的 Runner 适合个人调试和短期验证但如果要把这套东西跑在服务器上、跑在每天定时任务里、跑在代码提交之后的流水线里就需要命令行工具接手。Postman 官方提供的命令行执行器是newman。5.1 导出三样东西从 Postman 里导出集合Export → Collection v2.1 格式的 JSON、环境Export Environment、数据文件你自己准备的 CSV/JSON。把这三份文件放在同一个目录下命名清晰一点比如order-api.postman_collection.json、test.postman_environment.json、login-cases.csv。有个细节要提醒导出的集合里不包含你的本地临时变量也不包含留在界面内存里没写回的那些值。所以如果集合依赖某些变量一定要确保它们定义在环境或集合变量里并且已经导出。这个坑的典型表现是界面上跑得好好的导出来用 newman 一跑满屏变量未定义。5.2 newman 的安装与基础命令npm install -g newman装完之后一条基本命令长这样newman run order-api.postman_collection.json \ -e test.postman_environment.json \ -d login-cases.csv \ -n 3 \ --delay-request 300 \ --timeout-request 10000参数逐个说-e指定环境文件-g是指定全局变量文件-d挂数据文件-n是迭代次数--delay-request控制每个请求之间的间隔毫秒数跟界面上的 Delay 是一个作用--timeout-request设置单请求超时。还有两个高频参数值得记住--folder 02-订单只执行指定的文件夹适合在只改了某个模块时做局部回归--bail让第一次断言失败就停止执行适合放在冒烟检查里早失败早报警。5.3 生成可视报告和退出码命令行默认输出的是文本摘要团队协作最好再加一份 HTML 报告npm install -g newman-reporter-htmlextra newman run order-api.postman_collection.json \ -e test.postman_environment.json \ -d login-cases.csv \ -r cli,htmlextra \ --reporter-htmlextra-export ./reports/run-report.html报告文件归档之后出问题的时候点开就能看到每个请求的完整信息比让人在终端里翻日志友好得多。退出码这个机制是接流水线的关键newman 在存在断言失败时返回非零退出码。也就是说你在流水线里执行完这条命令只要退出码不是 0后面部署的步骤就不会执行——一道天然的质量门禁就建好了不需要额外写判断逻辑。5.4 接进流水线必须注意的几件事域名不要写死成 localhost。流水线里跑的环境通常跟本地不一样环境文件里的baseUrl要能通过参数覆盖或者由流水线注入。稳妥的做法是环境文件里只留占位符真实值通过 CI 的密钥管理注入进去。敏感数据不要提交到代码仓库。测试账号密码、token 这类东西放在数据文件里再提交上去等于公开了。用流水线的变量机制在执行时替换或者临时生成一份环境文件跑完就删。加上超时和重试策略。网络抖动导致的偶发失败很常见对非关键接口可以在外层加一次重试但核心断言别用重试掩盖那等于自己骗自己。报告一定要归档。每次跑完把 HTML 报告和导出的结果 JSON 存起来出问题的时候能回溯也能看趋势。历史数据攒起来之后哪个接口最近变慢了这种问题不再是人肉记忆能解决的了。6. 批量运行里最常翻车的几个地方前面讲的都是怎么用这一节讲怎么不翻车。下面这些是我在实际项目里反复遇到的基本覆盖了九成以上的诡异问题。6.1 单独跑通进 Runner 就报变量未定义这是第一高频问题根因几乎永远是变量作用域。三种典型情况请求里引用的是环境变量但 Runner 面板里 Environment 那一栏空着变量是用pm.variables.set()写的局部变量出了这条请求就失效了变量名有大写字母或者中划线的差异{{UserId}}和{{userId}}在 Postman 里是两个不同的变量。排查手段就是在 Pre-request 里打一行console.log(当前可用变量:, JSON.stringify(pm.variables.toObject()));哪些变量能读到、值是啥一清二楚。跑链路的集合里我基本会在第一个请求的 Pre-request 里就加这行平时注释掉出问题取消注释比猜快得多。6.2 迭代之间的数据污染前面提过 Keep variable values 这个开关它的副作用在链路测试里会被放大。第 1 轮登录拿到正确 token第 2 轮里登录请求因为数据是错的密码而失败token 变量没被覆盖但仍然保留着第 1 轮的旧值于是后续所有依赖 token 的请求全部假装成功通过——你拿到一份绿色报告实际上什么都没验证到。我的处理方式是每轮迭代开始时清理关键变量写在第一条请求的 Pre-request 里pm.collectionVariables.unset(token); pm.collectionVariables.unset(lastOrderId);另一个污染源是全局变量。全局变量的生命周期是跟机器走的跨集合、跨运行都还在。除非真的需要全机共享否则不要用。我在一个项目里遇到过本地一直通过、同事那里一直失败的问题查了半天发现是两个人在同一台共享机器上用 Postman 跑不同的集合全局变量互相覆盖了这种问题排查起来真的要命。6.3 数据文件的编码、空值和特殊字符编码问题排第一。UTF-8 无 BOM 是唯一推荐的选择。Excel 直接另存为 CSV 在很多环境下默认是本地编码中文进去就乱码然后就出现断言里比中文一直不相等。判断方法很简单用文本编辑器打开数据文件中文是不是能正常显示一眼就知道。空值问题排第二。CSV 里的空单元格读出来是空字符串不是 null也不是 undefined。如果你在断言里判断pm.expect(value).to.be.undefined就会失败。要判断空值用pm.expect(value).to.eql()或者统一在 Pre-request 里做一次转换。特殊字符排第三。含逗号的字段用双引号包起来含双引号的字段用两个双引号转义字段前后有空格的话要注意是不是真的需要CSV 不会自动 trim。这些规则和标准 CSV 一致但用 Excel 编辑时它有时候会自动处理、有时候不会比较玄学所以关键数据文件我建议直接用文本编辑器写别用表格软件。6.4 限流、超时和一个请求拖垮整轮批量跑必然遇到的现实问题是服务端限流。判定特征很明显大量 429 或者 503而且失败位置没有规律重跑一次可能就过了。对策有三层。第一层加 Delay从 300 毫秒起试接口压力大就往上加。第二层减少无谓的请求数比如把只验证返回结构的接口从每轮都跑改成第一轮跑一次就够。第三层给流水线里的运行设置合理的超时别让某个卡死的请求把整次执行拖到几十分钟那样反馈链就断了。超时设置本身也要注意--timeout-request设得太短慢接口会被误判成失败太长真正的卡死又发现不了。我的经验值是按核心接口平时响应时间的 5 到 8 倍来设先看正常耗时再定阈值。6.5 文件上传和二进制请求的特殊处理集合里如果有form-data类型的文件上传请求批量化会遇到一个额外问题文件路径。界面上你可以手动选文件但数据驱动的场景下要把文件路径当成一个字段放进数据文件里然后在请求的文件字段里引用{{filePath}}路径写绝对路径最稳。这类请求我更推荐直接用 newman 跑到命令行里路径问题更容易控制也避免界面在选择文件状态上的各种意外。而且上传请求通常报文比较大、响应也大界面 Runner 开着 Save responses 很容易卡命令行下没有这个顾虑。6.6 依赖顺序被打乱之后的排查集合一旦大了文件夹嵌套多了执行顺序很容易和直觉不一致。典型症状是某条请求用到了一个还没生成的变量。排查顺序是这样先在结果面板里看请求的实际执行顺序跟预期对一遍然后检查有依赖关系的请求是不是被分散到了不同文件夹最后确认没有跨文件夹的隐式依赖。我的原则是强依赖的请求必须放在同一个文件夹里按拖动顺序紧挨着排跨文件夹只用共享的常量类变量不用运行时产生的值。这条规矩一旦立住顺序类问题基本就绝迹了。把一套常用的核心链路固化成一个冒烟集合配上数据文件每天上班先跑一轮或者用定时任务跑一轮出问题第一时间就知道。这套东西搭起来可能也就一两个小时但它省下来的时间是按天累计的。我自己的感受是Collection Runner 这类工具的价值不在于功能多强大而在于它把验证这件事的启动成本压到了几乎为零人一旦觉得验证不费劲就真的会去验证而这才是一切质量提升的起点。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →