Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >你不知道的Cypress系列(8) -- “可视化”测试你知多少?

你不知道的Cypress系列(8) -- “可视化”测试你知多少?

作者头像
iTesting
发布于 2021-04-25 08:08:40
发布于 2021-04-25 08:08:40
3.1K00
代码可运行
举报
文章被收录于专栏:iTestingiTesting
运行总次数:0
代码可运行

iTesting,爱测试,爱分享

转眼之间,你不知道的Cypress系列已经到第8篇了。在Cypress中国群内、在公众号iTesting里,我每天都能看到大量关于Cypress的使用讨论和私下问询。这让我感到无比荣幸(买了书的同学们,公众号回复你的微信号,拉你到Cypress中国群)。

今天是你不知道的Cypress系列(8) -- “可视化”测试你知多少?

断言是自动化测试中比较繁琐的一个动作,特别是当你要检查的点比较多的时候。在以往的测试中,如果要检查页面元素是否符合我们期望,我们通常通过一个个的断言来进行。

这样带来一个问题,一个用例往往需要多达5、6个甚至更多的断言。假设我的需求仍处于变化中,那么每一次改动需求,我都需要重新更改断言的值。特别是当页面改变主要跟UI的变化有关时(例如button的颜色、 button的位置、button的个数, icon的大小等等),频繁更改代码会苦不堪言。

于是,“可视化”测试(Visual Testing)就出现了。

什么是可视化测试

可视化的定义如下:

"Visual testing evaluates the visible output of an application and compares that output against the results expected by design."

我就不翻译了,可视化测试就是检查“页面所见”是否符合需求预期。那么“页面所见”是什么,就是页面呈现出来的可被看见的效果。

一般情况下,可视化测试都是通过图片对比来实现的。也被称之为“图像测试”,“图片测试”等。

Cypress可视化测试工作原理

可视化测试的原理非常简单,那就是图片Diff。在你第一次运行某个测试时,Cypress Test Runner对你指定的元素进行截图并保存,并称之为Base Line。在你第2次运行这个测试时,会再次截图并将截图与BaseLine进行比较。

可视化测试实例

"You can you up, no can no bb", 直接上代码吧:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

describe('iTesting demo', () => {

    it('可视化测试', () => {
        cy.visit('https://www.baidu.com')
        cy.get('#kw').type('iTesting')
        cy.get('#su').click()
        // 传统断言
        cy.get('.result.c-container.new-pmd').eq(0).then(ele => {
            expect(ele.text(), '验证第一个结果的text里包括iTesting').to.includes('iTesting软件测试知识分享')
        })
        //可视化“断言”
        //可视化能检查的更多。
        cy.get('.result.c-container.new-pmd').eq(0).toMatchImageSnapshot()
    })


})

为了对比,我上面代码里,列出了传统的断言方法和可视化测试的”断言“方法。

这就完了?是的。可视化测试非常简单,下面我来解释下,以上代码做了下面这些事:

  1. 打开百度。
  2. 输入“iTesting”。
  3. 点击回车查询。
  4. 检查出现的第一个结果。

需要注意的是,传统方式下的断言,我们都会有预期结果,期望结果。但使用可视化测试后,不需要断言(插件在运行时帮你做了。)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//注意toMatchImageSnapshot这个方法
cy.get('.result.c-container.new-pmd').eq(0).toMatchImageSnapshot()

你仅需要使用.toMatchImageSnapshot()方法就可以完成”断言“检查。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
在本例中,可视化测试会获取测试中的特定元素(即第一条查询结果)的图像快照,然后将该图像与先前批准的基准图像进行比较。如果图像相同(在设置的像素公差内),则确定Web应用程序对用户看起来相同,结果为Pass。如果存在差异,则报错,结果为Fail。

我们执行下测试,看一下执行结果:

可以看到,运行成功了。再检查下项目目录,你会发现,在你的测试用例下,多了一个文件夹”__image_snapshots__“, 这里有个截图,就是插件保存下来的用作BaseLine的截图。当你每次运行测试时,实际上,Cypress就是拿这个截图跟实际的截图做比较的。(注意,这里截的图,虽然看起来不是我代码中的第一个结果的截图,但是实际上是对的,这个可能跟Baidu页面的展现方式有关。)

为了验证可视化测试确实可工作,我更改可视化代码的检查如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

describe('iTesting demo', () => {

    it('可视化测试', () => {
        cy.visit('https://www.baidu.com')
        cy.get('#kw').type('iTesting')
        cy.get('#su').click()
        // 传统断言
        cy.get('.result.c-container.new-pmd').eq(0).then(ele => {
            expect(ele.text(), '验证第一个结果的text里包括iTesting').to.includes('iTesting软件测试知识分享')
        })
        //可视化“断言”,我故意改错,把要验证的元素改成第7个
        cy.get('.result.c-container.new-pmd').eq(6).toMatchImageSnapshot()
    })


})

