实战指南
本指南展示如何使用 Cypress 测试常见场景。
https://github.com/cypress-io/cypress-example-recipes基础篇
方案 | 描述 |
---|---|
Node 模块 | 导入自定义 Node 模块 |
环境变量 | 向测试传递环境变量 |
错误处理 | 处理抛出错误和未处理的 Promise 拒绝 |
动态测试 | 从 JSON 数据动态创建测试 |
从 CSV 生成动态测试 | 从 CSV 文件动态创建测试 |
从 API 生成动态测试 | 通过调用外部 API 动态创建测试 |
测试夹具 | 加载单个或多个测试夹具 |
添加自定义命令 | 使用 JavaScript 编写自定义命令并确保 IntelliSense 类型提示正常工作 |
添加自定义命令(TypeScript) | 使用 TypeScript 编写自定义命令 |
添加 Chai 断言 | 添加新的或自定义的 chai 断言 |
Cypress 模块 API | 通过模块 API 运行 Cypress |
封装 Cypress 模块 API | 编写封装 "cypress run" 命令行解析的包装器 |
自定义浏览器 | 控制项目可用的浏览器列表,或添加自定义浏览器 |
使用 Chrome 远程调试接口 | 使用 Chrome 调试协议触发悬停状态和打印媒体样式 |
开箱即用的 TypeScript | 无需设置预处理器即可用 TypeScript 编写测试 |
单测试超时 | 如果测试运行超过指定时间限制则失败 |
Cypress 事件 | 使用 Cypress.on 和 cy.on 监听 before:window:load 等 Cypress 事件 |
视频分辨率 | 增加浏览器窗口尺寸以录制高质量视频和捕获详细截图 |
DOM 测试
方案 | 描述 |
---|---|
标签页处理与链接 | 在新标签页打开的链接 |
悬停与隐藏元素 | 测试需要悬停的隐藏元素 |
表单交互 | 测试 range 等表单元素 |
拖放操作 | 使用 .trigger() 测试拖放功能 |
Shadow DOM | 测试 Shadow DOM 中的元素 |
等待静态资源 | 展示如何等待 CSS、图片等静态资源加载完成 |
CSV 加载与表格测试 | 加载 CSV 文件并与表格单元格数据对比 |
评估性能指标 | 利用 Cypress 监控网站性能 |
根样式 | 触发修改 CSS 变量的颜色输入变化 |
选择器组件 | 测试 <select> 元素和 Select2 组件 |
Lit 元素 | 测试带 Shadow DOM 的 Lit 元素 |
文件下载 | 下载并验证 CSV、Excel、文本、Zip 和图片文件 |
页面刷新 | 处理随机性时避免使用 while 循环 |
分页 | 点击"下一页"直到最后一页 |
剪贴板 | 在测试中复制粘贴剪贴板文本 |
登录测试
方案 | 描述 |
---|---|
基础认证 | 使用基础认证登录 |
单点登录 | 跨多服务器或提供商登录 |
HTML 网页表单 | 通过基础 HTML 表单登录 |
XHR 网页表单 | 使 用 XHR 登录 |
CSRF 令牌 | 需要 CSRF 令牌的登录 |
Json Web 令牌 | 使用 JWT 登录 |
使用应用代码 | 通过调用应用代码登录 |
另请参阅 认证插件 并观看 测试组织、登录控制、状态管理
预处理器
方案 | 描述 |
---|---|
测试筛选 | 使用类 Mocha 的 grep 语法按名称过滤测试 |
Browserify 的 TypeScript 支持 | 通过 browserify 添加 TypeScript 支持 |
Webpack 的 TypeScript 支持 | 通过 webpack 添加 TypeScript 支持 |
Browserify 的 Flow 支持 | 通过 Browserify 添加 flow 支持 |
博客案例
来自 Cypress 博客 的演示方案。
方案 | 描述 |
---|---|
应用操作 | 应用操作是 Page Objects 的替代方案 |
端到端 API 测试 | 通过 GUI 运行 API 测试 |
端到端快照 | 端到端快照测试 |
元素覆盖率 | 追踪测试覆盖的元素 |
Codepen.io 测试 | 测试 HyperApp Codepen 演示 |
Redux Store 测试 | 测试使用 Redux 数据存储的应用 |
Vue + Vuex + REST 测试 | 测试使用 Vuex 数据存储的应用 |
无障碍测试 | 使用 cypress-axe 进行无障碍测试 |
自动化 Angular 测试 | 自动化 Angular 测试 |
React DevTools | 自动加载 React DevTools Chrome 扩展 |
断言计数 | 如何预期测试中的断言数量 |
浏览器通知 | 测试使用 Notification 的应用 |
iframe 测试 | 访问第三方 iframe 元素,监视和拦截 iframe 网络请求 |
类装饰器 | 使用 JavaScript 类装饰器暴 露应用创建的对象以便测试访问 |
表单提交 | 消除表单提交后页面重载测试的不稳定性 |
使用 Day.js 替代 Moment.js | 使用 day.js 库替代已弃用的 Cypress.moment |
桩与监视
方案 | 描述 |
---|---|
函数桩 | 使用 cy.stub() 测试函数调用 |
拦截 window.fetch | 使用 cy.stub() 控制 fetch 请求 |
使用 cy.intercept 拦截 | 使用 cy.intercept API 控制网络 |
拦截 window.open 和 console.log | 使用 cy.stub() 和 cy.spy() 测试应用行为 |
拦截 window.print | 使用 cy.stub() 测试应用调用的 window.print |
拦截 Google Analytics | 使用 cy.stub() 和 cy.intercept() 测试 Google Analytics 调用 |
拦截 console 方法 | 使用 cy.stub() 测试和控制 console 方法调用 |
拦截资源加载 | 使用 MutationObserver 拦截 img 等资源加载 |
拦截 navigator.cookieEnabled 属性 | 使用 cy.stub() 模拟 navigator.cookieEnabled 属性 |
单元测试
方案 | 描述 |
---|---|
应用代码 | 导入并测试自己的应用代码 |
服务端通信
方案 | 描述 |
---|---|
应用初始化 | 用测试数据初始化应用 |
Node 中初始化数据库 | 用测试数据初始化数据库 |
XHR 断言 | 监视和断言应用的网络调用 |
访问第二个域名 | 在不同测试中访问两个不同域名并传递值 |
在测试文件间传值 | 使用 cy.task 在测试文件间传值 |
流式测试结果 | 将每个测试结果从浏览器通过插件流式传输到外部进程 |
离线测试 | 测试网络离线时的应用 |
服务端计时 | 从 Cypress 测试报告服务端计时结果 |
等待 API | 使用 cy.request 调用后端直到响应 |
发起 HTTP 请求 | 如何使用 cy.request 、window.fetch 和 cy.task 命令发起带或不带 cookie 的 HTTP 请求 |
其他 Cypress 方案
方案 | 描述 |
---|---|
视觉测试 | Cypress 官方视觉测试指南 |
代码覆盖率 | Cypress 官方代码覆盖率指南 |
Docker 运行 | 单条 Docker 命令运行 Cypress |