单元测试工具 - karma
在离开上一家公司之前,team leader 在我离开前留给了我最后几个关键字:karma,断言库,JASMINE,QUNIT,MOCHA。
可一直拖拖沓沓的,没有去了解。直到今天,才终于抽出心情和时间来研究它。
在文章开始之前,首先对前 team leader — 满爷 表示感激。
虽然你不是我所见过的最优秀的前端,但你是我所见的最乐意与小伙伴share经验心得的 team leader。
OK,言归正传,开始主题...
关于karma
Karma是一个基于Node.js的JavaScript测试执行过程管理工具(Test Runner)。
该工具可用于测试所有主流Web浏览器,也可集成到CI(Continuous integration)工具,也可和其他代码编辑器一起使用。
这个测试工具的一个强大特性就是,它可以监控(Watch)文件的变化,然后自行执行,通过console.log显示测试结果。
karma的安装
这里我默认看本文的人都对node.js有一定的了解了,不再对node.js运行环境的搭建细节啰嗦了。
如果你实在对node.js了解不深,或者可以先去看看我的另一文——grunt学习笔记。
里面有提到关于node.js环境搭建的小细节,地址:http://www.cnblogs.com/czf-zone/p/3649657.html
ok,继续回归正题。
安装步骤:
1.安装node.js
.全局安装karma
npm install -g karma
PS:安装好karma后,会自动安装好一个断言库——JASMINE。既然karma这么友好的帮我们准备了一个断言库,那我们就直接拿它来进行单元测试呗。
.打开node组件全局安装目录 node_global ,然后在里面创建一个txt文件,其内容如下:
@IF EXIST "%~dp0\node.exe" (
"%~dp0\node.exe" "%~dp0\node_modules\karma\bin\karma" %*
) ELSE (
node "%~dp0\node_modules\karma\bin\karma" %*
)
保存,然后将这个txt文件连同拓展名一并重命名为 karma.cmd
PS:网上很多无责任转载的文章,都漏了这一步,在此森森的BS之,你特么转文章的时候,就不能先实践下么?
.打开命令行工具,执行:
karma start
出现服务启动成功的提示,说明安装成功了。
karma配置
关于配置,网络上其实有一些文章也有提到,但说得不够详细,没有站在读者的角度去写。
最明显的就是整个配置过程,目录结构是怎样的,完全是只字不提...
所以我对自己说,要么直接转载别人的文章,要么自己写一篇,然后把配置的细节补上。
so...这里我用我自己的一个练习小项目来举例,一步步说说我的配置过程,拿实例说话。
PS:项目中会用到 grunt 等一些东西,请自行忽略,我们只关心karma,OK?

