Cypress 插件实战:让测试更稳定,不再“偶尔掉链子”

对于测试开发来说,最头疼的莫过于 flaky tests——同一条测试,有时候过,有时候失败,还没规律。今天我们就聊聊如何用 自定义 Cypress 插件,让测试稳定、易维护,同时提升工作效率。

为什么需要自定义插件?

如果你在做端到端测试,经常会遇到这些情况:

  • 页面动画、微调器挡住按钮,cy.click() 报错
  • GraphQL / REST 数据异步加载,元素还没渲染
  • 网络请求偶尔慢或重复触发

传统解决方案

cy.wait(500)  // 等半秒再操作

问题

  • 测试慢
  • 易失败
  • 调试困难

核心问题是:盲目等待不如智能等待。插件可以让测试像“人眼”一样,等页面真正稳定再操作。

从自定义命令到插件

基础自定义命令

// cypress/support/commands.js
Cypress.Commands.add('waitForSpinnerToDisappear', () => {
  cy.get('.loading-spinner', { timeout: 10000 }).should('not.exist');
});

小项目可以用,但逻辑无法跨项目复用,且仅能操作浏览器端。

插件化思路

  • 自定义命令 → 浏览器端操作
  • Node.js 后端任务 → 文件操作、日志、复杂逻辑


    image.png

八个实用经验(针对日常工作)

1.聚焦核心痛点不要做“通用工具库”,先解决最常见问题。
2.可扩展架构

cy.waitUntilStable(() => {
  cy.get('#special-element').should('be.visible');
});

3.直观、可调试Cypress.log() 帮你看到插件在做什么,调试更轻松。
4.充分测试插件

  • 单元测试(Jest)
  • 端到端测试(独立 Cypress 实例)

5.小步迭代先解决动画等待 → 再加网络空闲等待 → 再加其他自定义逻辑
6.文档和示例

cy.get('#open-modal-btn').click();
cy.waitUntilStable().then(() => {
    cy.get('.modal-content').should('be.visible');
    cy.get('.modal-title').should('contain', '重要信息');
});

7.可调参数设计

cy.waitForNetworkIdle({ settleTime: 250 });

8.自动化维护CI/CD 流程自动跑插件测试,保证新版本 Cypress 不破坏插件功能。

插件目录结构建议

your-plugin/
├── package.json
├── README.md
├── types.d.ts        # TypeScript 可选
└── src/
    ├── index.js      # Node.js 后端逻辑
    └── support.js    # 浏览器端自定义命令

Node.js 后端任务示例

module.exports = (on, config) => {
  on('task', {
    logMessage(message) {
      console.log(`[Plugin Log]: ${message}`);
      return null;
    },
    // 可以增加更多任务,例如清理文件夹、读取 JSON
  });
  return config;
};

浏览器端自定义命令示例

Cypress.Commands.add('login', (username, password) => {
  cy.log(`登录用户 ${username}`);
  cy.visit('/login');
  cy.get('#username').type(username);
  cy.get('#password').type(password);
  cy.get('#submit').click();
});

实战示例

示例 1:读取 JSON 数据

cy.task('readJson', 'test-data/userData.json').then((data) => {
  cy.get('input#name').type(data.name);
  cy.get('input#email').type(data.email);
});

示例 2:测试前清理文件夹

describe('报表测试', () => {
  before(() => {
    cy.task('cleanFolder', 'cypress/reports');
  });
});
sequenceDiagram
    participant T as 测试用例
    participant P as 插件任务
    participant F as 文件系统
    T->>P: 调用 cleanFolder
    P->>F: 清空 reports 文件夹
    F-->>P: 完成
    P-->>T: 返回

最佳实践

  • 命名清晰:一眼看出插件功能
  • 版本管理规范:Major.Minor.Patch
  • 文档完整:安装、API、示例
  • CI/CD 自动化:保证稳定性

写在最后

自定义 Cypress 插件可以帮助测试开发者:

  • 避免 flaky tests
  • 提高测试效率
  • 简化重复操作
  • 增强团队对 CI/CD 流程的信任

从日常工作痛点出发,小步迭代、封装插件、记录流程,让测试更稳定、更高效。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 测试脚本生成太慢?我用Dify+自然语言描述,效率提升了300% 关注 霍格沃兹测试学院公众号,回复「资料」, 领...
    霍格沃兹测试开发学社阅读 3评论 0 0
  • # 使用Cypress进行端到端的自动化测试 ## 前言:端到端测试的必要性 在现代Web应用开发中,**端到端测...
    是啊呱呱不是阿瓜瓜阅读 761评论 0 0
  • 如何建立一个Gatsby 主题工作区,并使用TypeScript、ESLint和Cypress设置? Gatsby...
    思考蛙阅读 4,260评论 0 0
  • 需要标签身份不然凭什么帮助人家,去做这些事代表假设成交,安排住宿行为一旦做了就假定成交了 一旦生了那一念很难停下来...
    莫忘小寒阅读 2,656评论 0 0
  • 打破技术壁垒,陶瓷雕铣机开启加工新范式 在陶瓷加工行业迈向高精度、高附加值的转型浪潮中,传统加工模式的技术瓶颈(如...
    工业陶瓷阅读 19评论 0 0