Karma和Jasmine自动化单元测试
Karma和Jasmine自动化单元测试
Nodejs领域: Jasmine做单元测试,Karma自动化完成单元测试,Grunt启动Karma统一项目管理,Yeoman最后封装成一个项目原型模板,npm做nodejs的包依赖管理,bower做javascript的包依赖管理。
Karma介绍
Karma是一个基于Node.js的JavaScript测试执行过程管理工具(Test Runner)
Karma 是针对连通浏览器的一个框架无关测试运行器。每一个测试结果对应每个浏览器,它的测试和显示都是通过命令行暴露给开发者的,这样他们就可以看到浏览器测试的通过或失败。
Jasmine介绍
Jasmine是单元测试框架,可用Karma让Jasmine测试自动化完成。
Jasmine 是一个行为驱动的测试开发框架,用于对 JavaScript 代码进行测试。它不依赖其它任何 JavaScript 框架,也不需要 DOM。它的语法简洁、明确,写测试非常容易。
Karma的安装
先安装: node / npm
~ D:\workspace\javascript>mkdir karma
~ D:\workspace\javascript>cd karma
~ D:\workspace\javascript\karma>npm install -g karma
# 测试是否安装成功
~ D:\workspace\javascript\karma>karma start
INFO [karma]: Karma v0.10.2 server started at http://localhost:9876/
INFO [Chrome 28.0.1500 (Windows 7)]: Connected on socket nIlM1yUy6ELMp5ZTN9Ek
从浏览器看到karam界面。

Karma + Jasmine配置
初始化karma配置文件karma.conf.js
输入命令 : karma init // 全部enter 下一步;
~ D:\workspace\javascript\karma>karma init
Which testing framework do you want to use ?
Press tab to list possible options. Enter to move to the next question.
> jasmine
Do you want to use Require.js ?
This will add Require.js plugin.
Press tab to list possible options. Enter to move to the next question.
> no
Do you want to capture a browser automatically ?
Press tab to list possible options. Enter empty string to move to the next question.
> Chrome
>
What is the location of your source and test files ?
You can use glob patterns, eg. "js/*.js" or "test/**/*Spec.js".
Enter empty string to move to the next question.
>
Should any of the files included by the previous patterns be excluded ?
You can use glob patterns, eg. "**/*.swp".
Enter empty string to move to the next question.
>
Do you want Karma to watch all the files and run the tests on change ?
Press tab to list possible options.
> yes
Config file generated at "D:\workspace\javascript\karma\karma.conf.js".
安装集成包karma-jasmine
npm install karma-jasmine
自动化单元测试
3步准备工作:
- 创建源文件:用于实现某种业务逻辑的文件,就是我们平时写的js脚本
- 创建测试文件:符合jasmineAPI的测试js脚本
- 修改karma.conf.js配置文件
1). 创建源文件:用于实现某种业务逻辑的文件,就是我们平时写的js脚本
有一个需求,要实现单词倒写的功能。如:”ABCD” ==> “DCBA”
~ vi src.js
function reverse(name){
return name.split("").reverse().join("");
}
2). 创建测试文件:符合jasmineAPI的测试js脚本
describe("A suite of basic functions", function() {
it("reverse word",function(){
expect("DCBA").toEqual(reverse("ABCD"));
});
});
3). 修改karma.conf.js配置文件
我们这里需要修改:files和exclude变量
module.exports = function (config) {
config.set({
basePath: '', //文件的路径
frameworks: ['jasmine'], // 使用的测试框架
files: ['*.js'], // 测试文件的
exclude: ['karma.conf.js'], // 排除测试的文件
reporters: ['progress'],
port: 9876, // 端口
colors: true,
logLevel: config.LOG_INFO,
autoWatch: true, // 修改后自动更新
browsers: ['Chrome'], // 浏览器
captureTimeout: 60000,
singleRun: false
});
};
启动karma karma start karma.conf.js
单元测试全自动执行
~ D:\workspace\javascript\karma>karma start karma.conf.js
INFO [karma]: Karma v0.10.2 server started at http://localhost:9876/
INFO [launcher]: Starting browser Chrome
WARN [launcher]: The path should not be quoted.
Normalized the path to C:\Program Files (x86)\Google\Chrome\Application\chrome.exe
INFO [Chrome 28.0.1500 (Windows 7)]: Connected on socket bVGffDWpc1c7QNdYye_6
INFO [Chrome 28.0.1500 (Windows 7)]: Connected on socket DtTdVbd4ZsgnMQrgye_7
Chrome 28.0.1500 (Windows 7): Executed 1 of 1 SUCCESS (3.473 secs / 0.431 secs)
Chrome 28.0.1500 (Windows 7): Executed 1 of 1 SUCCESS (0.068 secs / 0.021 secs)
TOTAL: 2 SUCCESS
总结:及附 jasmine 语法;

Karma和istanbul代码覆盖率
增加代码覆盖率检查和报告,增加istanbul依赖
npm install karma-coverage
修改karma.conf.js配置文件
~ vi karma.conf.js
reporters: ['progress','coverage'],
preprocessors : {'src.js': 'coverage'},
coverageReporter: {
type : 'html',
dir : 'coverage/'
}
启动karma start,在工程目录下面找到index.html文件,coverage/chrome/index.html
打开后,我们看到代码测试覆盖绿报告
问题解决
karma start karma.conf.js总是提示 jasmime-core没有安装时,使用全局安装解决;
npm install -g karma
npm install -g jasmine-core
npm install -g karma-jasmine
执行karma init时报错如下
> readline.js:561
this.line = this.line.slice(this.cursor);
使用 Git Bash 会报以上错,换用 windows 自带的命令行工具就 OK 了。
总结,及附jasmine 语法介绍;

参考文档

浙公网安备 33010602011771号