上面就是大概目录了。我们要关注的点有:
baseCls.min.js - 通过编译后生成的基类库js文件,也是我要测试的目标文件。
karma目录 - 为了使用 karma 单元测试工具而建的一个目录,里面存放 karma 配置文件和测试脚本。
karma.config.js - karma配置文件
FuncDelayer_Test.js - FuncDelayer类的测试脚本(看过我之前文章的应该知道FuncDelayer是啥东东了,JS函数延迟器)
关于karma.config.js,可以在karma目录下运行命令行工具,然后执行命令
karma init
然后不停的回车,就会生成一个karma.conf.js文件(你没看错,就是karma.conf.js)
这和我所说的karma.config.js内容上没什么区别,只是出于个人习惯,我把它重命名了而已。
当然你也可以直接手动创建,它其实就是一JS文件,怎么创建都没关系,只要确保里面的内容是无误就OK了。
用命令行工具生成配置文件的话,有一个好处,就是里面带有很丰富的注释,对新手很有帮助(不过是英文的,鸟语不好的少年请自备翻译工具...)
配置文件的内容大概如下:
module.exports = function(config) {
    config.set({
        basePath: '',
     //basePath 相对目录,这里如果填了,files和exclude里的文件路径都会相对于它
        frameworks: ['jasmine'],
     //frameworks 需要用到的断言库,这里我们只用jsamine
        files: ['*.js', './../baseCls.min.js'],
     //files 测试时,浏览器需要加载的文件list
        exclude: ['karma.config.js'],
     //exclude 测试时,浏览器会忽略掉这个list里面的文件,不加载它们
        preprocessors: {},
        reporters: ['progress'],
        port: 9876,
        colors: true,
        logLevel: config.LOG_INFO,
        autoWatch: true,
        browsers: ['IE'],
     //browsers 测试浏览器,有IE,Chrome,ChromeCanary,FireFox,Opera,Safari,PhantomJS
        singleRun: false
    });
};
//默认情况下(没设置basePath),里面所有的路径,其实都是相对于 karma.config.js 的所在目录,也就是karma目录
//如果设置了 basePath,那 basePath 就是相对于 karma.config.js 的所在目录(karma目录),而 files 和 exclude 里的路径则相对于 basePath
//因为我要测试baseCls.min.js,所以我的files列表里,包含了它以及所有相关的测试脚本
测试脚本的编写
首先,我们看一下上面提到过的 FuncDelayer_Test.js
describe("class FuncDelayer test", function() {
    it("class FuncDelayer has defined", function(){
        expect(FuncDelayer).toBeDefined();
     //这行代码是断言
    });
    it("FuncDelayer object work part 1", function(){
        var funcDelayer = new FuncDelayer(), str;
        funcDelayer.push('conditionA', function(){
            str = 'success';
        });
        funcDelayer.pop('conditionA');
        expect(str).toEqual('success');
     //这行代码是断言
    });
});    
上面的代码,大概意思是:
开启了一项测试(class FuncDelayer test),测试中做了两件事(class FuncDelayer has defined 和 FuncDelayer object work part 1)
在第一件事里,测试 FuncDelayer 类是否存在
在第二件事里,新建一个 funcDelayer 对象,注册一个延迟执行的函数(该函数会对 str 变量赋值为 'success'),再马上手动触发该函数对应的触发条件,然后,测试 str 的值是否如同预期般等于 'success'
上面的描述纯粹是我的个人理解,用的是个人语言组织,可能和官方的解释不同。
这里我想说,每个人有每个人的学习和理解方式,就好比土豆,有些人喜欢称它马铃薯,有些人则喜欢通俗的称它为土豆。
能理解意思就好,别执着于说法是否官方,现在不是面试,更不是考试,是学习。
注意到上面的测试代码里的两处注释了么?
断言,意思就是“某一事物应该是这样的”。
用来测试某段代码后的执行结果是否符合预期,如果符合,测试通过,代码没问题。
否则,就是代码出问题了,请检查代码并将问题修复。
断言的写法,跟断言库有关系,例子中的断言是基于 jasmine 断言库的断言。
下面列举一些 jasmine 断言,方便理解和查阅。
expect(x).toEqual(y);
//比较x和y是否相等
expect(x).not.toEqual(y);
//比较x和y是否不相等
expect(x).toBe(y);
//比较x和y是否是相同的对象
expect(x).toMatch(pattern);
//比较x是否匹配pattern正则
expect(x).toBeDefined();
//x是否为undefined
expect(x).toBeNull();
//x是否为null
expect(x).toBeTruthy();
//x是否为true
expect(x).toBeFalsy();
//x是否为false
expect(x).toContain(y);
//x是否包含y (x可以是字符串或数组)
expect(x).toBeLessThan(y);
//x是否比y小
expect(x).toBeGreaterThan(y);
//x是否比y大
expect(fn).toThrow(e);
//函数是否抛出异常
上面所列的只是一些常用的断言,jasmine断言库的作用远不止这些,更多的细节资料,还得靠自己耐心查找了。
还有其他的断言库也是如此,不可能一一细述,有了key word,后面就要看自己的悟性和努力了。
开始测试
在项目的karma目录下运行命令行工具,然后执行下面命令:
karma start karma.config.js
PS:最后面的部分实际上就是配置文件的文件名,因为我改成了 karma.config.js ,所以~~
命令执行后,就开启测试了,根据里配置文件里的配置,会启动对应的浏览器。
这个时候,只要你修改测试脚本,并保存后,都会自动执行单元测试。因为我们把 autoWatch 设置为 true 了。
karma 在启动时 chrome 浏览器可能无法自动启动,这时候需要增加一个环境变量 CHROME_BIN 值为chome.exe的安装目录。
如:C:\Program Files (x86)\Google\Chrome\Application\chrome.exe
karma 和 webstorm 搭配使用
为什么选karma,为什么选webstorm,因为它们在一起啊在一起。
当两个好东东偶遇,你选它们的理由,会让你的选择变得坚定且欲罢不能。
在说如何设置之前,我默认你已经看完前面的内容,并安装了 webstorm 8.0 以上版本。
首先,file — settings — External Tools 添加:

Name - 填测试服务名称,随便填也没关系
Program - 填karma的全局安装目录
Parameters - 直接填 start 即可
Working directory - 直接填 $FileDir$ 即可
然后,设置 webstorm 的内置测试组件设置


Node interPreter - node.exe的所在路径
Karma node package - karma的全局安装目录
Configuration file - karma配置文件所在路径
都设置好后,点击IDE的右上角的那个绿色三角按钮,就能开始进行测试,IDE的下方会出现如下工具版面:

最左侧的那一列按钮的第二个,是开启测试文件变更监听的。开启后,修改测试文件并保存,就能自动触发测试了。
但自动触发测试的效率明显没有命令行工具快,具体用哪一种方式就见仁见智了。
单元测试工具 - karma的更多相关文章
- 主流的单元测试工具之-JAVA新特性-Annotation 写作者:组长 梁伟龙
		1:什么是Annotation?Annotation,即“@xxx”(如@Before,@After,@Test(timeout=xxx),@ignore),这个单词一般是翻译成元数据,是JAVA的一 ... 
