什么时候使用Karma?
在真实浏览器里测试。
在多种浏览器里进行测试(包括桌面、移动)。
在本地开发环境执行测试。
想在持续集成CI内运行测试。
想在每次保存代码时,自动执行测试。
热衷于terminal小黑屏。
不想陷入令人厌烦的测试生活。
想使用Istanbul自动生成coverage报告。
想在源码中使用RequireJS。
Karma:
Karma一直作为一个Test Runner而存在的,只是用来测试的框架。不过到目前为止,它支持以下流行的测试框架。
Mocha
Jasmine
QUnit
Karma对各种Test Framework的支持是以插件的模式进行支持的
创建一个test文件夹,用于存放自己写的单元测试代码。
Mocha:
Mocha 既是测试框架,也是一个测试 runner ,它主要用在 Node.js里的单元测试,当然也可以用在浏览器端,不过得手动配置各种适配脚本。
所谓”测试框架”,就是运行测试的工具。通过它,可以为JavaScript应用添加测试,从而保证代码的质量。
测试脚本里面应该包括一个或多个describe块,每个describe块应该包括一个或多个it块。
describe块称为”测试套件”(test suite),表示一组相关的测试。它是一个函数,第一个参数是测试套件的名称(”加法函数的测试”),第二个参数是一个实际执行的函数。
it块称为”测试用例”(test case),表示一个单独的测试,是测试的最小单位。它也是一个函数,第一个参数是测试用例的名称(”1 加 1 应该等于”2”),第二个参数是一个实际执行的函数。
一个describe是一个it的集合。describe包含n个it,一个it包含n个判断断言
var expect = require('chai').expect;
//上面代码引入的断言库是chai,并且指定使用它的expect断言风格。
expect断言的优点是很接近自然语言
基本上,expect断言的写法都是一样的。头部是expect方法,尾部是断言方法,比如equal、a/an、ok、match等。两者之间使用to或to.be连接。
如果expect断言不成立,就会抛出一个错误。事实上,只要不抛出错误,测试用例就算通过。
如果测试脚本是用ES6写的,那么运行测试之前,需要先用Babel转码。
Mocha默认每个测试用例最多执行2000毫秒,如果到时没有得到结果,就报错。对于涉及异步操作的测试用例,这个时间往往是不够的,需要用-t或–timeout参数指定超时门槛。
另外,Mocha内置对Promise的支持,允许直接返回Promise,等到它的状态改变,再执行断言,而不用显式调用done方法。
Mocha在describe块之中,提供测试用例的四个钩子:before()、after()、beforeEach()和afterEach()。它们会在指定时间执行。
describe('hooks', function() {
before(function() {
// 在本区块的所有测试用例之前执行
});
after(function() {
// 在本区块的所有测试用例之后执行
});
∏
beforeEach(function() {
// 在本区块的每个测试用例之前执行
});
afterEach(function() {
// 在本区块的每个测试用例之后执行
});
// test cases
});
chai
chai是一套TDD(测试驱动开发)/BDD(行为驱动开发)的断言框架
所谓”断言”,就是判断源码的实际执行结果与预期结果是否一致,如果不一致就抛出一个错误。
所有的测试用例(it块)都应该含有一句或多句的断言。它是编写测试用例的关键。断言功能由断言库来实现,Mocha本身不带断言库,所以必须先引入断言库。
包含有3个断言库支持BDD风格的expect/should和TDD风格的assert,
,expect/should库都支持链式调用,有如下的链式API,多部分都是英文的介词和be动词,可以用来做谓语
to
be
been
is
that
and
has
have
with
at
of
same
not 跟在链式调用后面的否定断言
Sinon
mock更侧重与是测试代码是否作出了行为,最终mock.verify()的调用会验证所有的期望是否符合.