1. 关于Karma

  • Karma是一个基于Node.js的JavaScript测试执行过程管理工具(Test Runner)。
  • 该工具可用于测试所有主流Web浏览器,也可集成到CI(Continuous integration)。
  • 这个测试工具的一个强大特性就是,它可以监控(Watch)文件的变化,然后自行执行,通过console.log显示测试结果。

2. Karma集成Jasmine进行单元测试

a.初始化 NPM

实现初始化 NPM 包管理,创建 package.json 项目管理文件。
使用参数 -y 直接按照默认值创建 packgae.json 项目管理文件。

  1. PS C:\study\mykarma> npm init -y
  2. Wrote to C:\study\mykarma\package.json:
  3.  
  4. {
  5. "name": "mykarma",
  6. "version": "1.0.0",
  7. "description": "",
  8. "main": "index.js",
  9. "scripts": {
  10. "test": "echo \"Error: no test specified\" && exit 1"
  11. },
  12. "keywords": [],
  13. "author": "",
  14. "license": "ISC"
  15. }

现在,可以在项目文件夹中看到 package.json 文件已经创建了。

b.安装 Karma
现在,可以直接使用 NPM 来安装 karma。
i 是 install 命令的缩写,-D 是 --save-dev 的缩写。

  1. PS C:\study\mykarma> npm i -D karma
  2. npm WARN package.json mykarma@1.0.0 No description
  3. npm WARN package.json mykarma@1.0.0 No repository field.
  4. npm WARN package.json mykarma@1.0.0 No README data
  5. npm WARN optional dep failed, continuing fsevents@1.0.7
  6. karma@0.13.21 node_modules\karma
  7. ├── batch@0.5.3
  8. ├── di@0.0.1
  9. ├── graceful-fs@4.1.3
  10. ├── rimraf@2.5.2
  11. ├── mime@1.3.4
  12. ├── colors@1.1.2
  13. ├── source-map@0.5.3
  14. ├── isbinaryfile@3.0.0
  15. ├── bluebird@2.10.2
  16. ├── dom-serialize@2.2.1 (custom-event@1.0.0, void-elements@2.0.1, extend@3.0.0, ent@2.2.0)
  17. ├── http-proxy@1.13.2 (eventemitter3@1.1.1, requires-port@1.0.0)
  18. ├── optimist@0.6.1 (wordwrap@0.0.3, minimist@0.0.10)
  19. ├── glob@7.0.0 (path-is-absolute@1.0.0, inherits@2.0.1, once@1.3.3, inflight@1.0.4)
  20. ├── useragent@2.1.8 (lru-cache@2.2.4)
  21. ├── minimatch@3.0.0 (brace-expansion@1.1.3)
  22. ├── lodash@3.10.1
  23. ├── expand-braces@0.1.2 (array-unique@0.2.1, array-slice@0.2.3, braces@0.1.5)
  24. ├── log4js@0.6.31 (semver@4.3.6, readable-stream@1.0.33)
  25. ├── connect@3.4.1 (utils-merge@1.0.0, parseurl@1.3.1, debug@2.2.0, finalhandler@0.4.1)
  26. ├── core-js@2.1.0
  27. ├── body-parser@1.15.0 (content-type@1.0.1, bytes@2.2.0, depd@1.1.0, raw-body@2.1.5, debug@2.2.0, qs@6.1.0, iconv-lite@0.4.13, http-errors@1.4.0, on-finished@2.3.0, type-is@1.6.11)
  28. ├── socket.io@1.4.5 (debug@2.2.0, has-binary@0.1.7, socket.io-parser@2.2.6, socket.io-adapter@0.4.0, engine.io@1.6.8, socket.io-client@1.4.5)
  29. └── chokidar@1.4.2 (path-is-absolute@1.0.0, inherits@2.0.1, async-each@0.1.6, glob-parent@2.0.0, is-binary-path@1.0.1, is-glob@2.0.1, readdirp@2.0.0, anymatch@1.3.0)
  30.  
  31. PS C:\study\mykarma>

现在我们可以使用 node 来运行 karma  了。

  1. >node ./node_modules/karma/bin/karma

 

c.为了能在命令行直接执行 karma 命令,我们再安装一个 karma-cli.
-g 表示全局安装,这样可以在系统的任何文件夹中直接执行 karma 命令。

  1. PS C:\study\mykarma> npm i -g karma-cli
  2. C:\Users\XXX\AppData\Roaming\npm\karma -> C:\Users\XXX\AppData\Roaming\npm\node_modules\karma-cli\bin\karma
  3. karma-cli@0.1.2 C:\Users\guanjun\AppData\Roaming\npm\node_modules\karma-cli
  4. └── resolve@1.1.7