- codeblocks+Mingw 下配置开源c++单元测试工具 google test
		google test 是google的c++开源单元测试工具,chrome的开发团队就是使用它. Code::Blocks 12.11(MinGW 4.7.1) (Windows版)Google T ... 
- PHP单元测试工具PHPUnit初体验
		今天接到了个任务,需要对数字进行计算,因为涉及到整数,小数,和科学计数法等很多条件,所以人工测试非常麻烦,于是想到了PHP的单元测试工具PHPUnit,所以写个文档备查. 看了PHPUnit的文档之后 ... 
- 单元测试工具之Xunit
		在.NET开发中的单元测试工具之——xUnit.Net 原始出处 http://zhoufoxcn.blog.51cto.com/792419/1172320 在上一篇<在.NET开发中的单元 ... 
- Java单元测试工具:JUnit4(一)(二)(三)(四)
		Java单元测试工具:JUnit4(一)--概述及简单例子 Java单元测试工具:JUnit4(二)--JUnit使用详解 Java单元测试工具:JUnit4(三)--JUnit详解之运行流程及常用注 ... 
- 单元测试工具 SmokeTest
		.NET 程序集单元测试工具 SmokeTest Smoke Test(冒烟测试),也称Regression Test(回归测试),是对软件的安装和基本功能的测试.一般地我们使用脚本来实现Smoke ... 
- Web Service单元测试工具实例介绍之SoapUI
		原文 Web Service单元测试工具实例介绍之SoapUI SoapUI是当前比较简单实用的开源Web Service测试工具,提供桌面应用程序和IDE插件程序两种使用方式.能够快速构建项目和组 ... 
- Java程序单元测试工具对比——Parasoft Jtest与Junit
		Web应用程序开发中,面向对象的Java语言占了不少的比重.对于Java应用程序的测试方法或方式多种多样,比较典型的是程序员自己来完成程序测试中的一个部分——单元测试. 之前,慧都资讯提到单元测试是程 ... 
- 一种数据与逻辑分离的Python单元测试工具
		一种数据与逻辑分离的Python单元测试工具 几个概念 TestCase TestCase是一个完整的测试单元,最小的测试执行实体,就是我们常说的测试用例. TestSuite 以某种特性将测试用例组 ... 
随机推荐
- wpf Route Event Code Snippet
			将下面内容保存为snippet后缀文件,通过vs的代码片段管理工具导入即可,快捷键请按需修改: <?xml version="1.0" encoding="utf- ... 
- .net core 使用redis 基于 StackExchange.Redis
			一.添加引用包 StackExchange.Redis Microsoft.Extensions.Configuration 二.修改配置文件 appsettings.json { " ... 
- 874. Walking Robot Simulation
			A robot on an infinite grid starts at point (0, 0) and faces north. The robot can receive one of th ... 
- [agc016b]Colorful Hats 分类讨论
			Description  有n个人,每个人都戴着一顶帽子.当然,帽子有不同的颜色.  现在,每个人都告诉你,他看到的所有其他人的帽子共有多少种颜色,请问你有没有符合所有人的描述的情况. Input ... 
- 恢复 MSSQL bak 文件扩展名数据(上)
			恢复 MSSQL bak 文件扩展名数据 一.概念: Microsoft SQL Server是由美国微软公司所推出的关系数据库解决方案,最新的版本是SQL Server 2016,已经在2016年6 ... 
- spring框架里面的注入?
			在Spring框架里面注入可以通过1.setter方法注入:2.构造器注入:3.注入对象 在配置文件中配置如下: 前面两者不能同时注入: 入 如果前两者同时注入将会报错 将注入修改以后,如下图: 修改 ... 
- P1158 导弹拦截
			P1158 导弹拦截 思路: 按每个点到第一个系统的距离排序,然后预处理出每个点及其之后的点到第二个系统的距离的最大值,再循环一遍枚举答案. 代码: #include <cstdio> ... 
- [spring] spring 装配Bean
			Bean的配置信息是Bean的元数据信息.包括1.Bean的实现类.2.Bean的属性信息.3.Bean的依赖关系.4.Bean的行为配置(比如控制Bean的生命周期中init,destory方法). ... 
- 使用bootstrap-table等自动使用ajax地址载入数据的插件的数据设计建议
			提出问题: bootstrap-table 可以根据ajax地址load的json数据.这个json数据一般就是数据库中查询的结果,而数据库中存放的数据一般不是用户友好的,比如数据表示一般使用简洁id ... 
- Qt for android运行时出错 Error: Target id 'android--1' is not valid
			[提问]windows7下Qt for android运行时出错 Error: Target id 'android--1' is not valid[复制链接] 上一主题下一主题 离线yijun ... 
