Cypress学习总结


Cypress介绍:

1、基于javascript的前端测试工具,可以对浏览器中运行的任何内容进行快速,简单,可靠的测试;

2、Cypress是自集成的,提供了一套完整的端到端测试,无须借助其他外部工具,安装后即可快速的创建,编写,运行测试用例,且对每一步操作都支持回看;

3、不同于其他只能测试UI曾的前端测试工具,Cypress允许编写所有类型的测试,覆盖了测试金字塔模型的所有测试类型;

Cypress运行测试的大致流程:

1、运行测试后,Cypress使用工具将测试代码中的所有模块打包到一个js文件中;

2、然后,运行浏览器,并且将测试代码注入到一个空白页面中,然后它将在浏览器中运行测试代码【可以理解成Cypress将测试代码放到一个iframe中运行】

Cypress运行测试的技术流程:

1、每次测试首次加载Cypress时,内部Cypress web应用程序先把自己托管在本地的一个随机端口上;

2、在识别出测试中发出第一个cy.visit()命令后,Cypress会更改本地URL以匹配远程应用程序的Origin【满足同源策略】,这使得测试代码和应用程序可以在同一个Run loop中运行;

Cypress运行更快的根本原因:

cypress测试代码和应用程序均运行在cypress全权控制的浏览器中;且他们运行在同一个domain下的不同iframe中,所以cypress的测试代码可以直接操作dom,window object,local storages

Cypress稳定性,可靠性更高的原因:

cypress还可以在网络层进行即时读取和更改网络流量的操作;

cypress背后node.js process控制的proxy进行转发,这使得cypress不仅可以修改进出浏览器的的所有内容,还可以更改可能影响自动化操作的代码;

cypress相对于相对于其他测试工具来说,能从根本上控制整个自动化测试的流程;

Cypress安装(mac):

通过node安装:

安装cypress :npm install cypress

安装成功后输入命令:node_modules/.bin/cypress open打开cypress

 

 

 

 

 

 e-example-recipes-master文件:在github中下载即可

该文件中放着cypress提供的演示项目,下载后,需要安装一个依赖包:npm install cnpm

依赖包安装成功后,使用该包的命令安装相关的配置包文件:cnpm install

在打开node端口前要保证本地端口是开着的,访问网页127.0.0.1,若成功访问,则是开始状态,若失败,使用命令:sudo apachectl start开启本地端口;

开启本地端口后,进入下载的文件夹中的logging-in_xhr-web-forms文件夹,输入命令:npm start;如果报:Error:Cannot find module 'morgan'等类似的缺包错误,使用命令:npm install 包名安装对应的包,再次输入命令:npm start;直到不再报错;

 

 输入命令后展示如图信息,说明node端口启动成功了;

访问:http://localhost:7077/login,即可进入cypress提供的演示项目页面

Cypress运行器:

 

 Cypress默认文件结构:

1、fixtures:测试夹具:主要用来存储测试用例的外部静态数据;

fixture的实际应用场景:如果你的测试需要对某些外部接口进行访问并依赖它的返回值,则可以使用测试夹具而无须真正访问这个接口;

使用测试夹具的好处:

(1)消除了对外部功能模块的依赖;

(2)已编写的测试用例可以使用测试夹具提供的固定返回值,并且你确切知道这个返回值是你想要的;

(3)因为无须真正的发送网络请求,所以测试更快;

2、integration文件夹:测试文件

3、plugin file:插件文件

插件的应用场景:

(1)动态更改来自cypress.json,cypress.env.json,CLI或系统环境变量的已解析配置和环境变量;

(2)修改特定浏览器的启动参数;

(3)将消息直接从测试代码传递到后端;

4、support file:支持文件

该目录是放置可重用配置项,如底层通用函数或全局默认配置;

该目录是放置可重用配置项,如底层通用函数或全局默认配置;

为了方便,每个测试文件运行之前,Cypress都会自动加载支持文件cypress/support/inddex.js;

5、cypress.json文件

 

 这些配置都是默认的,要想改变的话,需要在cypress.json文件中对这些参数进行配置;

Cypress不能支持在一个测试用例文件里访问多个不同域名的URL(可以访问同一个超域下的所有子域),如果访问了多个不同域名的的站名,cypress会直接报错;

Cypress测试用 用例的组织编写

