Cypress 最佳实践+踩坑

651 阅读2分钟

Cypress 最佳实践

设置 baseUrl

针对单个网站的测试,最好设置一下 baseUrl,保证代码的简洁

✗ avoid
使用 cy.visit 但没有设置 baseUrl

✓ ok
cypress.[js|json] 中设置 baseUrl

组织测试,登录,控制状态

 avoid
共用页面对象,使用 UI登录,不截屏

 ok
测试 spec 之间互相独立,用编程的方式登录,控制你的应用的状态

选择元素

尽可能的考虑 UI 元素的变动,以防止页面做了修改之后,测试用例报错。提升健壮性

✗ avoid
使用 `id`, `class`, `tag`, `文本内容` 等选择元素

✓ ok
添加 `data-` 属性用于选择元素。但是要有修改代码的权限,此条存疑

赋值

✗ avoid
把命令的返回值赋给变量或者常量,使用 const, let 或者 var

// 例外:
- 存储和比较某些值,如 text, class, attribute 等
- 不同测试用例与 hook 之间共享某些值,如 beforebeforeEachok
使用闭包来访问和存储命令返回值

访问外部站点

✗ avoid
试图访问可控范围外的站点或服务器

✓ ok
只测试你能控制的范围。避免访问第三方服务器
如果必须做,请使用 cy.request() 来通信

测试依赖之前的测试

✗ avoid
几个测试耦合在一起

✓ ok
测试应该可以独立运行而且仍然能够通过

// 解决耦合
· 合并成一个测试
· 将共享代码放在 beforeEach 中

创建只有一个断言的微型测试

跟上条相比,使用 Cypress 不可太抽象,其主要还是做 e2e 测试

✗ avoid
像写单元测试一样写 Cypress 测试

✓ ok
将多个断言写在一起,尽量场景化 e2e

使用 after 和 afterEach

✗ avoid
用于清理状态

✓ ok
在测试运行前清理

无需等待

尤其是在等待 API 返回这样的例子中,不要使用 cy.wait, 因为网络是不可预测的

✗ avoid
不要使用 cy.wait(number)

✓ ok
尽量使用 cy.wait(alias) 或者断言来保证 Cypress 符合某种运行条件

WEB 服务器

✗ avoid
使用 cy.exec 或 cy.task 运行 web server

✓ ok
运行 cypress 前启动 web server

持续补充

Cypress 里面的一些坑

异步

Cypress 的命令大多是异步的,在学习初期,如果不了解异步,写起来会很痛苦。随之而来的,是针对编程思维和编程经验的要求较高。初学者容易懵逼