Cypress Web Automate Test
背景
最近项目越来越多, 测试压力也增大了, 于是酝酿很久的自动化测试也提上议程了.
框架选择
常见的项目脚手架中其实应该都自带了测试框架, 一般直接使用npm test
脚本, 内置的往往是jest
框架, 但是用的人却很少, 归根结底是不方便开发, 项目中的组件不是单一的, 页面逻辑也很复杂, 出bug
的往往涉及到后端接口. 单独针对某个组件的测试确实意义不大, 所以调研后选择使用cypress
框架, 来实现真正的模拟用户场景的端到端测试.
cypress
原理
cypress
通过调用chrome
并模拟用户行为, 这意味着所有在开发中能使用到的chrome
的功能, 在开发测试用例的时候都能用上, 包括脚本断点/网络请求/浏览器状态等, 这对测试开发是十分重要的
安装
cypress
提供create-react-app
的支持版, 但实际上是依赖侵入性修改的, 实际上直接使用通用的安装方式更好
1 | cd /home/project/ |
虽然我们将cypress
安装在当前项目下, 但cypress
实际上还是在全局安装了它自己的chrome
和调用方式, 方便多个项目共享.
启动
可以修改package.json
里加上script.cypress-open: "cypress open"
来启动cypress
, 也可以直接使用npx
来启动
1 | npx cypress open |
第一次启动时, 会提示首次运行, 然后初始化cypress/
文件夹到项目目录下, 并生成cypress.json
文件, 以后相关配置只需要修改这两块内容, 最后会自动打开cypress
控制台, 可以看到里面自带的一些写好的测试用例demo
. 点击某个spec.js
后, 就会自动打开浏览器, 运行测试脚本了.
ts
支持
准备好环境后, 就来开发第一个测试脚本, 一开始就碰见了问题:
按官方实例开发一个app.spec.js
后, eslint
提示'cy' is not defined.eslintno-undef
不存在
查了下文档, 发现cypress
也有完善的typescript
支持, 只需要配置一下即可
首先修改app.spec.js
后缀为ts
, 然后在cypress
目录下添加tsconfig.json
文件
1 | { |
1 | // app.spec.ts |
完成后, 就可以很轻松的使用typescript
来开发了
覆盖率报告
一般使用jest
的项目能使用npm run test -- --coverage
生成覆盖率报告, 在cypress
中同样也有相关功能, 直接参考官方文档配置即可
babel-plugin-istanbul
既然是编译时注入的, 那就需要babel
插件了, 注意只有在非生产环境下才需要加上这个插件
1 | // npm i -D babel-plugin-istanbul |
cypress-plugin
此处直接按照文档内容配置
1 | // cypress/plugins/index.js |
1 | // cypress/support/index.js |
生成覆盖率报告
插件配置完成后, 运行一次测试用例, 就可以在coverage
文件夹下看到html
版的覆盖率报告了. 如果需要文本格式的报告, 可以使用npx nyc report --reporter=text-summary
生成
全链路覆盖率
cypress
可以实现从后端到前端同时收集覆盖率并合并到同一个报告中, 在某些独立项目中其实也是很有意义的, 可以参考官方例子
测试用例
鉴权
内部系统测试往往要鉴权, 下策是用自己的账号密码登录, 上策是直接获取测试账号token
写入cookie
即可
1 | describe('Web Test', () => { |
url
跳转
某些操作后需要检测url
是否生效和一致, 可以使用url()
来检测
1 | cy.url().should('include', '/index'); |
其他
最后在ci
中配上npm start &
和npx cypress run
, 就可以实现全流程自动化测试了. 虽然由于时间关系只覆盖了最重要的几个页面和组件, 但是框架已经搭建完成, 后续在开发业务的时候都能同步开发测试内容了
Cypress Web Automate Test
https://mosby-zhou.github.io/2021/06-28-cypress-automate-test/