前端自动化测试之chai.js断言库

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

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

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

你可能感兴趣的:(js随笔)