安装之后,可以直接使用 karma 来启动测试了,首先检查一下当前的版本。

  1. PS C:\study\mykarma> karma --version
  2. Karma version: 0.13.21
  3. PS C:\study\mykarma>

祝贺你, 基本的 Karma 已经安装成功了。

d. 安装 Jasmine 和 chrome-launcher
我们使用 Karma 来驱动单元测试,所以只有 Karma 是不行的,还需要安装单元测试库以便运行测试脚本,安装测试库与 Karma 的适配器,还有各种浏览器的适配器。
这里我们安装 Jasmine 的测试支持和 chrome 浏览器的适配器。
对于 jasmine 来说,我们需要 Jasmine 的适配器,还必须有 jasmine-core 库。
karma-chrome-launcher 则提供了 karma 与 chrome 的适配器。

  1. PS C:\study\mykarma> npm i -D jasmine-core karma-jasmine karma-chrome-launcher
  2. npm WARN package.json mykarma@1.0.0 No description
  3. npm WARN package.json mykarma@1.0.0 No repository field.
  4. npm WARN package.json mykarma@1.0.0 No README data
  5. npm WARN peerDependencies The peer dependency jasmine-core@* included from karma-jasmine will no
  6. npm WARN peerDependencies longer be automatically installed to fulfill the peerDependency
  7. npm WARN peerDependencies in npm 3+. Your application will need to depend on it explicitly.
  8. jasmine-core@2.4.1 node_modules\jasmine-core
  9.  
  10. karma-jasmine@0.3.7 node_modules\karma-jasmine
  11.  
  12. karma-chrome-launcher@0.2.2 node_modules\karma-chrome-launcher
  13. ├── fs-access@1.0.0 (null-check@1.0.0)
  14. └── which@1.2.4 (isexe@1.1.2, is-absolute@0.1.7)

现在涉及单元测试的基本工具已经安装就绪了。

e.Karma 的命令
karma 支持三个命令。
• start [<configFile>] [<options>] 启动 Karma 持续执行,也可以执行单次的测试,然后直接收集测试结果.
• init [<configFile>] 初始化配置文件.
• run [<options>] [ -- <clientArgs>] Trigger a test run. 
创建 karma 配置文件
Karma 需要进行配置,配置文件比较复杂,可以使用 karma 提供的 init 命令来直接创建基础的配置文件。在处理过程中,我们可以使用交互方式提供测试的信息,Karma 根据这些信息生成一个基本的配置文件。配置文件的默认名称是 karma.conf.js。如果你提供了配置文件的名称,karma 会将配置信息写入到你提供的文件名中。
创建 Karma 配置文件

  1. PS C:\study\mykarma> karma init
  2.  
  3. Which testing framework do you want to use ?
  4. Press tab to list possible options. Enter to move to the next question.
  5. > jasmine
  6.  
  7. Do you want to use Require.js ?
  8. This will add Require.js plugin.
  9. Press tab to list possible options. Enter to move to the next question.
  10. > no
  11.  
  12. Do you want to capture any browsers automatically ?
  13. Press tab to list possible options. Enter empty string to move to the next qu
  14. ion.
  15. > Chrome
  16. >
  17.  
  18. What is the location of your source and test files ?
  19. You can use glob patterns, eg. "js/*.js" or "test/**/*Spec.js".
  20. Enter empty string to move to the next question.
  21. > src/**/*.js
  22. 02 2016 22:32:26.698:WARN [init]: There is no file matching this pattern.
  23.  
  24. > test/**/*.spec.js
  25. 02 2016 22:33:26.513:WARN [init]: There is no file matching this pattern.
  26.  
  27. >
  28.  
  29. Should any of the files included by the previous patterns be excluded ?
  30. You can use glob patterns, eg. "**/*.swp".
  31. Enter empty string to move to the next question.
  32. >
  33.  
  34. Do you want Karma to watch all the files and run the tests on change ?
  35. Press tab to list possible options.
  36. > yes
  37.  
  38. Config file generated at "C:\study\mykarma\karma.conf.js".
  39.  
  40. PS C:\study\mykarma>

由于我们没有提供配置文件名称,这里生成的是默认的配置文件 karma.conf.js 。

