不很久不很久以前

据说某家公司有两位前端,天天撸bug,为啥嘞?只怪测试MM倾人国,轻语哥哥有bug。✧(๑•̀ㅂ•́)و✧ 可是最近两位有点犯愁 Σ(っ °Д °;)っ。测试MM有几次提了紧急bug,都在旁边鼓励他们改bug了,可是线上bug重现排查比较麻烦,而且改了后还发现没改好,惹得测试MM潸然泪下,好生埋汰。怎么办呢?

前端君666某天发现了E2E测试神器cypress后,暗中偷练神功,改bug越来越6,测试MM每天笑着对他说,666你真6,MM好喜欢呀(๑•́ ₃ •̀๑) 另一位前端君555每天面对堆积如山的bug长吁短叹,测试MM提完新bug后都不理他了≡ ̄﹏ ̄≡

作为一个追求代码永无bug、顺带跟测试MM沟通产品的有理想的前端 (ง •̀_•́)ง,我觉得有必要学习一下怎么使用cypress来进行E2E测试,以此来提高代码质量。那么我们来看看怎么入门cypress测试框架。

cypress三问 - 你是谁

cypress是在mocha式API基础上构建的一套开箱可用的E2E测试框架,对比其他测试框架,它提供一套自己的最佳实践方案,无需其他测试工具库,配置方便简单但功能异常强大,可以使用webpack项目配置,还提供了一个强大的GUI图形工具。入门简单,上手方便,怎么舒服怎么来呀 (。→‿←。)

cypressGUI方式的测试使用真实浏览器,非GUI方式使用chrome-headless,不是用模拟方式进行测试,更真实的展现实际环境中的测试过程和结果。

cypress三问 - 你有啥优势

