当前位置: 首页 > news >正文

Web 自动化神器 TestCafe(三)—用例编写篇

一、用例编写基本规范

1、 fixture 测试夹具

使用 TestCafe 编写测试用例,必须要先使用 fixture 声明一个测试夹具,然后在这个测试夹具下编写测试用例,在一个编写测试用例的 js 或 ts 文件中,可以声明多个测试夹具

  • fixture(测试夹具)的声明 import 'testcafe' // 声明一个测试夹具 百度测试 fixture `登录功能测试` 上面是官方文档中的 demo,调用 fixture 方法声明测试夹具的时候,使用的是模板字符串传参的形式,对于没用过这种语法的小伙伴来说看起来不太好理解,可以按下面这个使用括号调用函数的形式来写。 import 'testcafe' // 声明一个测试夹具 新浪测试 fixture('注册功能测试')
  • fixture.page 方法: 通过 fixture.page 方法,我们可以在测试夹具打开一个要进行测试的页面 fixture('百度登录测试').page('https://www.baidu.com');

2、test 测试函数

2.1、测试用例编写

  声明了测试夹具之后,就可以定义测试用例了,在testcafe中写测试用例,直接调用测试函数test, 并传递一个内部带有测试代码的函数即可 。
  import 'testcafe'
// 在测试夹具中打开百度页面
fixture('百度案例').page('https://www.baidu.com');// 第一条用例:百度输入 学习点击搜索
test('用例1', async t => {await t.typeText('#kw', "学习").click('#su');
});// 第二条用例:百度输入 python 点击搜索
test('用例2', async t => {await t.typeText('#kw', "python").click('#su');
});
  • 关于上面测试函数 test 调用的说明 test 方法的第一个参数为测试用例的名称,第二个参数是写测试代码的函数 关于参数 t: 在 testcafe 中 所有测试动作都需要使用 测试控制器对象的异步功能来实现。箭头函数定义的参数 t 就是用来接收测试控制器对象的。 上面写测试代码的函数是使用 async/await 语法定义的函数,这也是 testcafe 的推荐写法,在执行相关测试动作时,如果要等待前一个动作执行完成,再调用下一个动作或动作链,只需要进行等待的动作前面加上关键字 await 即可。

2.2、指定测试开始页面

在 fixture 中可以通过 page 方法去打开一个测试的初始页面,当然在 test 方法中如果不用 fixture 打开的初始页面,也可以使用 tes.page 自定义一个测试初始打开页面,如下:

  fixture(`百度案例`).page `https://www.taobao.com`;test.page('https://www.baidu.com')('百度搜索功能', async t => {await t.typeText('#kw', "hao123").click('#su');
});

二、测试前后置处理

在工作中执行测试时,大多数的用例执行,都会有一些用例前置准备或者后置清理工作要去做。关于前后置处理的方法,我们称之为钩子函数,testcafe 提供了两种钩子,一种叫测试钩子,一定叫固定钩子。

1、测试钩子

测试钩子指的是每一条测试用例执行之前和执行之后,会执行的钩子函数,我们称之为测试钩子,关于测试钩子 Testcafe 提供了如下四个方法。

  • fixture.beforeEach 方法

测试夹具 fixture 提供了一个 beforeEach 方法,可以给该 fixture 中的每一条测试用例设置前置执行的操作。案例代码如下:

  import 'testcafe'fixture(`百度案例`).page('https://www.baidu.com')// 设置每条用例执行的前置操作.beforeEach(async t => {await t.typeText('#kw', "前置步骤").click('#su')});
  • fixture.afterEach 方法
  fixture(`百度案例`).page('https://www.baidu.com')// 设置每条用例执行的前置操作.beforeEach(async t => {await t.typeText('#kw', "前置步骤")}).afterEach(async t => {await t.typeText('#kw', "后置步骤").click('#su')});

上面这两种方法可以给通过测试夹具 fixture 给该夹具下的每条用例设置前后置操作。如果某一条用例需要单独的设置前后置,则需要使用 test.before 方法和 test.after 方法。

  • test.before 方法

给单独的用例设置前置操作

  test.before(async t => {await t.typeText('#kw', "test设置的前置")})('百度搜索功能', async t => {await t.typeText('#kw', "python").click('#su');})
  • test.after 方法

