在介绍框架之前,先分析一下为什么我们需要端到端测试?
在其他的博客中我们已经介绍过单元测试了,凭借着快照库和DOM抓取,对API的mock等操作,单元测试也可以达到对DOM状态的判断以及样式的断言,所以我们为什么还需要端到端测试呢?这就是黑盒与白盒的区别,白盒更注重数据的流动,黑盒更注重结果的展示,也就是一个是注重过程,一个注重结果。侧重点的不同所带来的展示效果也会相应的出现偏差。端到端测试给我最直观的反馈在于它更像是一个自动化的测试脚本,去自动点击一个真实浏览器环境中的页面,再通过直接抓取页面上的DOM来断言是否符合预期,这是最接近用户的测试方式,所以我认为从一定程度而言端到端测试对于一个产品的发布起到了至关重要的作用,这直接关系到了DOM给用户带来的视觉上的交互。
Cypress是基于 electron 的一个测试框架,提供 web 环境进行点对点的测试,在 programer 思维下,进行自动化的交互操作,必要点检测说明,这是一个非常棒的用处。例如之后拥有数据埋点,
可以在固定的位置检测是否有埋点。
这是在官网中找到的关于Cypress的四点特性,我们一个个来分析
F12
控制台去debugVue
自身所携带的异步等待函数vue.nextTick
来进行下一步的断言。在Cypress中我们完全不需要担心异步等待在代码中的呈现,框架会自动等待回调的结束,在这个过程中并且会启动一个计时。|-- tests // 测试目录
| |-- __mocks__ // 单元测试模拟数据
| |-- coverage
| |-- e2e // E2E测试
| | |-- config // 请求路径配置
| | | |-- conf.js
| | |-- fixtures // 模拟请求文件
| | |-- plugins // 主要配置
| | | | -- index.js
| | |-- specs // 测试用例
| | | | -- xxx.spec.js
| | |-- support // 配置自定义命令
| | | | -- commands.js
| | | | -- index.js
| |-- unit // 单元测试
| | |-- xxx.spec.ts // 测试用例
在根目录下还需要一个cypress.json
{
"pluginsFile": "tests/e2e/plugins/index.js",
"projectId": "8efjtr"
}
我们这里一个个来介绍文件的目录结构和配置说明
Cypress
时,会在项目的根目录中去寻找这个文件,在vue-cli-3
中单独把pluginsFile
这个配置项指向了我们重新配置的路径(实际在安装完一个Cypress
项目时,测试用例所在的目录就是cypress
文件夹),在这个被指向的配置文件中再去使用config
参数配置其他目录所在的位置:// https://docs.cypress.io/guides/guides/plugins-guide.html
module.exports = (on, config) => {
return Object.assign({}, config, {
// baseUrl: "http://localhost:8080", // 测试域名
fixturesFolder: 'tests/e2e/fixtures',
integrationFolder: 'tests/e2e/specs', // 测试文件文件夹
screenshotsFolder: 'tests/e2e/screenshots', // 屏幕快照
// videoRecording: true,
videosFolder: 'tests/e2e/videos', // 录制后的文件夹
supportFile: 'tests/e2e/support/index.js'
})
}
当然我们也可以直接在cypress.json
中去指定这些配置:
{
"projectId": "by9ntm",
"fixturesFolder": "test/e2e/fixtures",
"integrationFolder": "test/e2e/specs",
"pluginsFile": "test/e2e/plugins",
"screenshotsFolder": "test/e2e/screenshots",
"supportFile": "test/e2e/support",
"videosFolder": "test/e2e/videos",
"baseUrl": "http://localhost:8080"
}
生成配置后可以在项目启动后的dashboard
的setting
选项中看到所有我们对配置的改动,并会通过不同颜色进行标注。同样这个json
的文件还可以对不同环境下的配置做不同的更改,具体参照官方文档。
Cypress
是浏览器真实去访问一个链接的地址,所以需要把整个项目给启动后才可以去测试,所以需要一个准确的baseUrl
Cypress
的API很可能没有覆盖到,所以可以在这个文件夹下配置自定义的命令全局注入到框架中使用。/plugins/index.js
// https://docs.cypress.io/guides/guides/plugins-guide.html
module.exports = (on, config) => {
return Object.assign({}, config, {
// baseUrl: "http://localhost:8080", // 测试域名
fixturesFolder: 'tests/e2e/fixtures',
integrationFolder: 'tests/e2e/specs', // 测试文件文件夹
screenshotsFolder: 'tests/e2e/screenshots', // 屏幕快照
// videoRecording: true,
videosFolder: 'tests/e2e/videos', // 录制后的文件夹
supportFile: 'tests/e2e/support/index.js',
viewportHeight: 768, // 测试浏览器视口高度
viewportWidth: 1366 // 测试浏览器视口宽度
})
}
在vue-cli 3.0的默认配置中,我们直接运行npm run test:e2e
来启动我们的测试,在这之前我们需要先启动我们的项目和mock服务,最后去启动我们的E2E,否则baseUrl会请求不到正确的端口。
这是启动页面,顶部会有三个选项配置可供选择,在>Tests
选项中我们可以看到我们所有的spec,当然这个顺序是按照字母排列的,我们可以点击Run all specs
按钮来一次性启动所有的用例,也可以点击单个用例来启动。
这是一次成功的测试,可以看到左边的列表都已经呈现一个绿色的状态,鼠标选中可以看到当时页面的一个状态。
本章主要讲解了前端端到端测试的入门概念和框架选型配置。下一个系列将会讲解了解Cypress
所提供的基础语法和如何去写一个完整的测试用例。