cypress有几大自带的强大功能:

  • 自带GUI工具,想测啥就点啥,还可以查看整个测试过程,想录屏还可以录屏哟(录屏可以发给测试MM看,保准她说哥哥真厉害哟。 一般人我不告诉他๑乛◡乛๑)
  • 测试的每一步都有snapshot,可以通过GUI工具查看每个过程的页面状态,不是截图而是真是的页面DOM环境哟!
  • 自带数据mock和请求拦截机制,还原线上数据引起的bug别提有多轻松了
  • 和wepbakc配置,实现无论修改测试文件还是被测试代码都可以自动重测
    • 小Tips:可以给测试用例加上only或者skip来避免重测测试文件里的所有用例: it.only('只测试这个哟); it.skip('不要测这个');

cypress三问 - 怎么用

安装

  • yarn add cypress 或者 npm install cypress
  • 安装完毕后,./node_modules/.bin/cypress install安装cypress环境(包括GUI工具)

配置

  • package.json: 配置GUI和非GUI(terminal)两种方式来运行cypress
    "scripts": {"cypress": "cypress run","cypress-gui": "cypress open",
复制代码

⚠️ 配置好后 先运行 yarn cypress[-gui] 或者 npm run cypress[-gui](中括号意思是可选)来初始化cypress生成默认配置和目录

  • cypress.json(与package.json同级目录): cypress提供比较灵活的配置,可以根据自己需要定制行为,以下列一下我对一个项目的配置
{"baseUrl": "http://localhost:8080", // 本地开发服务地址(webpack-dev-server)"integrationFolder": "src", // 自定义"src"为测试文件根目录,默认是"cypress/integration""testFiles": "**/*.cypress.spec.js", // 自定义测试文件的匹配正则,默认是"**/*.*",即所有文件"videoRecording": false, // 关闭录屏功能, 如果开启录屏功能,记得将"cypress/screenshots"目录加入".gitignore",防止不小心将录屏加到git中"viewportHeight": 800, // 设置测试环境的页面视图的高度"viewportWidth": 1600 // 设置测试环境的页面视图的宽度
}
复制代码
  • cypress/plugins/index.js: cypress运行环境配置,可以用来配置webpack等。以下是配置webpack别名范例。默认这里不需要配置。
// 参考官方例子地址 https://github.com/cypress-io/cypress-example-recipes/blob/master/examples/preprocessors__typescript-webpack/cypress/plugins/index.js
const wp = require("@cypress/webpack-preprocessor");
const path = require('path');function resolve(dir) {return path.join(__dirname, "../..", dir);
}module.exports = on => {const options = {webpackOptions: {resolve: {alias: {"@": resolve("src"),cypress: resolve("cypress")}}}};on("file:preprocessor", wp(options));
};
复制代码

万事俱备,测测测

  • 简单的一个例子
describe('测试页面包含某元素', () => {it('有云 "前端哥哥们真帅,前端妹妹们真漂亮"', () => {cy.contains("前端哥哥们真帅,前端妹妹们真漂亮");});it('要有一个链接', () => {cy.get('a').should('have.length', 1);});it('不存在class含有abc的元素', () => {cy.get('.abc').should('have.length', 0);});
});
复制代码
  • 互动的例子
describe('一起动', () => {it('获取输入框,输入文字并按enter键', () => {const text = 'not exist';// type api用法: https://docs.cypress.io/api/commands/type.html#Usagecy.get('input').type(`${text}{enter}`);});it('点击按钮', () => {cy.get('button').click();});
});
复制代码
  • 网络请求mock例子

Tip1: cy.route的路径匹配是严格的,所以要注意是否需要加通配符。如 cy.route('/api/search', [])不会拦截/api/search?keyword=abc,只会拦截/api/search

Tip2: cy.route的method要注意,默认是GETcy.route('/api/posts')cy.route('POST', '/api/posts') 是不一样的。

describe('要啥给啥', () => {beforeEach(() => {cy.server(); // 一定要在 cy.route 前调用cy.fixture('/posts/list.json') // 我们在 cypress/fixtures 内创建mock用的数据.as('postsData'); // 给 mock 数据取别名,以后 cy.route 使用cy.route('/api/posts', '@postsData').as('getPostsRoute'); // 给请求取别名,以供 cy.wait 使用})it('进入列表页,拦截列表请求接口', () => {cy.wait('@getPostsRoute'); // 等待被拦截的接口请求完成cy.get('.post').should('have.length', 10); // 要有10条数据被渲染到页面上});
})
复制代码
  • 实际场景例子: 结合上面所有姿势,我们现在测试搜索页面的搜索、操作结果
describe('test search page', () => {// 几个 route 路径变量const searchRoutePath = '/api/items/activities?query=*';const deleteActivityRoutePath = '/api/activities/*/items/batch?num_iids[]=*';const undoActivityRoutePath = '/api/activities/*/items/undo';function search(keyword) {// 将搜索行为和等待搜索返回封装起来cy.fixture('items/activities.json')// 处理mock数据,只返回符合搜索结构的数据.then(data => data.filter(item => item.title.indexOf(keyword) !== -1)).as('searchResult');cy.server();cy.route(searchRoutePath, '@searchResult').as('searchRoute');const input = cy.get('input');input.clear(); // 清空输入框内文本input.type(`${keyword}{enter}`);cy.wait('@searchRoute');}before(() => {// 进行所有测试前,先访问搜索页cy.visit('/activities/search');});it('should show no data tip when search result is empty', () => {const text = 'not exist';search(text);cy.contains(`没有找到关于 ${text} 的结果`);});it('should remove activity from list when clean successful', () => {search('成功');cy.route('delete', deleteActivityRoutePath, {success: 0,fail: 0,waiting: 0,}).as('deleteActivityResponse');// within是让cy执行的context保持在'.activities-search'这个dom节点内// 默认cy的执行是以上一个cy命令结果作为context// 如 "cy.get('a'); cy.get('span')",cy会在上一个命令找到的'a'标签中查找'span'cy.get('.activities-search').within(() => {const items = cy.get('.result-item');items.should('have.length', 1);const applyList = items.get('.apply-list');applyList.should('not.be.visible'); // 每个数据项内详细内容区域是隐藏的const toggleBtn = items.get('.item-apply-count');toggleBtn.click(); // 点击显示详细内容区applyList.should('be.visible');applyList.children().should('have.length', 1); // 详细内容区内数据只有1条const cleanBtn = cy.contains('退出');cleanBtn.click(); // 点击详细内容区里的“退出”按钮cy.wait('@deleteActivityResponse'); // 等待“退出”请求返回cy.get('.apply-list').should('be', null); // 退出成功后,详细内容区数据减1,即空});});
});
复制代码

几个必读文档

  • network-requests : https://docs.cypress.io/guides/guides/network-requests.html
  • assertions : https://docs.cypress.io/guides/references/assertions.html
  • recipes 示例 : https://docs.cypress.io/examples/examples/recipes.html
  • code completion 代码提示: https://docs.cypress.io/guides/tooling/intelligent-code-completion.html

关于测试覆盖率

目前cypress没有内置测试覆盖率统计功能,github上有专门的issue在跟踪这个,后续应该会有。issue上也有几个临时方案,目前我倾向使用chrome自带的来查看。在GUI打开的测试的浏览器中打开devtools,切到Sources, 按下cmd+shift+p(windows用户按ctrl+shift+p),输入coverage,选择重新刷新并统计代码执行覆盖率。

那么,high起来

为了高(撩)质(测)量(试)代(M)码(M),high起来。喜欢前端MM的可以手把手教起来了 (¬_¬)


本文章首发于本人公众号:枫之叶。有兴趣的可以长按下方二维码关注。^v^

撩测试MM神器cypress使用入门相关推荐

  1. dt测试软件的学习心得,无线网络优化dt测试心得_适合新手入门,高手进阶_5年项目经验实战经验.docx...

    无线网络优化DT测试心得_适合新手入门,高手进阶_5年项目经验实战经验 无线网络优化DT测试心得_适合新手入门,高手进阶_5年项目经验实战经验 路测中不常见的问题和个人心得 1.深井子镇投诉测试报告 ...

  2. 推荐一款全能测试开发神器!1分钟快速上手!

    关注上方"测试开发技术",选择星标, 干货技术,第一时间送达! 1. 说一下背景 在日常开发或者测试工作中,经常会因为下游服务不可用或者不稳定时,通过工具或者技术手段去模拟一个HT ...

  3. Labview的国产测试工具神器ATECLOUD智能云测试平台技术特点

    ATECLOUD智能云测试平台作为近年来崛起的自动化测试测量工具,已经成为了国人心中属于中国人自己的"Labview".从传统的代码编码到Labview的图形化编程,再到ATECL ...

  4. 如何用计算机撩手机号,宅男福音:巧用iphone计算机,撩走MM手机号

    原标题:宅男福音:巧用iphone计算机,撩走MM手机号 光棍节过去了,然而你还是光棍,不要用宅来掩饰你脱不了单的现实,想要获取菇凉芳心,让我们从一个手机号开始. 什么?你就这样五大三粗.直截了当的向 ...

  5. Cypress简易入门教程

    1 Windows下安装 1.1方法一 1)安装node.js(https://nodejs.org/en/download/),根据版本选择32位或64位. 2)确认ndejs和npm是否安装上: ...

  6. 自动化测试(二)02——单元测试类工具-Karma、Jasmine、Mocha、Jest、AVA E2E测试类工具-cypress、nightmare、nightwatch、testcafe

    自动化测试(二)02--单元测试类工具-Karma.Jasmine.Mocha.Jest.AVA & E2E测试类工具-cypress.nightmare.nightwatch.testcaf ...

  7. 编码神器-IDEA 从入门到精通

    IDEA开发工具 一.编码神器-IDEA (一)IDEA介绍[了解] l 官网:http://www.jetbrains.com/idea/download/#section=windows l 官网 ...

  8. e2e测试框架之Cypress

    谈起web自动化测试,大家首先想到的是Selenium!随着近几年前端技术的发展,出现了不少前端测试框架,这些测试框架大多并不依赖于Selenium,这一点跟后端测试框架有很大不同,如Robot Fr ...

  9. springboot util 测试类怎么写_SpringBoot入门建站全系列(九)文件上传功能与下载方式...

    SpringBoot入门建站全系列(九)文件上传功能与下载方式 Spring对文件上传做了简单的封装,就是用MultipartFile这个对象去接收文件,当然有很多种写法,下面会一一介绍. 文件的下载 ...

  10. jdbctemplate 执行多条sql_白帽推荐:可以自动检索、挖掘sql注入的神器,sqlmap入门实战

    学习web渗透的小白,必须有一份sqlmap的入门档案,收藏好,以备不时之需哈! Sqlmap介绍 sqlmap是一个自动化的SQL注入工具,其主要功能就是扫描.发现并利用给定的URL的SQL注入漏洞 ...

最新文章

  1. Linux常用Shell脚本珍藏
  2. word从第3页开始设置页码为第一页_写论文、报告必会:快速让Word页码从第三页开始的方法...
  3. 全国计算机等级考试题库二级C操作题100套(第88套)
  4. 确认过眼神是先用上5G的人!中国联通将在7个城市开通5G试验网
  5. cuSPARSE库:(六)cusparseMatrixType_t的说明
  6. golang orm对比
  7. windows程序静默安装
  8. Java开发笔记(一百四十四)实现FXML对应的控制器
  9. 利用imnoise2函数产生数据的直方图
  10. HDU2030-汉字机内码
  11. linux 下kali linux 中使用hydra 进行对虚拟机中win10系统的密码破解
  12. android 6.0 usb网卡,Android安卓6.0使用技巧:让手机化身网卡和声卡
  13. 【游戏测试】bug优先级的定义及如何描述
  14. BZOJ1023 [SHOI2008]cactus仙人掌图
  15. redhat8安装rpm提示package does not verify: no digest
  16. 为什么我的word一联网打开就很慢,不联网时打开却正常,打印设置问题导致office打开慢
  17. GitHub如何使用
  18. python sdk是什么意思_sdk什么意思
  19. 1个人,100天业余时间,用Flutter开发完一个商业APP,手握5家大厂offer
  20. Unity 安装 Device Simulator

热门文章

  1. [蓝桥杯开源项目与实践] 第三届(自动售水机)
  2. 《八位,十六位,傻傻分不清楚》
  3. 【单词】【2012】
  4. python postman脚本自动化_使用postman(Python请求)生成的代码并将其插入Python脚本中...
  5. 域权限提升漏洞CVE-2022-26923在MAQ=0时的利用分析
  6. 【蓝桥杯冲刺篇】真题详解 day29
  7. NFTScan | 10.30~11.05 NFT 市场热点汇总
  8. 从工业的实际应用角度看网络表示学习
  9. C语言数据类型默认值,int类型默认值真的是0吗?
  10. 火山安卓程序崩溃处理