f. 启动 Karma
由于已经有了 karma 配置文件,现在可以使用 karma start 启动 karma 了,由于还没有测试,所以看不到测试结果是正常的。
需要注意的是 karma 配置中的 singleRun 这个参数,设置为 false 的话,karma 会自动监控测试环境,默认是 Chrome, 如果你关掉了,karma 会自动重新启动一个。如果配置为 true,执行一次测试之后,karma 会自动停掉。
在 singleRun 为 false 的情况下,执行的结果可能是这样的。

  1. PS C:\study\mykarma> karma start
  2. 22 02 2016 10:54:11.796:INFO [karma]: Karma v0.13.21 server started at http://localhost:9876/
  3. 22 02 2016 10:54:11.806:INFO [launcher]: Starting browser Chrome
  4. 22 02 2016 10:54:13.206:INFO [Chrome 47.0.2526 (Windows 7 0.0.0)]: Connected on socket /#rbiYFxG0uTVJxpVoAAAA with id 13601272

g.单元测试

现在我们可以使用 Jasmine 开始写测试了。
在项目文件夹中,创建一个名为 test 的子文件夹来保存测试用例。然后在 test 文件夹中创建一个 unit 的文件夹来保存单元测试用例。
在这个文件夹中创建一个名为 hello.spec.js 的测试文件。
一般来说,我们会为测试用例的文件名称提供一个特定的模式,以便对测试用例进行统一处理,这里我们约定测试用例的文件名以 .spec.js 为结尾。
hello.spec.js

  1. describe('hello, unit test.', function(){
  2. it('should also be able to test', function(){
  3. expect(true).toBe(true);
  4. });
  5.  
  6. it('should be failed', function(){
  7. expect(true).toBe(false);
  8. })
  9. });

这个测试包含了两个测试用例,一个一定成功,一个一定失败。
确认在我们 karma 的配置文件中,包含了我们的测试用例。

  1. // list of files / patterns to load in the browser
  2. files: [
  3. 'test/**/*.spec.js'
  4. ],

现在,使用 karma start 启动测试,在控制台应该会看到如下的输出。

  1. PS C:\study\mykarma> karma start
  2. 02 2016 11:09:31.137:WARN [karma]: No captured browser, open http://localhost:9876/
  3. 02 2016 11:09:31.157:INFO [karma]: Karma v0.13.21 server started at http://localhost:9876/
  4. 02 2016 11:09:31.167:INFO [launcher]: Starting browser Chrome
  5. 02 2016 11:09:32.561:INFO [Chrome 47.0.2526 (Windows 7 0.0.0)]: Connected on socket /#ymfXfb-xI2a3fZ82AAAA with id 31292195
  6. Chrome 47.0.2526 (Windows 7 0.0.0) hello, unit test. should be failed FAILED
  7. Expected true to be false.
  8. at Object.<anonymous> (C:/study/mykarma/test/unit/hello.spec.js:7:20)
  9. Chrome 47.0.2526 (Windows 7 0.0.0): Executed 2 of 2 (1 FAILED) (0.016 secs / 0.006 secs)

可以看到执行了两个测试,其中一个失败了,失败的测试为 hello, unit test 中的 should be failed 测试用例。
测试实际的代码
在项目文件夹中,创建一个名为 src 的子文件夹来保存我们的应用代码,在其中创建一个名为 add.js 的脚本文件,我们将来测试它的工作是否正确。

  1. function add(a, b){
  2. return a + b;
  3. }

这个脚本非常简单,仅仅用来计算两个数字之后,没有任何的验证。
然后,我们针对它写两个测试用例,保存到 ./test/unit/add.spec.js 文件中。

  1. describe('add function unit test.', function(){
  2. it('2 + 3 = 5', function(){
  3. var result = add( 2, 3 );
  4. expect( result ).toBe( 5 );
  5. });
  6.  
  7. it('2 + 3 = 6, this should faild.', function(){
  8. var result = add( 2, 3 );
  9. expect(result).toBe( 6 );
  10. })
  11. });

确认你的 karma 配置文件中,包含了被测试代码和测试代码。

  1. // list of files / patterns to load in the browser
  2. files: [
  3. 'src/**/*.js',
  4. 'test/**/*.spec.js'
  5. ],