再次运行:

从截图看错,错误原因是不匹配,说明可视化测试是有效的。

可视化测试好处

我知道你一定会问,直接总结吧:

  1. 减少断言代码的编写
  2. 帮你检查了隐性改变
  3. 当需求更改后,无需更改代码,删除BaseLine图像即可。

第1条很好理解, 第2条什么意思? 如果代码的改变是页面元素的颜色,或者icon的大小,在我们传统的测试中,如果你没有针对这个元素颜色或者icon大小做断言,那么测试就总会成功,但实际上页面是有变化的。而使用可视化测试可以避免这一点。

如何启用可视化测试

可视化测试启用非常简单,只需要如下步骤:

  1. 安装Plguin
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm i cypress-plugin-snapshots -S
  1. 更改cypress.json文件

在cypress.json文件中添加:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"ignoreTestFiles": [
  "**/__snapshots__/*",
  "**/__image_snapshots__/*"
]
  1. 更改plugin文件夹下的index文件
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const { initPlugin } = require('cypress-plugin-snapshots/plugin');

module.exports = (on, config) => {
  initPlugin(on, config);
  return config;
};
  1. 更改support文件夹下的index.js文件
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import 'cypress-plugin-snapshots/commands';

好了,可视化测试用起来,再也不用写断言啦~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-04-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 iTesting 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
你不知道的Cypress系列(11) -- 使用cy.session()加速鉴权。
今天是你不知道的Cypress系列(11) -- 使用cy.session()加速鉴权。
iTesting
2021/10/14
3.3K0
你不知道的Cypress系列(11) -- 使用cy.session()加速鉴权。
你不知道的Cypress系列(15) -- 支持跨域访问了!
说起Cypress,读者朋友们应该对“下一代Web端自动化测试技术”,“弯道超车首选”等等早已烂熟于心了。Cypress独特的运行机制(运行在浏览器内)也使得它吊打Webdriver之类的UI自动化测试工具。但是Cypress并不是完美无瑕,我们在使用Cypress做自动化测试时,经常会提的一个问题就是,Cypress不支持跨域访问,而我的测试需要跨域怎么办?
iTesting
2022/04/28
2.6K0
你不知道的Cypress系列(15) -- 支持跨域访问了!
你不知道的Cypress系列(5) -- "眼瞎"的TestRunner​
关于TestRunner, 我想大家都已经非常熟悉了。在我的的书中也有其各个用法的专门介绍,这里不再赘述。
iTesting
2021/03/18
2.3K2
你不知道的Cypress系列(5) -- "眼瞎"的TestRunner​
你不知道的Cypress系列(3) -- 是时候重构自己的思维了!
在跟同学们的交流中,我也了解到, 原来除了国外优秀的公司(例如Adobe, 迪士尼,AutoDesk等等), 国内也有很多公司在尝试使用Cypress提升测试效率。
iTesting
2021/01/04
2.3K0
你不知道的Cypress系列(1) --鸡肋的BDD
Behavioural Driven Development (BDD)是从TDD发展来的(什么,TDD你都不知道?!),它通过自然语言定义系统行为,以功能使用者的角度,编写需求场景,且这些行为描述可以直接形成需求文档,同时也是测试标准。
iTesting
2020/12/15
1.6K0
你不知道的Cypress系列(1) --鸡肋的BDD
Cypress系列(6)- Cypress 的重试机制
https://www.cnblogs.com/poloyy/category/1768839.html
小菠萝测试笔记
2020/06/09
2.2K0
Cypress系列(6)- Cypress 的重试机制
Cypress系列(68)- request() 命令详解
https://www.cnblogs.com/poloyy/category/1768839.html
小菠萝测试笔记
2020/10/28
1.1K0
Cypress系列(68)- request() 命令详解
Cypress简易入门教程
1)安装node.js(https://nodejs.org/en/download/),根据版本选择32位或64位。
顾翔
2020/06/18
5.6K0
你不知道的Cypress系列(9) -- 代码“自动生成”术​
本标题有哗众取宠之嫌,不过也侧面说明了测试行业内卷的程度。如果你有关注最新测试技术的习惯,你会发现,很多多年前就有的技术,最近几年又换了个皮卷土重来,比如,Codeless, BPA。本篇所介绍的代码 “自动生成”术,可以叫做Codeless,但既然已经在装X了,干脆叫代码”自动生成“术好了。
iTesting
2021/06/15
1.7K0
你不知道的Cypress系列(9) -- 代码“自动生成”术​
你不知道的Cypress系列(7) -- 当iFrame遇见弹出框
自从Cypress出现后,Cypress就在吊打一切Web端测试框架。虽然Cypress这么优秀,但它也有一些妥协和倔强,除了第6节的多Tab外,还包括这么一条:
iTesting
2021/04/25
2.8K0
你不知道的Cypress系列(7) -- 当iFrame遇见弹出框
前端自动化测试框架cypress
自动化测试是一种测试方法,是指使用特定的软件,去控制测试流程,并比较实际结果与预期结果之间的差异。通过将测试自动化,可以把人对软件的测试行为转化为由机器自动执行测试的行为,从而替代大量的手工测试操作,使得测试可以快速,反复的进行。
javascript艺术
2022/01/11
2.2K0
前端自动化测试框架cypress
cypress e2e 测试神器 安装使用及语法
cypress 我们直接去Cypress的官网,根据教程我们先进入我们项目的根目录,执行npm install cypress --save-dev,在安装完成之后是没有任何的动静的,除了我们的package.json中会多一个版本号的记录,在这里我们根据指引在控制台中输入node_modules/.bin/cypress open这一条命令主要是让我们进入这个目录后去执行cypress的一个可执行文件,在等待片刻后页面上会弹出一个熟悉的控制台,在控制台中会有一个Alert,我们点击按钮got it 就可以看到我们项目的根目录中生成了一个cypress.json文件和一个Cpress的文件夹,在文件夹的intergration中会有一些默认写好的spec,这些用例是框架在找不到指定路径时就会默认生成这么一个目录去提供整体结构的示例的,在cypress\integration 文件夹下写测试用例,可根据情况分文件夹存放 然后我们在cypress.json中填入我们需要修改的信息
余生
2018/12/07
2.1K3
Cypress web自动化20-跨域问题-a标签超链接
cypress 上默认访问一个跨域的网页会出现异常: Cypress detected a cross origin error happened on page load A cross origin error happens when your application navigates to a new URL which does not match the origin policy above. 之前使用 selenium 的时候,不用关心这种问题,a标签点击后会跳转到另外一个web页面,正常使用。 cypress上对web的安全性上考虑的更严格,对于跨域的链接会认为是不安全的,相关的资料查阅https://docs.cypress.io/guides/guides/web-security.html。
上海-悠悠
2020/05/29
3.2K0
前端自动化测试实践05—cypress-e2e入门
在 jest 单元测试中使用快照、API-mock 和 DOM 样式状态断言已经能够实现基础的 UI 测试,但是单元测试属于白盒测试,更关注数据的流动,而端到端测试(End To End Test)属于黑盒测试,更关注操作结果的展示,因此测试效果自然不同。端到端测试更贴近真实用户操作,页面运行在真实的浏览器环境中,因此端到端测试是从用户角度出发的测试。
CS逍遥剑仙
2019/11/04
4.3K0
Cypress初步使用
Cypress是新一代前端测试框架,它基于node js。解决了开发人员和QA工程师在测试现代应用程序时面临的关键难点问题。   Cypress包含免费的、开源的、可本地安装的Test Runner 和 能够记录测试的控制面板服务。
赵云龙龙
2020/05/22
1.5K0
你不知道的Cypress系列(2) -- ”该死"的PO模型​!
自从我的新书<前端自动化测试框架 -- Cypress从入门到精通>上市以来,这本书受到了大量同学热情的追捧和讨论。在跟同学们的交流中,我也了解到, 原来除了国外优秀的公司(例如Adobe, 迪士尼,AutoDesk等等), 国内也有很多公司在尝试使用Cypress提升测试效率。而在Cypress中国群内、在公众号iTesting里,我每天都能看到大量关于Cypress的使用讨论和私下问询。这让我感到无比荣幸。(买了书的同学们,公众号回复你的微信号,拉你到Cypress中国群)。
iTesting
2021/01/04
2.4K1
Cypress系列(65)- 测试运行失败自动重试
在 Cypress 安装目录下运行下面命令,所有测试用例若失败都会自动重试 2 次
小菠萝测试笔记
2020/10/26
2.3K0
Cypress系列(65)- 测试运行失败自动重试
Cypress系列(62)- 改造 PageObject 模式
PageObject(页面对象)模式是自动化测试中的一个最佳实践,相信很多小伙伴都知道的
小菠萝测试笔记
2020/10/26
9910
Cypress系列(62)- 改造 PageObject 模式
你不知道的Cypress系列(14) -- 一文说透元素定位
元素定位可以说是UI自动化测试的基础,没有元素定位,UI自动化就无从谈起。一般来说,一个好的定位器应该有如下4个属性:
iTesting
2022/03/30
2K0
你不知道的Cypress系列(14) -- 一文说透元素定位
Cypress端到端自动化测试学习笔记
一直以来,端到端的测试都是前端开发最头疼的事情。如果没有好的测试工具,一旦需求发生改变,就需要手工测试,费时费力,还会有漏网的 bug。最近接触了一款开箱即用的端到端测试工具——Cypress,真心不错,Cypress可以对在浏览器中运行的任何东西进行快速、简单和可靠的测试。
wencheng
2020/07/17
1.5K0
相关推荐
你不知道的Cypress系列(11) -- 使用cy.session()加速鉴权。
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验