给单独的用例设置后置操作

  test.before(async t => {await t.typeText('#kw', "test设置的前置")})('百度搜索功能', async t => {await t.typeText('#kw', "python").click('#su');}).after(async t => {await t.typeText('#kw', "后置方法中输入的内容").click('#su');})   
  • 测试钩子和测试代码之间共享数据 如果需要在测试钩子和测试代码直接共享数据的话,我们可以通过测试上下文(t.ctx 属性)来进行传递。在测试钩子中将数据保存到测试上下文中,在测试方法中再去测试上下文中获取数据。具体案例如下: test.before(async t => { // 在测试钩子中通过t.ctx保存数据 t.ctx.token = 'musen123' }) ('百度搜索功能', async t => { // 测试钩子中通过t.ctx获取数据 console.log(t.ctx.token) })

2、夹具钩子

  夹具钩子和测试钩子不同,夹具钩子只会在夹具中的第一个测试开始之前和最后一个测试完成之后运行。要添加夹具钩子,可以使用fixture.before和fixture.after方法来定义定义。另外在夹具钩子中无法访问测试页面,也无法对测试页面进行相关操作。
  • fixture.before 方法
  fixture(`百度案例`)
.page('https://www.baidu.com')
.before( async ctx => {// 前置夹具钩子console.log(ctx)
})
  • fixture.after 方法
  fixture(`百度案例`)
.page('https://www.baidu.com')
.after( async ctx => {console.log(ctx)// 后置夹具钩子
});
  • 夹具钩子和测试代码之间共享数据 传递给 fixture.before 和 fixture.after 方法的钩子函数接收一个夹具上下文的参数 ctx。需要进行数据传递时,我们可以在夹具钩子中把数据保存到 ctx 的属性中。在测试代码中使用 t.fixtureCtx 来获取。案例代码如下:
  fixture(`百度案例`).before(async ctx  => {// 夹具钩子中保存数据ctx.someProp = 123;})test('Test1', async t => {// 测试代码中获取数据console.log(t.fixtureCtx.someProp); 
});

三、跳过和选择用例

1、跳过用例

  在执行测试的时候,如果说有用例不想执行,那么我们可以设置跳过用例执行。关于跳过用例执行testcafe中提供了fixture.skip 和test.skip方法。
  • fixture.skip:跳过整个 fixture 的用例
  • test.skip:跳过当前的测试用例 // 跳过夹具F1中所有的用例 fixture.skip('F1'); test('F1-->用例1', async t => { }); test('F1-->用例2', async t => { }); fixture('F2'); // 跳过这一条用例 test.skip('F2-->用例1', async t => { }); test('F2-->用例1', async t => { });

2、选择用例

另外我们也可以使用 fixture.only 和 test.only 来筛选执行需要的用例,只有选择的用例或夹具运行,而所有其他应被跳过

  • fixture.only:选择执行的测试夹具
  • test.only:选择执行的测试用例 // 选择F1这个测试夹具 fixture.only('F1'); test('F1-->用例1', async t => { }); test('F1-->用例2', async t => { }); fixture('F2'); // 选择这一条用例 test.only('F2-->用例1', async t => { }); test('F2-->用例1', async t => { });

以上就是 testcafe 中用例编写的所有内容啦,后续会持续更新 TestCafe 的相关使用文档。

相关文章:

  • 免费图书教材配套资料:Spark大数据技术与应用(第2版)
  • 基于opencv+ImageAI+tensorflow的智能动漫人物识别系统——深度学习算法应用(含python、JS、模型源码)+数据集(一)
  • 【ARM 嵌入式 编译 Makefile 系列 18 -- Makefile 中的 export 命令详细介绍】
  • C++学习之路(二)C++如何实现一个超简单的学生信息管理系统?C++示例和小项目实例
  • 4G5G智能执法记录仪在保险公司车辆保险远程定损中的应用
  • ubuntu22.04中ros2 安装rosbridge
  • JVM中判断对象是否需要回收的方法
  • STM32F10x进入低功耗模式
  • HuggingFace-利用BERT预训练模型实现中文情感分类(下游任务)
  • 机器学习与计算机视觉 D2
  • 能否在一台电脑上安全地登录多个Facebook账号?
  • AI“胡说八道”?怎么解?
  • 前端JS模块化对外暴露的三种方法
  • Linux C 基于tcp和epoll在线聊天室
  • SpringCloud原理-OpenFeign篇(一、Hello OpenFeign项目示例)
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • CSS 提示工具(Tooltip)
  • ES学习笔记(12)--Symbol
  • js面向对象
  • linux安装openssl、swoole等扩展的具体步骤
  • vue 配置sass、scss全局变量
  • 动态规划入门(以爬楼梯为例)
  • 规范化安全开发 KOA 手脚架
  • 机器学习学习笔记一
  • 前端临床手札——文件上传
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 如何进阶一名有竞争力的程序员?
  • 字符串匹配基础上
  • RDS-Mysql 物理备份恢复到本地数据库上
  • ​批处理文件中的errorlevel用法
  • # Panda3d 碰撞检测系统介绍
  • #NOIP 2014#Day.2 T3 解方程
  • (C)一些题4
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)一些感悟
  • ./configure,make,make install的作用(转)
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NET BackgroundWorker
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .Net中wcf服务生成及调用
  • .ui文件相关
  • /var/lib/dpkg/lock 锁定问题
  • :“Failed to access IIS metabase”解决方法
  • ?php echo $logosrc[0];?,如何在一行中显示logo和标题?
  • @PreAuthorize注解
  • @SentinelResource详解
  • [Android] Implementation vs API dependency
  • [BZOJ4016][FJOI2014]最短路径树问题
  • [C# 开发技巧]实现属于自己的截图工具
  • [CentOs7]搭建ftp服务器(2)——添加用户
  • [FC][常见Mapper IRQ研究]