现在的控制台输出应该是这样的。

  1. PS C:\study\mykarma> karma start
  2. 02 2016 11:22:18.800:WARN [karma]: No captured browser, open http://localhost:9876/
  3. 02 2016 11:22:18.810:INFO [karma]: Karma v0.13.21 server started at http://localhost:9876/
  4. 02 2016 11:22:18.820:INFO [launcher]: Starting browser Chrome
  5. 02 2016 11:22:20.232:INFO [Chrome 47.0.2526 (Windows 7 0.0.0)]: Connected on socket /#i6GaDaxNTy8HWL52AAAA with id 89457157
  6. Chrome 47.0.2526 (Windows 7 0.0.0) add function unit test. 2 + 3 = 6, this should faild. FAILED
  7. Expected 5 to be 6.
  8. at Object.<anonymous> (C:/study/mykarma/test/unit/add.spec.js:9:24)
  9. Chrome 47.0.2526 (Windows 7 0.0.0) hello, unit test. should be failed FAILED
  10. Expected true to be false.
  11. at Object.<anonymous> (C:/study/mykarma/test/unit/hello.spec.js:7:20)
  12. Chrome 47.0.2526 (Windows 7 0.0.0): Executed 4 of 4 (2 FAILED) (0.021 secs / 0.007 secs)

祝贺你,现在你已经可以测试你的代码了!

如果你的应用是由一个一个独立的函数定义出来的,现在就已经可以进行测试了。

可以看到,使用 Karma 集成 Jasmine 测试是很方便的组合。

3. 代码覆盖率(Code coverage)

karma 的插件 karma-coverage 提供了测试代码覆盖率的支持。
karma 的页面:http://karma-runner.github.io/0.8/config/coverage.html 进行了说明。karma 使用 Istanbul.实现覆盖率统计。
首先你需要安装这个 Karma 插件,然后需要在配置文件的三个地方进行配置。

a.安装 karma-coverage
当然了,你必须安装这个组件才能完成覆盖率统计。可以看到,在安装这个插件的时候,已经安装了 Istanbul 。

  1. npm i -D karma-coverage
  2. ├─┬ karma@0.13.21
  3. ├─┬ log4js@0.6.31
  4. └── semver@4.3.6
  5. └─┬ optimist@0.6.1
  6. ├── minimist@0.0.10
  7. └── wordwrap@0.0.3
  8. └─┬ karma-coverage@0.5.3
  9. ├─┬ dateformat@1.0.12
  10. └─┬ meow@3.7.0
  11. ├── minimist@1.2.0
  12. └─┬ normalize-package-data@2.3.5
  13. └── semver@5.1.0
  14. └─┬ istanbul@0.4.2
  15. ├─┬ escodegen@1.7.1
  16. └─┬ optionator@0.5.0
  17. └── wordwrap@0.0.3
  18. └── wordwrap@1.0.0

b.配置
涉及三个配置信息,两个是必须的,一个是可选的。
(1) 配置预处理器
这里配置哪些文件需要统计测试覆盖率,例如,如果你的所有代码文件都在 lib 文件夹中,你就需要如下配置。

  1. preprocessors = {
  2. '**/lib/*.js': 'coverage'
  3. };

注意不要包含你所依赖的库,测试文件等等,下面就是一个错误的配置信息。
files = [
JASMINE,
JASMINE_ADAPTER,
'lib/*.js',
'test/*.js'
];
preprocessors = {
'**/*.js': 'coverage'
};

(2) 配置报告
在配置文件中包含下面的信息来激活覆盖率报告器。

  1. reporters = ['coverage'];

这样将会对每个浏览器创建一个覆盖率报告,另外,它还会创建一个 Json 文件,其中包含输出的中间数据。
配置报告选项
默认的报告格式如下:

  1. coverageReporter = {
  2. type : 'html',
  3. dir : 'coverage/'
  4. }

type 是一个字符串值,取值可以是:
• html (default)
• lcov (lcov and html)
• lcovonly
• text
• text-summary
• cobertura (xml format supported by Jenkins)

dir 则用来配置报告的输出目录。如果是一个相对路径的话,将相对与 basePath 参数。
如果类型是 text 或者 text-summary,你可以配置 file 参数来指定保存的文件名。

  1. coverageReporter = {
  2. type : 'text',
  3. dir : 'coverage/',
  4. file : 'coverage.txt'
  5. }

如果没有文件名,就会输出到控制台。

4.其它
a. Karma+Jasmine+ Require JS示例程序及介绍: https://github.com/kjbekkelund/karma-requirejs

b. 代码覆盖率效果图:

