基本介绍

mocha 是一个javascript的测试框架,chai是一个断言库,两者搭配使用更佳,所以合称“抹茶”(其实mocha是咖啡)。“抹茶”特点是: 简单,Hour级学习成本,node和浏览器都可运行,有趣。

关于吹水,充字数的内容我放到了blog最后,因为“抹茶”上手非常的简单,看完blog再阅览一下官网就可以实际动手敲代码了,不足一个小时就可以基本掌握他们了。

Mocha
http://visionmedia.github.io/mocha/

mocha

Mocha 是一个功能丰富的JavaScript测试框架,他可以跑在node和浏览器上,使异步测试变得简单和有趣。Mocha在运行测试用例过程中,当捕获到错误时,依旧能够灵活地运行精确的报告。

Chai 断言库
http://chaijs.com/

chai

Chai是一个BDD/TDD模式的断言库,可以再node和浏览器环境运行,可以高效的和任何js测试框架搭配使用。

BDD,行为驱动开发(注重测试逻辑),TDD是测试驱动开发(注重输出结果)。我们这里的例子都以使用BDD,想扩展这方面知识同学可以搜索更多资料查阅。

二者都可以运行在node和浏览器上,所以后台node单元测试,和前端逻辑js(甚至测试css显示)都可以使用。

 

在node环境上安装使用

Mocha


 start

这是官网上的一段示例代码

如果我们的测试文件名字为test.js,运行mocha就

上面的代码有三个陌生的方法,也正是这三个基本方法构成mocha测试框架的基本使用方式。

describe(moduleName, function)
顾名思义,描述一句测试用例是否正确。首先describe是可以嵌套的,多个describe嵌套的使用用于描述模块下的子模块的关系,上面的代码的意思就是测试Array这个类下面的#indexOf()方法, moduleName是可以随便定义的,即是是中文也可以。 “#”的使用也是一般约定,不喜欢你也会换个或不用也可以。

it(info, function)
真正的测试语句是在it函数的function里面,info也是一句描述性的说明,看得懂就行。function里面的断言决定这条测试是否正确。如果fail的话控制台会把log打印出来。一个it对应一个测试用例,里面可以有多条断言或一条断言。

assert.equal(exp1,exp2)
mocha的断言语句,exp1是否等于exp2. 其他更多用法可以查考mocha的文档,但是这里一般我们使用chai来作为断言库。更加友好的实现我们的断言方式。

 

异步代码测试

上面的官方例子是同步的代码测试,下面看看异步代码如何测试

user.save()是要链接数据库,是个异步操作。

跟第一段代码不同,使用了done。done表示你回调的最深处,也是嵌套回调函数的末端。done()函数如果接受一个error的callback,这句测试为fail。

注意一个it里面应该只能有一个done,如果非要有两个异步分叉,那建议用两个it。

 

before(), after(),beforeEach(),afterEach()

介绍了异步的单元测试,还有一些列方便的辅助方法,方法非常简单明了,我贴个代码出来,大家看看就知道什么意思了。

 

Pending

就是it里面的function留空。mocha默认会pass这条测试。这样的用法其实相当于,某项目负责人定义好了要测试什么内容,之后由相应的开发去实现具体。

 

only 和skip

使用了only之后,这条descibe就只执行only,其他的忽略。skip作用相反,其他会执行,自己会被忽略。两者一起,自己想想都知道。

 

mocha这个测试框架大体都介绍得差不多,最后你会惊奇的发现!!! 控制台输出的内容好丑啊!!为什么??为什么?因为你是个没有Mac的死穷吊!

如果想输出测试结果好看点,可以-R 指令来选择一些输出样式。个人建议这样运行【mocha -R spec yourFile】(为什么我知道?不要说了,泪水啊~~)

 

Chai


 上面说的都是mocha的测试框架,我们是不是漏了Chai,结合Chai非常非常的简单。

chai这里我们只介绍BDD模式的should风格。来看一段官网代码

should的风格非常接近自然语言。bizai.should.be.a(‘HandsomeBody’) = bizai 应该是个帅哥。

这样的should断言风格去代替mocha的 assert。这样两个结合起来,更加友好和方便。

  • should.exist
  • should.not.exist
  • should.equal
  • should.not.equal
  • should.Throw
  • should.not.Throw

剩下需要扩展学习的可以去官网详细学习。

 

浏览器上使用“抹茶”

 

首先需要下载mocha.js,chai.js,mocha.css三个文件。

把三者引入,进行一些设置, 看代码即可。

 

反思

Javascript单元测试,我们真的需要吗?

单元测试,又名模块测试,是开发者在开发过程中,对项目中某个单元模块内部逻辑的检验。这在后台开发中颇为常见,但是在前端领域较为少见。如果我告诉你单元测试什么什么优点啊,你肯定第一时间反驳的第一句就是“花时间写这玩意,有必要吗?”基于web的特性就是快速迭代,一个项目需求时间往往都是快速的,完全没有多余的时间给你去写测试用例,但对于大型的或者需求变更频繁的项目,单元测试就能体验出他的价值。

“怎么单元测试写起来这么麻烦”

—- 说明项目模块之间存在耦合度高,依赖性强的问题。

“怎么要写这么长的测试代码啊”

—- 这是一劳永逸的,并且每次需求变更后,你都可通过单元测试来验证,逻辑代码是否依旧正确。

“我的模块没问题的,是你的模块出了问题”

—- 程序中每一项功能我们都用测试来验证的它的正确性,快速定位出现问题的某一环。

“上次修复的bug怎么又出现了 ”

— 单元测试能够避免代码出现回归,编写完成后,可快速运行测试。

 

接触”抹茶”的起因是项目驱动需要写些单元测试用例,knight大哥推荐了Mocha和Chai 组合来实现我们单元测试的需求。Javascripte单元测试工具比较著名的还有Qunit,JsUnit,JsTestDriver等等,笔者也是刚刚接触,上面的也是基础学习的分享,不敢乱下定论哪款框架好,花时间去研究哪款框架好用,不如试试“抹茶”这种Hour级的学习成本,值得你们尝试学习。

原创文章转载请注明:

转载自AlloyTeam:http://www.alloyteam.com/2013/12/hour-class-learning-costs-javascript-unit-testing-tool-matcha-mocha-and-chai/

  1. 一介布衣 2014 年 11 月 12 日

    通俗易懂,非常不错,可以快速尝试一下,多谢!

  2. passby 2014 年 8 月 5 日

    发音是摩卡
    咖啡口味的一种

  3. 星情 2013 年 12 月 5 日

    感觉还是有挺麻烦的

发表评论