版权声明:本文为博主原创文章,未经博主允许不得转载。

chai.js简介

chai.js 是一套TDD(测试驱动开发)/BDD(行为驱动开发)的断言库。包含有3个断言库支持BDD风格的expect/should和TDD风格的assert,这里主要说明expect/should库,BDD风格说简单的就是你的测试代码更加的语义化,让你的断言可读性更好,expect/should库都支持链式调用可以在node和浏览器环境运行,可以高效的和任何js测试框架搭配使用。

**说明:**BDD,行为驱动开发(注重测试逻辑),TDD是测试驱动开发(注重输出结果)。

本文一起具体来学习一下chai.js的BDD模块,BDD模块有两种,一种是expect,一种是sshould。二者使用相同的链式语言来组织断言,但不同在于他们初始化断言的方式:expect使用构造函数来创建断言对象实例,而should通过为Object.prototype新增方法来实现断言(所以should不支持IE),因此为了兼容IE浏览器,我们先来一起学习一下expect模块的相关api内容。

except模块的相关api

语言链修饰符

语言链修饰符是单纯作为语言链提供以期提高断言的可读性。除非被插件改写否则它们一般不提供测试功能。主要包括如下相关的修饰符:

  1. to
  2. be
  3. been
  4. is
  5. that
  6. which
  7. and
  8. has
  9. have
  10. with
  11. at
  12. of
  13. same

例如:可以采用任何组合修饰符的方式来编写测试用例

expect(foo).to.is.has.which.equal('bar');
expect(goodFn).be.has.at.same.throw(Error);  

说明:修饰符可以任意的增加编写,只是为了增加可读性,并未其他实质性的作用

具体api说明

  • . any/all
//any:用于检测该参数是否与实际值所对应的构造函数相匹配,在keys断言之前使用any标记(与all相反)
expect(foo).to.have.any.keys('bar', 'baz')

//all:在keys断言之前使用all标记(与any相反)
expect(foo).to.have.all.keys('bar', 'baz')
  • .a(type) / .an(type): 用来断言变量类型
// 类型断言
expect('test').to.be.a('string');
expect({ foo: 'bar' }).to.be.an('object');
expect(null).to.be.a('null');
expect(undefined).to.be.an('undefined');
expect(new Error).to.be.an('error');
expect(new Promise).to.be.a('promise');
expect(new Float32Array()).to.be.a('float32array');
  • .include(value) / contains(value):Object | String | Number,包含某个内容

include()和contains()即可作为属性类断言前缀语言链又可作为作为判断数组、字符串是否包含某值的断言使用。当作为语言链使用时,常用于key()断言之前

expect([1, 2, 3]).to.include(2)
expect('foobar').to.include('bar')
expect({ foo: 'bar', hello: 'universe' }).to.include.keys('foo')
  • not 跟在链式调用后面的否定断言
expect(foo).to.not.equal('bar');
expect(goodFn).to.not.throw(Error);
expect({ foo: 'baz' }).to.have.property('foo').and.not.equal('bar');
  • deep 用来深度比较2个对象,一般用在equal和property前面
expect(foo).to.deep.equal({ bar: 'baz' });
expect({ foo: { bar: { baz: 'quux' } } }).to.have.deep.property('foo.bar.baz', 'quux');
  • .ok 断言目标是否为真(只判断值是否为真,类似==,隐式转换)
expect('everthing').to.be.ok;
expect(1).to.be.ok;
expect(false).to.not.be.ok;  
  • .true/.false 断言目标是否为布尔值true,false(这里与ok的区别是不进行类型转换,只能为true/false才能通过断言)
expect(true).to.be.true;
expect(1).to.not.be.true;
expect(false).to.be.false;
expect(0).to.not.be.false;  
  • .null 断言目标为null
expect(null).to.be.null;
expect(undefined).not.to.be.null;  
  • .undefined 断言目标为undefined
expect(undefined).to.be.undefined;
expect(null).to.not.be.undefined;
  • NaN 断言目标为NaN
expect('foo').to.is.be.NaN;
expect(4).is.be.NaN;
  • exist 断言目标存在,既不为null,也不为undefined
expect('hi').is.be.to.exist;
expect(null).is.to.be.exist;
expect(un).is.been.exist;
  • empty 断言目标的长度为0。对于数组和字符串,它检查length属性,对于对象,它检查可枚举属性的数量
expect([]).to.be.empty
expect('').to.be.empty
expect({}).to.be.empty
  • arguments 断言目标是一个参数对象arguments
function(){expect(arg).to.be.has.arguements;}
  • equal(value) 断言目标严格等于(===)value。另外,如果设置了deep标记,则断言目标深度等于value
expect('hello').to.equal('hello')
expect(42).to.equal(42)
  • eql(value) 断言目标深度等于value,相当于deep.equal(value)的简写
expect({ foo: 'bar' }).to.eql({ foo: 'bar' })
expect([1, 2, 3]).to.eql([1, 2, 3])
  • above(value) 断言目标大于(超过)value,也可接在length后来断言一个最小的长度。相比直接提供长度的好处是提供了更详细的错误消息
expect(50).to.be.above(12);
expect([1, 2, 3]).to.have.length.above(2);
  • least(value) 断言目标不小于,也可接在length后来断言一个最小的长度。相比直接提供长度的好处是提供了更详细的错误消息
expect(23).to.be.least(12);
expect([1, 2, 3]).to.have.length.least(2);
  • below(value) 断言目标小于,也可接在length后来断言一个最小的长度。相比直接提供长度的好处是提供了更详细的错误消息