Karma +Jasmine+ require JS进行单元测试并生成测试报告、代码覆盖率报告的更多相关文章

  1. 学习Karma+Jasmine+istanbul+webpack自动化单元测试

    学习Karma+Jasmine+istanbul+webpack自动化单元测试 1-1. 什么是karma?  Karma 是一个基于Node.js的Javascript测试执行过程管理工具.该工具可 ...

  2. python之单元测试_生成测试报告

    (1)HTMLTestRunner.py的下载路径:https://pan.baidu.com/s/1Yk2E8d8bIo5_rmpussOE9Q 提取码:0jae (2)HTMLTestRunner ...

  3. 使用Jasmine和karma对传统js进行单元测试

    当你拿到十五年前的一堆javascript的代码,你如何对这堆javascript代码写单元测试呢?于是就有了这篇文章. 注意:不需要装任何现代化js框架,包括angular,react,vue之类的 ...

  4. 在WebStorm中集成Karma+jasmine进行前端单元测试

    在WebStorm中集成Karma+jasmine进行前端单元测试 前言 好久没有写博了,主要还是太懒=.=,有点时间都去带娃.看书了,今天给大家分享一个原创的小东西,如果大家对TDD或者BDD有兴趣 ...

  5. 使用karma+jasmine做单元测试

    目的 使用karma和jasmine来配置自动化的js单元测试. Karma和Jasmine Karma是由Angular团队所开发的一种自动化测试工具.链接:http://karma-runner. ...

  6. 搭建Karma+Jasmine的自动化单元测试

    最近在打算将以前的代码进行重构,过程中发现自己不写自动化测试代码,而是手动的写,这样并不好,所以就学了Karma+Jasmine的自动化单元测试,以后写代码尽量要写自动化单元测试,也要测一下istan ...

  7. 使用jasmine来对js进行单元测试

    互联网的快速发展,给web开发人员带来了前所未有的挑战.对于前端开发,前端开发er所需要编写的js早已不是那些寥寥几行的视觉效果代码.代码量的大增,多人协同,人员素质悬殊不齐,这都需要一个标准,来对代 ...

  8. .Karma+Jasmine+karma-coverage

    单元测试(模块测试)是开发者编写的一小段代码,用于检验被测代码的一个很小的.很明确的功能是否正确.通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为. Karma是一个基于N ...

  9. angular测试-Karma + Jasmine配置

    首先讲一下大致的流程: 需要node环境,首先先要安装node,node不会?请自行搜索.版本>0.8 安装node完成之后先要测试下npm是否测试通过,如下图所示 首先看下目录结构 目录为:F ...

随机推荐

  1. Array.prototype.indexOf

    arr.indexOf(searchElement[, fromIndex = 0]) Array.prototype.indexOf()

  2. JS实现简单的图片切换效果

    使用图片进行点击切换效果 <!doctype html> <html lang="en"> <head> <meta charset=&q ...

  3. linux权限管理_文件特殊权限

    一.SetUID功能 设定SetUID的方法 4代表SUID s代表SUID权限 S代表报错了,原因没有执行权限 # chmod 4755 文件名(最好用这种方法) # chmod u+s 文件名 取 ...

  4. 不同操作系统上屏蔽oracle的操作系统认证方式

    windows系统上>如果不想用户通过操作系统验证方式登录,可以修改 sqlnet.ora文件,把 SQLNET.AUTHENTICATION_SERVICES=NTS 前面加#注释掉就可以了. ...

  5. web.xml 详细介绍(转)

    web.xml 详细介绍 1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧 ...

  6. 原创:cellmap 基站查询 for android

    cellmap for android 3.6.8.7.9.8 更新日期:2016年12月30日 特别声明:本软件不能进行手机定位,不能对手机号码定位,谨防被骗. 下载地址: cellmap3.6.8 ...

  7. php和js一起实现倒计时功能

    里获取的php服务端的时间 纯JS是获取客服端时间! <?php //php的时间是以秒算.js的时间以毫秒算 date_default_timezone_set('PRC'); //date_ ...

  8. [转]Vs解决方案的目录结构设置和管理

    原文地址:[转]Vs解决方案的目录结构设置和管理 作者:大明   以下内容为“原创”+“转载” 首先,解决方案和项目文件夹包含关系(c++项目): VS解决方案和各个项目文件夹以及解决方案和各个项目对 ...

  9. 使用Python玩转WMI

    最近在网上搜索Python和WMI相关资料时,发现大部分文章都千篇一律,并且基本上只说了很基础的使用,并未深入说明如何使用WMI.本文打算更进一步,让我们使用Python玩转WMI. 1 什么是WMI ...

  10. [转]行者,一念一生,成功的背后!(给所有IT人)

    成功的背后,有着许多不为人知的故事,而正是这些夹杂着泪水和汗水的过去,才成就了一个个走向成功的普通人. 凌晨两点半,早 已习惯了一个人坐在电脑前的我,望着屏幕,任思绪在暗夜的包容下静静流淌,时光仿佛又 ...