Cypress结合Mocha,Cypress将Mocha硬编码在自己的框架中,所有编写测试用例都是基于Mocha提供的如下基本功能模块:

describe():测试套件;

context():和describe()作用一样;

it():测试用例;

before():所有用例执行前置动作;

beforeEach():单个测试用例执行前置动作;

afterEach():单个用例执行后置动作;

after():所有用例执行后置动作;

only():指定测试用例或者测试套件执行;

skip():指定测试用例或者测试套件跳过不执行;

Cypress测试用例组织编写-断言:

断言是测试用例的必要组成部分,没有断言,我们就不知道测试用例的有效性,到底通过没通过;

Cypress的断言基于Chai断言库,其中就包括BDD和TDD格式的断言;

BDD风格的断言:expect、should、chai断言;

.not:反

.to.not.equal:不匹配

.deep:设置deep标记,然后使用equal和pqoperty断言,该标记可以让其后的断言不是比较队形本身,而是递归比较对象的键值对;

.ok:断言目标为真值;

.true:断言目标为true,与ok的区别是不进行类型转换,只能为true才能通过断言;

.above(value):断言目标大于value,least(),below(),most();

.ownProperty(name):断言目标拥有名为name的自有属性;

.within(numb,numb):长度在两个数字之间;

.closeTo(expected,delta):断言目标数字等于expected,或在期望值的+/-delta范围内;

.oneOf(list):断言目标出现在list数组的某个顶层位置(直接子元素,严格相等):

expect('a').to.be.oneOf(['a','b','c'])

.increase(object,property):断言目标方法会增加指定对象的属性;

Cypress元素定位器:

做UI自动化测试,每个测试用例都会包含对元素的操作;

健壮、可靠的元素定位策略可以保障测试成功率的提高;

相对于其他测试框架来说,Cypress提供了特别得到的定位策略,让你无须过多担心因定位失败而导致的测试失败;

Cypress提供了data-*属性,包含了下面三个定位器:

1、data-cy;

2、data-test;

3、data-testid;

重点:

1、它们都是Cypress专有的定位器,仅用来测试;

2、data-*属性和元素的的行为或样式无关,意味着即使CSS样式或JS行为改变,也不会导致测试失败;

Cypress指令:https://docs.cypress.io/api/commands/selectfile#Arguments

.get():获得元素;

.contains():获得元素;

.should():断言,判断元素;

.click():点击元素;

.check():针对input标签的单选框或者多选框,使其选中;

.log():打印信息;

.getCookies():得到页面cookie;

.setCookies():设置页面cookie;

.clearCookies():清除页面cookie;

.title():获取页面title元素;

.url():获取页面url;

.pause():在页面执行中暂停执行并逐步执行;

.trigger():触发一个元素,可以mousedown,可以morceover等,多用于悬空;

栗子:cy.xpath('元素').trigger('mouseover', { force: true }):找到该元素并悬空,相当于puppeteer中的hover;RF中的 Mouse Over;

.attachFile():上传文件;

栗子:cy.get('元素').attachFile({ filePath: '文件名' });

Cypress PO模式:

1、将每个页面(或者带测试对象)封装成一个class,类里面包含了页面上所有元素及它们的操作方法(单步操作或者功能集合);

2、测试代码和被测代码解耦,使用PO模式后,当页面发生改变,无须改变测试代码,仅改页面代码;Cypress完全支持PageObject模式,但存在一个问题,如果一个测试用例需要访问多个页面对象,就意味着测试中要初始化多个页面对象实例(new Page());

如果一个页面对象需要登录才能访问(大部分场景都是这样),则每次初始化都需要先登录后访问(只有登录后才能重用cookie),着无形增加了测试运行的时间;

Cypress Commands:

1、定义在cypress/support/commands.js中的命令可以像Cypress内置命令那样直接使用,无须import对应的的page(实际上PageObject模式在Cypress看来无非是数据/操作函数的共享)

2、自定义命令可以比PageObject模式运行更快,Cypress和应用程序运行在同一个浏览器,意味着Cypress可以直接发送请求到应用程序并设置运行测试所需要的用户状态,而这一切通常无须通过页面操作,这使得使用了自定义命令的测试更加稳定;

3、自定义命令允许重写Cypress内置命令,意味着可以自定义测试框架并立刻全局应用;

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM