| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 开发测试 -> Cypress 前端测试工具的基本使用和相关命令总结 -> 正文阅读 |
|
[开发测试]Cypress 前端测试工具的基本使用和相关命令总结 |
前端测试工具 Cypress写下博客用于自我复习、总结。 本文主要是自己用于总结用,大部分内容都是直接参考于以下博客链接,各位如有需要,可直接去该博客中学习。 Cypress的官方文档: Cypress介绍
Cypress原理Cypress 运行测试的大致流程: 1、运行测试后,Cypress 使用 webpack 将测试代码中的所有模块 bundle 到一个 js 文件中; 2、然后运行浏览器,并且将测试代码注入到一个空白页中,然后它将在浏览器中运行测试代码; 3、每次测试首次加载 Cypress 时,内部 Cypress Web 应用程序先把自己托管在本地的一个随机端口上,如:http://localhost:65874; 4、在识别出测试中发出的第一个 cy.visit() 命令后, Cypress 会更改本地 URL 以匹配远程应用程序的 Origin(满足同源策略),这使得测试代码和应用程序可以在同一个 Run Loop 中运行。 Cypress的优势而我选择去学习 Cypress 进行一个前端测试的原因是: 1、Cypress 本身拥有着快速、简单、可靠的特点,这使得前端开发人员也可以进行简单快速的测试。开发人员只需要 npm 下载一次,后续无需借助任何其他工具,安装后即可快速创建、编写、运行测试用例。 2、Cypress 运行更快的根本原因: 3、Cypress 稳定性、可靠性更高的原因: Cypress的特性1、拥有历史记录 2、实时重新加载 3、运行结果一致性 4、可调试性 5、自动等待 6、网络流量控制 总结来说,使用 Cypress,开箱即用,想要的内容全部帮我们封装好了。 Windows下建立一个测试项目Cypress 是一个被安装在电脑上的桌面应用,操作系统需要满足如下条件才能正常安装: 安装 Cypress + 创建一个测试项目很简单: 2、确保系统中已经安装 Node.js 3、在空文件夹下生成 package.json 文件:npm init,一路回车,最后输入yes 4、安装 Cypress 5、安装完成。现在项目结构: 虽然还没有写任何内容,但是我们可以通过接下来的步骤,打开 Cypress,也让 Cypress 帮我们创建好项目结构。 6、打开 package.json 文件,对 scripts 中的内容进行改变:
7、打开命令行窗口,在当前项目目录下,运行 Cypress 8、运行效果: 9、运行过首次后,目录结构就发生了改变,Cypress 帮我们建好了一个测试用例,里面就有基本的使用方法。 Cypress的目录结构查看目录结构: 1、fixtures 测试夹具 对于 fixtures 的实际应用场景: 使用测试夹具的好处: 2、integration 测试文件 3、plugins 插件文件 对于 Cypress 为什么还需要自己设置插件: 4、support 支持文件
5、cypress.json 配置项可去其他博客和官网查看: 除了上述各种直接在 cypress.json 文件里更改配置项之外,Cypress 还允许我们通过 Cypress.config() 去获取或覆盖某些配置项,语法如下:
比如,我们在某个测试文件中,就可以查看它,并去修改它:
Cypress的使用现在以目前 Cypress 自动生成的目录结构中的todo.spec.js 为例,对这个测试用例进行测试。 2、单击 todo.spec.js 后,Cypress 就会启动 Test Runner 运行测试。运行成功后,我们就可以看到运行结果页面。 3、调试测试用例 (2)暂停测试并逐步运行、恢复执行 效果: 右上角有两个按钮,左边的是 Resume:继续执行测试用例并运行到结束。 Cypress的基本用法在总结项目结构时,也简单提到了一些基本命令,现在将主要对这些基本命令的功能和用法进行总结。 首先 Cypress 底层依赖于很多优秀的开源测试框架,其中就有 Mocha。Mocha 是一个适用于 Node.js 和浏览器的测试框架,它使得异步测试变得简单。 而 Cypress 就采纳了 Mocha 的 BDD(行为驱动开发)语法。Cypress 将 Mocha 硬编码在自己的框架中,所以编写测试用例都需要基于 Mocha 提供的基本功能模块。 接下来就以目前 Cypress 自动生成的目录结构中的todo.spec.js 为例,具体来看其中的常见功能模块。 1、对于一条可执行的测试用例来说,有以下两个必要的组成部分(1)describe() (2)it() 比如:
效果: 除了上述两个功能模块外,其他功能模块对于一条可执行的测试来说,都是可选的。 2、context()context() 是 describe() 的别名,其行为方式是一致的,我们可以直接用 context() 去替代 describe() 。
3、 cy.log:输出日志4、钩子函数钩子函数的作用就是在所有测试用例执行前做一些预置操作(如:准备测试数据、测试环境)或者在测试结束后做一些后置操作(如:清理测试数据)。 Mocha 提供的 Hook 函数共有四个: 比如:
实际效果: 5、获取元素的方法现在我们知道了一条测试用例的基本组成 describe、it、context、生命周期钩子函数,随后在测试用例中,首先就需要想办法查找页面元素。比如在这一节中,就以这段代码为例,进行说明:
在查找页面元素的时候,分为两大类方法:基本方法和辅助方法。 (1)基本方法① cy.get(selector)该方法用来在 DOM 树中查找 selector 对应的 DOM 元素。比如:
如果可以匹配多个元素,那么就会返回多个元素。(在这里建议适当回顾 CSS 选择器) 在这里需要补充说明,我们看到了上述代码中有一个 首先,做 UI 自动化测试,很明显的,每个测试用例都会包含对元素的操作。因此健壮、可靠的元素定位策略就可以保障测试成功率的提高。而在开发过程中,作为开发人员,我们很清楚,有一部分元素的 ID 或 class 可能会动态生成,除此以外,在开发中,我们可能也会做出把元素 CSS 样式名改掉甚至去掉等操作。那这种情况下,测试必然失败。如果一个元素没有 class、id,或者说动态生成,作为测试又不能更改这些代码,那该如何获取元素,从而进行测试呢? Cypress 就为此提供了一个特别的定位策略,让我们在面对这种情况下,无须过多担心因定位失败而导致的测试失败。它提供了 data-* 属性,就如上面的代码一样。data中包含了下面三个定位器: 它们都是 Cypress 专有的定位器,仅用来测试。data-* 属性和元素的行为或样式无关,意味着即使 CSS 样式或 JS 行为改变,也不会导致测试失败。 注意:在实际项目中,显然这个属性是需要自己将 data-* 属性加到元素中,意味着你得有权限修改代码。 ② cy.find(selector)该方法用来在 DOM 树中搜索已被定位到的元素的后代,并将匹配到的元素返回为一个新的 jQuery 对象,比如:
③ cy.contains(content)该方法用来获取包含指定文本的 DOM 元素,比如:
总结一下:查找页面元素的基本方法 (2)辅助方法单一的基础定位元素方法并不一定能满足复杂的场景,所以 Cypress 还提供了一些辅助方法,可以提高找到元素的准确性。对于具体的辅助方法就不在这里演示了,只不过需要注意,它们都需要在定位到元素后才能使用,和
总结一下:查找页面元素的辅助方法 6、断言当我们获取到了页面元素后,我们就可以使用断言。断言是测试用例的必要组成部分,没有断言就不知道测试用例的有效性。Cypress 的断言基于 Chai 断言库,并且增加了对 Sinon-Chai、Chai-jQuery 断言库的支持,其中就包括 BDD 和 TDD 格式的断言。 BDD 格式的断言:expect 、should 常见的断言方式: (1)长度 have.length
(2)类 not.have.class
(3)值 have.value
(4)文本内容 not.contain
(5)针对元素是否可见 be.visible
(6)针对元素是否存在 not.exist
(7)针对元素状态 be.checked
(8)针对 CSS hava.css
(9)针对回调函数
补充说明:重试重试(Retry-ability)是 Cypress 的核心概念之一,有助于我们写出更加健壮的测试。比如,我们用断言cy.get(‘textarea’).should(‘have.value’,‘poloyy’)。此时我们考虑以下问题: 如果断言发生时,应用程序尚未更新DOM怎么办? Cypress 解决上述问题就用到了重试: 除此以外,在日常测试中,有时候需要多重断言,即获取元素后跟多个断言。在多重断言中,Cypress 将按顺序进行断言,即当第一个断言通过后,会进行第二个断言,通过后进行第三个断言…以此类推。 当然,重试也是有条件的,并不是所有命令都会去不断重试。比如:当命令可能改变被测应用程序的状态时,该命令将不会重试(如: click())。Cypress 仅会重试那些查询 DOM 的命令: cy.get() 、 find() 、 contains() 等 补充:重试的超时时间默认是 4秒,对应的配置项是: defaultCommondTimeout ,如果想改重试的超时时间,在 cypress.json 文件改对应的字段值即可 7、点击事件点击事件用法比较简单,依然是通过 get 获取到元素后,用 .click 的方式去触发。但其中有很多更深的内容,可参考文章: 8、操作页面元素的命令操作页面元素的命令依然是在获取到元素后,再进行操作。比如:
具体总结如下: 9、其余命令参考书通过以上内容,已经可以实现一个基本的测试用例:查找页面元素、操作页面元素、断言、触发事件。比如,现在可以去查看 Cypress 自动生成的简例中,查看简单的测试用例。如下面的第十部分内容。由于 Cypress 的相关命令众多,它还可以获取页面全局对象、操作浏览器、操作文件、发送HTTP请求、操作Cookie等等,所以剩下的命令在需要时将会去博客中按需查找用法: https://www.cnblogs.com/poloyy/p/14031640.html 10、官方测试用例通过对上述命令的简单了解和学习,针对目前 Cypress 自动生成的目录结构中的todo.spec.js 为例,对其中的基本用法再做总结:
Cypress 和项目相关的准备工作1、Cypress 访问项目路径在进入测试前,必不可少的就是先让 Cypress 能够链接上我们的项目,也就是首先先能够访问项目。而想要实现这一步,需要去 cypress.json 中进行设置。配置方法有以下三种:(不要忘记先运行自己的项目) (1)修改环境变量在之前的笔记中,有提到过 cypress.json 其中的配置项。其中,有一个配置项 env,我们可以根据它来设置访问路径:
此时我们想使用时:
效果: 但是这种方式并不是常规的解决方案,因为 Cypress 中本身有直接配置路径的配置项,我们将路径配在这里有点得不偿失。而且我们想要获取路径时,还需要通过 Cypress.env 写出来,很麻烦。对此,可以使用第二种方法。 (2)修改配置项 baseUrl在 cypress.json 中,添加如下配置项:
此时我们想使用时:
需要注意的是:当我们配置了 baseUrl ,测试套件中的 cy.visit() 、 cy.request() 都会自动以 baseUrl 的值作为前缀。但是这并不代表我们就可以不用写 cy.visit(),或者里面可以为空。调用时,至少也要传个空字符串,如上例。并且,当我们需要访问某些网址或者发起接口请求时,在代码中就可以不用再指定请求的 host 或者 url 了。 效果: 但这个方法也有坏处:虽然我们现在 cy.visit() 中已经什么都不用写了,但是如果我们想要在不同的环境中,访问不同的路径该怎么办?手动去改 baseUrl 还是很麻烦。对此,可以使用第三种方法。 (3)启动项目时进行配置这次我们不在 cypress.json 中进行配置,而是在 package.json 中进行配置。之前我们在 package.json 中的 scripts 中,添加过运行的命令。现在相关的配置项,依然设置在这个 scripts 中。我们要做的就是在 cypress open 的时候,直接为其配置不同开发环境下的 baseUrl 即可。那么不同开发环境的不同路径就可以在 package.json 中统一管理。具体来看:
(test测试。dev开发。prod生产) 随后,我们使用 npm run test:gui 运行。 测试是否可行:(不要忘记去掉 cypress.json 中的 baseUrl 配置项) 这种方法和配置 baseUrl 的用法是一样的,只不过是在 npm 运行时,将这个配置项进行了一次配置,从而区分出了不同环境下的不同路径。在这段代码中,还有一些其他用法。 其中的 cypress run 它的作用就是用 cmd 命令行运行 cypress / integration 目录下的所有测试用例,并在运行完成后在控制台输出一个总结的报告。那么如果我们想看到所有测试的结果,比如:成功、失败的测试用例数量、运行时间等,那么就可以直接使用这种方式。 Cypress run 相关的更多内容可参考: 而除了 --config 外,后面还有一个 --env,这就涉及到环境变量了。在这里的含义就是,将 cypress.json 中 env 中的 mode 设置为 dev。这些不同的环境变量,也有它自己的作用。 2、环境变量环境变量就是根据环境的变化,变量会有不同的值。比如最常见的:开发环境、测试环境、生产环境的 URL 肯定不一样,我们可以根据不同的环境选择不同的环境变量。设置环境变量有以下几种方式。 (1)在 cypress.json 文件中设置这是一种最常见的使用方式。写在 cypress.json 中的 env 配置中,在测试运行时,就使用 Cypress.env() 访问这些值。就比如在第一节使用 url 一样:
当不同环境运行时,如果需要访问不同的数据值,我们只需要改环境变量即可了,而不用动到代码。改变的方式就可以采用第一节中使用的,在不同的运行环境下,通过 --env 去配置不同的mode,那么根据不同的 mode 就可以获取不同的访问值。比如:
又或者我们直接在 --env 后,添加我们想要增加的环境变量也可以,但是这样一来在这里添加的内容可能会比较多,麻烦。 这种用法会有一些问题:目前是通过 npm 时传递参数的方式,从而确保在 env 中区分出不同的环境变量,但是如果是团队开发,那么这些文件属于项目共有项,很容易出现冲突。也就是说,这种方法适用于在所有计算机上有相同的值。而为了解决这个问题,有了接下来的方法。 (2)创建一个 cypress.env.json 文件在项目中是没有这个文件的,我们需要自己去创建 cypress.env.json 文件,在项目的根目录下(cypress.json 同级目录下)。它的作用是,每次运行时,Cypress 将会自动检查它,并且里面的值会覆盖 cypress.json 中重名的环境变量。这样一来第一种方案下的问题就解决了。此时,在团队开发时,如果将cypress.env.json 添加到.gitgnore文件中,那么文件中的值对于每个开发人员的计算机都是不同的,不会互相影响。 这种方法也会有问题:我们需要在项目中单独多处理一个新文件,而且也有可能会出现覆盖掉关键的同名环境变量的情况,在纠错时就很难发现了。 但没关系,只要注意到这些问题,我们依然可以采用这种方案。 (3)导出为 CYPRESS_*针对第二个问题中,项目需要单独多处理一个新文件,Cypress 也提供了一种新解决方案:在计算机中,任何以 CYPRESS_ 或 cypress_ 开头的环境变量都会自动被 Cypress 识别出来,随后直接覆盖 cypress.json 和 cypress.env.json 文件中重名的环境变量。这样一来,相关文件完全由计算机自己持有。 (4)可以通过 test configuration 设置环境变量当然,也还有一种最基本的方法,就是给测试用例或测试用例集单独设置环境变量,但是这样很没必要,因为它会覆盖其他方式设置的环境变量。 |
|
开发测试 最新文章 |
pytest系列——allure之生成测试报告(Wind |
某大厂软件测试岗一面笔试题+二面问答题面试 |
iperf 学习笔记 |
关于Python中使用selenium八大定位方法 |
【软件测试】为什么提升不了?8年测试总结再 |
软件测试复习 |
PHP笔记-Smarty模板引擎的使用 |
C++Test使用入门 |
【Java】单元测试 |
Net core 3.x 获取客户端地址 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/17 20:33:59- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |