做测试开发这些年,我最大的一个感受是:真正拉开效率差距的,往往不是那些 heavyweight 的平台系统,而是一堆随手能拿起来就用的“小工具”。不管是接口调试、UI自动化脚本生成、还是测试数据准备,工具选对了,事半功倍;选错了,光“填坑”就能耗掉你半天时间。
这个标题看起来像是在列一个清单,但我想写的不是那种“收藏即学会”的网址合集。我想结合自己实际用过的、踩过坑的、目前还在团队里稳定跑着的工具资源,聊聊它们各自解决什么问题、为什么选它、以及和现在很热的 AI 测试开发、Playwright、基于 LangChain 做自动化脚本生成这些方向怎么结合起来。毕竟工具这东西,只有放进真实的工作流里,才能看出价值。
1. 工具选型背后的整体思路
1.1 不是越全越好,是按场景组合
很多刚入行的测试朋友喜欢下载“XX大全集”,几百个工具塞进收藏夹,真到用的时候反而不知道选哪个。我自己后来定了一个原则:测试工具没有最好的,只有最匹配当前场景的。比如接口调试,Postman 当然经典,但如果团队接口文档、Mock、用例管理都要做,Apifox 这类一体化工具就更合适;如果只是临时在服务器上排查一个问题,curl 加 jq 反而比打开一个 GUI 工具更高效。
工具应该分成几个层次来看待。第一层是日常高频操作,像接口请求、数据构造、断言比较,这一层工具要“快手”,打开就能用,不能有太多配置负担。第二层是自动化脚本和框架,包括UI自动化和接口自动化,这一层要思考维护成本、稳定性、和CI/CD的集成难度。第三层是提效辅助类,比如造数工具、日志分析、代码生成,这类工具往往不起眼,但用好了能把重复劳动砍掉一大半。
还有一个容易被忽略的点:工具的演进速度。两三年前大家还在纠结 Selenium 和 Cypress 哪个好,现在 Playwright 几乎成了新项目的默认选择;再加上 AI 辅助测试的风向起来,用大模型读测试用例生成自动化脚本已经不是实验室里的概念,而是有人真的在这么干了。所以我在选型的时候会留一个心眼:这个工具生态是否活跃、有没有被替代的风险、社区有没有人在持续贡献。
1.2 从项目标题看测试开发的核心需求
“开发测试人员常用的小工具资源”这个标题,看起来只是要一份工具清单,但拆开来看,背后实际上对应着测试开发工作中的几类核心需求。
第一类是接口与协议层面的工作。不管功能测试还是自动化测试,接口测试都是地基。工具要能帮你快速发请求、改参数、看响应,最好还能生成一份能放进报告里的数据。第二类是 UI 自动化脚本的生产效率。传统录制回放早就被淘汰了,现在大家要的是“写尽量少的代码,生成尽量稳的脚本”,这也是 Playwright 这类工具兴起的原因,它的自动等待和反脆弱选择器设计,让脚本稳定性提升了一个量级。第三类是测试数据与环境的准备。很多用例写好了,结果卡在没数据、数据脏、环境部署慢这些事上,恰恰是这些“杂活”最消耗耐心,也最需要工具来兜底。
还有一类需求这两年变得特别明显:知识密集型工作的自动化。比如根据自然语言描述的测试用例生成脚本、自动分析失败日志、自动补断言。这正是 AI 测试开发的切入点。标题里的“小工具资源”如果只停留在传统的抓包工具、录制工具层面,就有点跟不上趟了。所以这篇文章也会花一定篇幅聊一聊 LangChain 和 Agent 在测试生成这条路上的尝试,给想往这个方向走的朋友一些真实参考。
1.3 为什么我偏爱“轻量 + 可组合”的工具
过去维护过一个重型的测试平台,什么都能做,但每次刚出一个新需求,平台改造的周期足够让人崩溃。后来我把很多工作拆开,用轻量工具+脚本的方式解决,效率反而上来了。我现在的偏好是:命令行能搞定的事,绝不开图形界面;脚本能组合的工具,绝不用笨重的平台。
比如接口测试,我经常在本地用 Python 脚本直接调接口,配合 pytest 做断言,跑完自动出报告。这个过程不需要打开任何 GUI 工具。而需要跟团队协作、共享接口文档的时候,再切到 Apifox 之类的平台。这种“命令行打底、平台协作”的组合思路,在面对复杂场景时会非常灵活。
可组合性的另一个好处是方便接入 CI。Jenkins、GitLab CI、GitHub Actions 里面跑的都是命令行工具和脚本。如果一个工具只能通过点击鼠标来使用,那它基本上和持续集成无缘。这个原则在选型时可以帮你排除掉一大批中看不中用的“玩具”。
2. 接口测试与 API 调试工具的核心细节
2.1 Apifox、Postman 和 curl/jq 的实战对比
接口测试工具是测试开发每天打交道最多的东西,没有之一。Postman 是老牌选手,功能全面、生态成熟,在社区里有海量的教程和分享。但它也有让团队头疼的地方:接口定义往往要单独在别的工具里维护,和用例是割裂的;Mock 服务也偏弱。Apifox 则把接口文档、调试、Mock、测试用例做进了一个平台,对于中小团队来说,一个工具就可以覆盖接口开发联调和自动化测试的全流程。
我在团队里推广 Apifox 之后,最大的感受是接口文档不再是“写出来供人看的”,而是“调通了自动同步的”。这减少了大量文档维护的隐性成本。
不过 GUI 工具也不是万能的。在服务器上排查线上接口问题的时候,没有图形界面给你用,这时候 curl 加 jq 就是救命稻草。curl 负责发请求,jq 负责把返回的 JSON 格式化、提取字段、做断言。我举一个实际场景:线上有个接口偶发返回慢,需要确认是不是某个响应头的问题。一条命令就能搞定:
curl -s -o /dev/null -w "HTTP_CODE:%{http_code} TIME_TOTAL:%{time_total}s\n" http://api.example.com/health这条命令会把状态码和总耗时打出来。配合循环脚本,就可以快速统计一段时间的成功率。这种排查速度是打开 Postman 然后手动点发送没法比的。
下面给它们划一个适用范围:
| 工具 | 适用场景 | 局限 |
|---|---|---|
| Apifox | 接口联调、文档同步、团队协作、接口自动化 | 较重,需要安装客户端,部分高级功能要付费 |
| Postman | 个人调试、快速验证接口逻辑 | 文档和用例割裂,协作能力一般 |
| curl + jq | 服务器排查、脚本集成、CI 环境、快速验证 | 需要记参数,有学习成本 |
2.2 接口 Mock 在并行开发中的作用
Mock 工具是我“小工具清单”里很容易被低估的一项。前后端并行开发时,后端接口还没好,前端和测试如果干等着,整个项目进度都会被拖慢。用 Mock 先返回一份符合接口文档的模拟数据,前端可以继续开发,测试可以提前写用例,联调放到最后统一进行,这是成熟团队提升并行效率的常规做法。
Apifox 内置了 Mock 服务,可以根据接口文档里的字段类型自动生成随机数据。但更灵活的做法是用 MirageJS 或者直接写一个简单的 JSON Server 来模拟。JSON Server 我特别喜欢,一句命令就能根据一个 JSON 文件起一个完整的 REST API 服务:
npx json-server --watch db.json --port 3000然后 db.json 里定义好资源,就自动拥有了增删改查接口。对于学习接口测试、演示自动化框架来说,这是零成本搭建测试环境的好办法。实际项目中,我还会在 JSON Server 的基础上用 Faker 造一批更真实的数据,避免测试数据都是清一色的“test001”这种一眼假的玩意儿。
Mock 做得好,还能解决一个头疼的问题:第三方依赖接口不稳定。比如你们接了一个支付网关,沙箱环境时好时坏,测试用例跑着跑着就挂。这种情况与其依赖第三方环境,不如在测试环境里 mock 掉支付网关,只验证自己系统的行为。稳定性和可控性立刻就上来了。
2.3 接口测试断言与数据提取的实用技巧
很多新手写接口测试断言,只会比对整个响应体是否一致。这样做不仅脆弱,而且一旦接口返回里多了个时间戳就误报,非常打击信心。我现在的习惯是:只对核心字段做断言,对返回结构做类型检查,对耗时做边界校验。
比如用 Python 的 requests 库写断言:
import requests resp = requests.post("http://localhost:3000/api/users", json={"name": "tom"}) assert resp.status_code == 201, f"状态码异常: {resp.status_code}" data = resp.json() assert data["id"] > 0, "返回的用户 id 应为正数" assert isinstance(data["name"], str), "name 字段应为字符串" assert resp.elapsed.total_seconds() < 1.0, f"接口耗时过长: {resp.elapsed.total_seconds()}s"这种断言方式的好处是,每条断言都是独立的检查点,失败时能立刻定位到是状态码问题、字段问题还是性能问题。而整段比对的话,你只知道“跟预期不一致”,至于哪里不一致还要慢慢排查。
数据提取也是接口测试里的高频需求。比如登录后拿到 token,后续接口要带着这个 token 访问。我一般会在 pytest 的 fixture 里统一处理,token 提取一次放 session 里,所有用例共享,而不是每个用例各自登录一遍。这样既省时间,代码也干净。
3. UI 自动化测试:从 Selenium 到 Playwright 的迁移体验
3.1 为什么 Playwright 正在成为新项目的默认选择
Playwright 这几年热度攀升非常快,尤其在 GitHub 的 star 增长和社区讨论量上都压过了老牌的 Selenium。我自己是从 Selenium 用到 Cypress 再转到 Playwright 的,谈一下直观感受。
Selenium 最大的问题是WebDriver 协议带来的不稳定感。你要手动管理浏览器的驱动版本,还要写一堆显式等待来应对页面加载的时序问题,用起来总觉得“脆”。Cypress 解决了部分问题,架构上也更现代,但它跑在浏览器内,多标签页切换、新开窗口这些场景支持得不顺手。Playwright 则通过 CDP(Chrome DevTools Protocol)直接控制浏览器,不需要额外的驱动服务,自动等待也内置在几乎所有 API 里,这让脚本的稳定性上了一个大台阶。
还有一个杀手级特性:Playwright 的 Trace Viewer。每次测试失败,都会生成一个包含 DOM 快照、网络请求、控制台日志、页面截图的 trace 文件,你可以像看录像一样复盘整个执行过程。过去用 Selenium 排查失败,就是靠截图加日志猜;现在直接用 Playwright 打开 trace 看现场,定位效率完全不是一个量级。
3.2 脚本录制、自动等待与元素定位的实操细节
很多测试开发不喜欢“录制脚本”这个说法,因为早年 QTP 之流的录制工具给这个方向留下了不太好的印象。但 Playwright 的 Codegen 完全是另一回事。你可以在命令行跑一句playwright codegen,然后它会打开一个浏览器窗口,你在页面上操作,它就在旁边生成对应的脚本代码。这个功能用来写 E2E 冒烟用例、探索性测试脚本,或者在项目初期快速搭建页面对象模型,都很好使。
以 Python 为例,启动录制:
playwright codegen --target python -o test_login.py http://localhost:3000/login录完你会发现,生成的代码会自动使用 Playwright 的推荐定位策略,比如get_by_role、get_by_label,而这些其实是 Playwright 的核心优势——面向用户的可访问性定位,而不是脆弱的 CSS 路径。过去填一个表单,Selenium 里你会写driver.find_element_by_id("username"),稍不留神就是脆弱的深路径;Playwright 里通常写page.get_by_label("用户名"),即使前端重构了样式,只要可访问性标签在,用例依然稳。
自动等待这块我再多唠叨一句。Playwright 的所有操作默认会等待元素处于可交互状态,所以你不需要在每次点击前都来一个sleep(2)。但这不是让你完全不写等待,而是等待的方式变了:遇到特殊时序问题,优先用expect的轮询断言,或者page.wait_for_response配合接口返回来做同步。比无脑 sleep 优雅得多,也比 Selenium 的WebDriverWait省心。
3.3 并行执行与报告集成的经验教训
Playwright 的多浏览器并行执行能力也是我很看重的一点。它的 test runner 支持按 worker 数并行跑用例,并且每个 worker 都有自己的浏览器实例,不会互相干扰。我在团队里用 4 个 worker 跑 80 条冒烟用例,基本能在 3 分钟内跑完,这在以前用 Selenium 串行时代是不敢想的。
不过并行也带来一个问题:测试数据隔离。多个 worker 同时操作同一个测试环境,如果数据不隔离,用例之间会互相踩踏。我的做法是:不要让用例之间共享状态,每个用例都自己造数据,用完自己清理;实在要用的公共数据,用一个独立的“只读测试账号”做约束,只跑查询型断言,不跑写入型操作。
报告集成方面,Playwright 本身就带 HTML 报告。但为了让开发团队更容易接受,我会在 CI 里把报告上传到内部的一个静态服务,然后企业微信推一个链接出来。大家打开链接就能看到哪些用例挂了、失败截图在哪,不用登录 Jenkins 去翻控制台输出。这个体验优化比你想的更能提升自动化测试在团队里的口碑。
4. 测试数据的准备与新鲜度管理
4.1 Faker 造数、数据库脚本与数据工厂
测试数据的准备是测试开发里最“肥”的蓝海,也是最容易被忽视的。很多测试用例之所以不稳定,一半的原因都在数据上:环境里没这个数据、有数据但状态不对、上次跑挂了脏数据没清干净。
我常用的造数方案是分层的。最轻量的是 Faker,不管是 Python 的Faker库还是 Java 的JavaFaker,都可以一行生成姓名、手机号、身份证、地址、公司名等字段,几秒钟就能造出几百条“看起来是真的”的测试数据。比如:
from faker import Faker fake = Faker(locale="zh_CN") for _ in range(10): print(fake.name(), fake.phone_number(), fake.email())Faker 解决的是“数据长什么样”的问题,但解决不了“数据在系统里是什么状态”的问题。比如一笔“已支付”的订单,光靠 Faker 是造不出来的,因为它涉及订单状态机的流转。这时候我会写数据库脚本直接构造数据。在测试环境,用 SQL 往订单表里插一条记录,把状态直接置为已支付,再补上对应的支付流水。这比走 UI 一步一步操作快得多,而且每次都是确定性的,不依赖前端页面是否正常。
不过数据库直插也要谨慎。跨表的外键关系、必填字段的默认值、审计日志的触发,这些都有可能让直插的数据看起来对了但实际是脏的。所以我的习惯是:手工直插只用来准备基础数据;关键链路的数据准备优先通过接口去调,因为接口会把服务端的各种校验逻辑都走一遍,数据更真实。
4.2 数据清理策略:避免用例之间的“串味”
自动化用例跑多了,最常遇见的问题就是“串味”:A 用例创建了一条数据没清理,B 用例查询时把这条数据也列出来了,断言数量就对不上;更麻烦的是,B 用例又改了这条数据,A 用例如果后期还要用到它,就彻底找不到了。
清理策略上,我是这么处理的:
- 每条用例创建的数据,命名上加上用例编号或者随机后缀,比如
用户_autotest_001_8f3k。这样即使清理失败,也能快速定位到是哪个用例留下的。 - 用
finally块清理数据,保证断言失败时清理逻辑也执行。pytest 里用 fixture 的yield做 teardown,是标准做法。 - 定期跑一个“垃圾回收”脚本,把超时未清理的脏数据批量删掉。这个兜底机制让我省了很多心。
4.3 针对不同环境的造数策略
环境不同,造数策略也得跟着变。本地开发环境,数据随便造,删了也不心疼,可以多造一些边界值、异常数据,怎么折腾都行。测试环境,要兼顾数据真实性和隔离性,我一般会在用例开头调用接口创建数据,用例结束调用接口删除数据。预发环境,一般不能写入脏数据,所以策略是尽量挑选业务中的真实数据来跑只读用例。
预发环境还有一种玩法,就是通过数据库备份脱敏。从生产环境导出一份脱敏数据,导入预发环境,这样预发环境的数据分布和真实情况基本一致。不过脱敏要做得干净,手机号、身份证、银行卡信息这些敏感字段必须替换,不然就是安全事故。我在团队里专门写了一套脱敏脚本,跑完以后会人工抽查几条数据确认没有敏感信息泄露才放行。
5. AI 加持下的测试提效:基于 LangChain 的脚本生成实践
5.1 传统脚本生成方案的瓶颈在哪里
传统的 UI 自动化脚本生成,就是 Codegen 录制。录制的脚本问题是:它记录的是“我这次操作了什么”,而不是“这个功能的业务意图是什么”。所以录制出来的脚本换一个环境、换一组数据、页面稍微改一下结构,就很容易挂。
我一直在想,如果让模型理解测试用例里写的“用户使用正确用户名和密码登录,登录后页面右上角显示用户名”,然后直接生成一套符合页面实际结构的脚本,这样是不是比录制更高级?这就是现在很多团队在探索的AI 测试开发方向。
实现的基本思路是:把测试用例的自然语言描述,结合应用页面的 DOM 快照或者接口定义,一起交给大模型,让它输出自动化脚本。LangChain 在这个场景里承担的工作是:管理 Prompt、把用例文本解析成结构化指令、调用模型、解析模型输出的代码、把代码灌进测试框架。
5.2 LangChain 读取测试用例并生成脚本的技术拆解
这个方向我自己搭过一个小原型,流程大概是这样的。
先用 LangChain 的WebLoader从测试管理平台拉取测试用例,或者直接读取本地的 Markdown / Excel 用例文件。然后用一个专门的 Prompt 让模型输出标准 JSON,把用例拆解成步骤列表。这个步骤列表是中间产物,方便后续生成代码时对齐结构。Prompt 大致长这样:
from langchain_core.prompts import ChatPromptTemplate prompt = ChatPromptTemplate.from_messages([ ("system", "你是资深测试开发专家。请把下面的测试用例转换为步骤列表," "每一步包含:操作类型(open/click/fill/assert)、定位目标、操作值。" "只输出JSON数组。"), ("human", "用例:{case_text}"), ])拿到步骤列表以后,再把这些步骤拼进一个生成 Playwright 脚本的 Prompt。这一步的关键是让模型知道当前页面的真实定位信息,所以我会在运行时把页面的可访问性快照也塞进去,让模型参考真实的aria-label、role、name来生成选择器,而不是自己在那边凭空想象。
原型跑起来之后,基础场景的准确率是出乎我意料的高。登录、表单提交、列表查询这一类简单用例,生成的脚本基本可以直接跑通。但一遇到复杂业务流,比如多步骤表单、动态加载的弹窗、日期范围选择等,就还是需要人工去调。现在模型对于“什么时候等接口返回再下一步”这样的时序判断还不太行,经常生成一个没有显式等待的脚本,然后执行全看运气。
5.3 对 AI 生成脚本能力的理性预期与使用建议
我个人的判断是,AI 生成自动化脚本目前更适合用来做“快速草稿”和“批量转换存量用例”,不适合直接替代人工编写所有核心脚本。它可以帮你跨过空白的 Editor 和冷启动的恐惧,把 80 分的工作直接做完,剩下的 20 分靠测试开发的经验来打磨,效率仍然很可观。
实际的落地方式,我会这么建议:先在团队里选一个模块,手工写好一套“种子脚本”,让 AI 模仿这个风格去生成同一模块的其它用例脚本。这样模型有一个清晰的风格锚点,输出质量会稳定很多。同时要求所有 AI 生成的脚本必须过 code review,至少得有一个人读懂脚本在干什么、能指出断言写得合不合理。AI 生成的脚本一定不能盲信,它和传统代码一样需要评审和重构。
还有一点要提醒的是:别指望 AI 直接解决定位器不稳定这个老问题。如果页面本身没有可访问性标签,模型再聪明也生成不出稳定的选择器。所以在启动 AI 辅助测试前,先推进前端团队把可访问性这一课补上,这能让你后续所有工作都轻松一大截。
6. 组合成一条完整的工具链
看到这里,你可能觉得工具太多了,有点不知道从哪里下手。我再用自己团队的例子,把上面提到的这些工具按照实际工作流串成一条链子。
6.1 从用例到报告的完整链路设计
我们现在的流程是这样的:
- 用例管理:用 Apifox 做接口用例,操作记录和断言都写在用例里;UI 用例用 Playwright 的 TypeScript/Python 项目管理,目录结构按模块划分。
- 测试数据:接口用例需要的数据在 fixture 里通过 Faker 生成;状态类数据用接口创建,特殊状态用 SQL 直插兜底。
- 执行调度:本地用 pytest / Playwright test runner 直接跑;CI 里在 GitHub Actions 上配置定时任务,每天凌晨跑一次全量回归。部署后跑一次冒烟。
- 报告与通知:测试报告自动生成后,HTML 传到一个静态服务,关键失败信息通过企业微信机器人推给自己和对应开发。
- 问题定位:接口失败直接贴请求和响应;UI 失败打开 Playwright trace 看执行现场。
这条链路看起来不复杂,但它把“写用例 - 跑用例 - 报结果 - 查问题”的闭环打通了。每个环节都有工具支持,而且每一环都不是重型的自研平台,维护成本可控。
6.2 各规模团队的工具选型建议
工具选型真的要看团队规模。1-5 人的小团队,我建议只用 Apifox 加 Playwright,再加一个 GitHub Actions 就足够了,不要一上来就搞平台。工具越少,协作成本越低,跑起来的概率越高。5-20 人的中型团队,可以引入测试管理平台维护用例,加一个 Allure 报告服务集中展示结果,数据准备方面写一个公共的造数库供所有测试复用。20 人以上的团队,或者多个业务线并行,再考虑组件化测试平台,把接口测试、UI 测试、性能测试的产物统一纳管。
最怕的是什么?是团队只有三个人,却搭了一个需要五个人维护的“测试中台”。工具链的精髓是让每个环节都轻,而不是把每个环节都变重。
6.3 工具链的可持续演进:留好扩展位
一个大实话:测试工具链不是搭好就完事的,它要随着项目的技术栈和团队的发展持续演进。比如项目从 Web 应用扩展到小程序,你的 UI 自动化工具就需要增加小程序自动化能力;项目开始做性能优化,你的工具链里就需要加性能监控这一类工具;现在 AI 测试开发的工具还比较原始,但过半年一年可能就有更成熟的开源方案出现,你要保持敏感度去试用。
所以我建工具链时的一个原则是:留好扩展位。测试用例的格式尽量通用(比如 Markdown 或者标准 Excel 模板),执行器用开源框架而不是自研框架,报告格式遵循 JUnit XML 这种标准。这样以后不管哪一个环节换了工具,其他环节都不用动。保持这个原则,工具链的维护成本会低很多,也更容易跟上行业的变化。
7. 避坑指南与真实心得
7.1 我踩过的几个典型“工具坑”
工具用多了,坑也踩了不少,挑几个最典型的分享一下。
第一个坑是“工具绑架流程”。有一段时间我们为了让 API 测试用例的覆盖率好看,强行把一个不适合接口自动化的手工测试场景塞进接口测试平台,结果就是用例天天报错、维护的人骂娘,最后那批用例被废弃。工具应该服务于流程,而不是反过来。
第二个坑是 Mock 过度。Mock 能做很多事情,但如果把所有外部依赖都 mock 掉,测试环境就变成了一座“孤岛”,永远测不出集成问题。我的经验是:第三方依赖如果只是偶发不稳定,优先用重试机制;只有真正无法控制的依赖才做 mock,而且 mock 的环境要明显标识,避免大家以为测的是真实环境。
第三个坑是测试脚本里的“隐式时序依赖”。比如用例 A 创建的数据,用例 B 要等 5 秒才用。这种写法在单线程下能过,一旦并行就全线崩溃。我现在会在测试数据准备阶段就把“数据已就绪”确认好,而不是让脚本里 sleep。这是并行稳定性的根基。
7.2 学习路径与团队分享的实战建议
对于刚接触这些工具的朋友,我的建议是不要贪多,先攻一个组合:Apifox 过接口 + Playwright 过 UI + Faker 造数据。这三个工具分别覆盖接口、界面和数据三条主线,学完之后工作里 80% 的场景都能覆盖。先把它们用熟,再去研究 LangChain 这种 AI 辅助方向,你有扎实的基础功之后,拥抱新事物的速度会快很多。
在团队分享方面,我比较推荐“小步快跑”的方式,每个工具都组织一次 30 分钟内的实际操作演示。演示的内容不用高大上,真实项目里挑一个具体的痛点,比如“接口返回太慢怎么定位”、“登录用例怎么自动生成”,当场解决给同事们看。这种真实的 demo 比讲十页 PPT 都有说服力。
7.3 小工具背后的大原则
说来说去,工具终究是手段。真正提升测试效率的,是你对测试的理解、对业务的热爱、以及持续打磨自己工作流的习惯。一个顺手的小工具解决一个痛点,十几个顺手的小工具就是一条高效的生产线。每次遇到重复劳动,我都会先停下来想一想:能不能找个工具替代?能不能写个小脚本?这个习惯让我持续在效率上受益。
简单总结一下我目前在用的核心工具资源列表:接口层是 Apifox、curl/jq;UI层是 Playwright;数据层是 Faker、数据库脚本、JSON Server;辅助层是 LangChain 做 AI 脚本生成、GitHub Actions 做调度。工具不在于多,在于每个都真实解决一个问题,并且和别的工具有顺畅的衔接。这个过程本身,也一直在延续,每次看到新的工具冒出来,我都会先想想它能不能补上当前链条的某个短板,再决定要不要引进。这种“以终为始”的工具观,可能是这几年测试开发道路上我沉淀下来最有价值的东西。