Playwright+TypeScript自动化框架:默认与自定义Fixture选型咨询
Playwright Fixture选型:小项目该用内置还是自定义?
直白结论:小项目阶段先怼内置Fixture,别过早折腾自定义
你现在框架规模小,用官方自带的page这类内置Fixture是最高效的——写测试快,不用花时间搞封装,能快速验证功能跑通流程。而且Playwright的Fixture系统天生支持渐进式重构,等后面需要了再改完全来得及,不会留下什么技术债务。
什么时候必须转自定义Fixture?
等你遇到以下场景,就是该动手的时候了:
- 测试用例超过20个,开始出现大量重复代码(比如每个测试都要写登录流程、重复定位同一个元素)
- 业务流程变复杂,涉及多页面跳转、多环境切换(比如本地/测试/生产环境)
- 需要统一处理通用逻辑(比如全局错误捕获、测试前后的数据清理、自定义日志)
这时候自定义Fixture+页面对象模式的优势就出来了:
- 把重复操作封装成Fixture,所有测试复用,改一处就能同步所有用例,维护成本直接降下来
- 页面对象把元素定位和业务逻辑分开,UI改了只需要更新页面对象,不用动测试用例
- 可以注入自定义配置、测试数据、辅助工具,框架扩展性直接拉满,适配各种复杂场景
过渡的正确姿势:渐进式封装
不用一下子把所有代码都改成自定义Fixture,一步步来:
- 先用内置Fixture写核心测试,快速跑通流程
- 第一个重复操作出现时(比如登录),先抽成简单的自定义Fixture:
import { test as base } from '@playwright/test'; type MyFixtures = { loggedInPage: Page; }; export const test = base.extend<MyFixtures>({ loggedInPage: async ({ page }, use) => { await page.goto('/login'); await page.fill('#username', 'test-user'); await page.fill('#password', 'test-pass'); await page.click('#submit'); await use(page); }, }); - 随着业务变复杂,再逐步把页面对象(比如
LoginPage、DashboardPage)注入到Fixture里,替换掉直接操作page的代码
生产级项目的经验总结
我经手过几个百级用例的Playwright项目,都是从内置Fixture起步,随着规模增长逐步重构到自定义Fixture的。过早搞复杂封装纯粹是给自己添堵,反而拖慢测试开发速度;但等重复代码堆起来再不改,维护成本会指数级上升。所以把握好节奏,按需重构才是最优解。
内容的提问来源于stack exchange,提问作者Arun Benny