expect(5).to.be.below(12);
expect([1, 2, 3]).to.have.length.below(5);
  • most(value) 断言目标不大于,也可接在length后来断言一个最小的长度。相比直接提供长度的好处是提供了更详细的错误消息
expect(5).to.be.most(12);
expect([1, 2, 3]).to.have.length.most(5);
  • length 设置.have.length标记作为比较length属性值的前缀
expect('foo').to.have.length.above(2)
expect([1, 2, 3]).to.have.length.within(2, 4)
  • lengthof() 断言目标的length属性为期望的值
expect('foo').is.lengthOf(2)
expect([1, 2, 3]).to.has.lengthOf(2, 4)
  • match(RegExp) 断言目标匹配到一个正则表达式
expect(2323232).is.to.be.match(/^\d+/);
  • string(string) 断言目标字符串包含另一个字符串
expect('foo').to.has.string('fo');

其他相关学习链接

官网: http://chaijs.com/

API: http://chaijs.com/api

中文API :http://www.jianshu.com/p/f200a75a15d2

其他学习: http://blog.sina.com.cn/s/blog_62ea758a0102wyzi.html

欢迎大家相互学习交流
说明:转载请联系作者并获得作者授权,同时注明转载的地址和作者

前端自动化测试之chai.js断言库相关推荐

  1. Chai.js断言库expect常用API

    Chai.js断言库API中文文档:https://www.jianshu.com/p/f200a75a15d2 // equal 相等或不相等 expect(4 + 5).to.be.equal(9 ...

  2. 测试公开课资料系列02--Postman之chai.js断言应用

    前言  如果要挖井,就要挖到水出为止.    明晚公开课给大家讲讲如何用chai.js断言,有用过postman只会右侧点来自动生成断言代码,或在公 司应用postman的朋友们都来听听.  一.ch ...

  3. 前端自动化测试之多浏览器兼容测试平台F2etest全面踩坑记录

    PPT更详尽:F2etest兼容性平台&UIrecorder脚本录制回放 本文参考:http://shaofan.org/f2etest/,https://www.jianshu.com/p/ ...

  4. csdn--接口自动化测试之postman如何设置断言

    目录 一.前言 二.postman为啥要设置断言 三.postman设置断言的流程 四.在postman设置断言,存在新老版本的断言语法不一致的情况下,目前两种语法都可以使用. 一.前言 hello呀 ...

  5. 【node测试系列】几款前端测试断言库(Assertions lib)的选型总结

    参考文章 http://blog.lvscar.info/post/... 在编写前端测试代码的过程中, 几乎所有的测试框架都提供了根据功能.模块(module ,spec )来切分测试用例的设计, ...

  6. react项目中使用mocha结合chai断言库进行单元测试

    react项目中使用mocha结合chai断言库进行单元测试 git地址:https://github.com/yancekang/... 如果对你有所帮助,感谢start 项目搭建 create-r ...

  7. 在Maven+Spring项目中使用Node.js的Gulp进行前端自动化构建

    摘要: 在Maven+Spring项目中使用Node.js的Gulp进行前端自动化构建 刚开始打算进行前后端分离开发,后来发现在使用JSP或者Freemarker做动态页面时,想发挥这些自动化构建工具 ...

  8. postman断言—Chai.js语法总结

    一.名词解释 BDD(行为驱动开发) Behavior Driven Development,一种敏捷开发技术: 灰盒测试.黑盒测试属于BDD,主要测试代码是否符合产品需求,更偏于代码的功能逻辑: T ...

  9. 前端自动化开发工作流模板

    作者:戴嘉华 转载请注明出处,保留原文链接和作者信息 1. 前端自动化工作流简介 每种项目都有自己特定的开发流程.工作流程.从需求分析.设计.编码.测试.发布,一个整个开发流程中,会根据不同的情况形成 ...

最新文章

  1. Linux7 CENTOS7修改root密码
  2. eclipse新建一个java_Eclipse中新建一个java源文件的步骤
  3. [YTU]_2354 (H 实现复数类中的加运算符重载【C++运算符重载】)
  4. c语言整行乘非整形等于什么意思,C语言--整形升级寻常算术转换
  5. 山寨“饿了么”应用中添加菜品数量按钮效果
  6. 专访阿里云专有云马劲,一个理性的理想主义者
  7. matlab实验题目,MATLAB实验题目
  8. 中国铁路官宣:高铁Wi-Fi将融合5G技术
  9. Pashmak and Parmida's problem(树状数组)
  10. 碰运气解决LATEX中中文颜色深浅不一的问题
  11. 通过BeanPostProcessor理解Spring中Bean的生命周期及AOP原理 1
  12. 软硬件版本号命名规范及原则
  13. Spring Boot 接入 Dubbo 指导文档
  14. Win7 开启自带WIFI进行手机抓包
  15. Windows7旗舰版SP1_64位2018.10(装机版)
  16. Lucas-Kanade算法
  17. vue3组合式Composition API之ref函数的具体用法
  18. go环境搭建开发工具安装配置
  19. android usb 默认mtp,usb修改为默认MTP模式
  20. 聊聊 Apache、Tomcat 静态网页、动态网页

热门文章

  1. 【无标题】https://e-cloudstore.com/ec/api/applist/index.html#/
  2. 内存管理 —— 虚拟存储的基本概念
  3. 07.显示系统:第005课_Vsync机制:第004节_surface使用vsync过程代码分析
  4. “ConnectionString属性尚未初始化”问题解析
  5. 9 本优秀的 R 语言免费电子书
  6. C++ 中scanf的返回值
  7. “spoolsv.exe应用程序错误”的解决方法
  8. 任务调度 的常用的基本方式
  9. 怎么把静态图片做成动态图?简单三步让图片动起来
  10. go cobra初试