目的

使用karma和jasmine来配置自动化的js单元测试。

Karma和Jasmine

Karma是由Angular团队所开发的一种自动化测试工具。链接:http://karma-runner.github.io/

Karma会启动PhantomJS实例来运行测试,可以在其上使用Jasmine、Mocha等测试框架,也可以和Jenkins、Travis等CI(Continuous Integration,持续集成)进行整合。

Jasmine是一个按照BDD(behavior-driven development,行为驱动开发)思想开发的js测试框架,很适合做单元测试。链接:http://jasmine.github.io/

Karma为Jasmine提供了真实的浏览器环境,两者结合来做js单元测试非常方便。

安装和配置Karma

使用npm安装Karma:

npm install karma --save-dev

创建config文件:

node_modules/karma/bin/karma init [karma.config.js]

创建过程中需要进行各种配置,我们直接来看看生成的karma.config.js文件中的一些字段:

frameworks: ['jasmine'], // 单元测试框架,这里我们使用jasmine
files: [ './src/*.js', './client-tests/*.js'], // 需要包含的文件,包括测试的目标代码和测试代码
preprocessors: {'./static/src/*.js': 'coverage',}, // 预处理器,包括eslint、browserify、babel等等,这里我们使用了karma-coverage来生成代码覆盖率报告
reporters: ['progress', 'coverage'], // 报告,除了默认的progress报告测试进度,这里我们添加了karma-coverage
port: 9876, // 端口,karma会在localhost:[端口]启动一个测试服务器,这样我们可以用其他设备访问这个页面,得到更真实的设备测试结果
browsers: ['Chrome'], // 目标浏览器
singleRun: true, // 当singleRun为true时,测试完成后测试服务器和浏览器即被关闭
coverageReporter: {type : 'html',dir : 'coverage/'} // 这边是karma-coverage的配置

测试服务器使用了socket,Karma会监视目标js,当文件发生改变时后会实时更新浏览器端刷新测试结果。

启动karma:

node_modules/karma/bin/karma start karma.config.js

除了Karma之外,可能还需要用npm安装以下包:

测试框架相关:jasmine-core,karma-jasmine...
浏览器相关:karma-chrome-launcher...
其他插件(代码覆盖率等等):karma-coverage...

使用jasmine:

首先简单介绍几个概念:

bdd:行为驱动开发是一种敏捷开发的思维,其特点是在实际开发前先用语义化的测试案例来描述代码的作用、行为,再编写代码实现目标。

suits:测试套件。一个或多个测试案例组成一个测试套件,来测试一系列相关的行为。测试套件也可以嵌套测试套件。

specs:测试案例。测试的基本单位,一个测试案例通常用以测试一个行为。一个测试案例应当包含一个或多个期望。

用jasmine来编写就是:

describe("A suite", function() { // describe定义一个测试套件
  it("contains spec with an expectation", function() { // it定义一个测试案例
    expect(true).toBe(true); // expect定义一个期望
  });
});

将以上内容保存到karma.config指定的测试代码文件夹中,运行Karma,会报告我们定义了一个测试,通过了一个测试。

我们还可以在一个测试套件中使用beforeEach、afterEach、beforeAll和afterAll来指定每个测试案例或测试套件的前后所执行的代码来重置测试上下文:

describe("A spec using beforeEach and afterEach", function() {
  var foo = 0;

  beforeEach(function() {
    foo += 1;
  });

  afterEach(function() {
    foo = 0;
  });

  it("is just a function, so it can contain any code", function() {
    expect(foo).toEqual(1);
  });

  it("can have more than one expectation", function() {
    expect(foo).toEqual(1);
    expect(true).toEqual(true);
  });
});

jasmine同时提供了spies的功能。spy是对函数调用的跟踪记录。

describe("A spy", function() {
  var foo, bar = null;

  beforeEach(function() {
    foo = {
      setBar: function(value) {
        bar = value;
      }
    };
    // 使用spies
    spyOn(foo, 'setBar');

    foo.setBar(123);
    foo.setBar(456, 'another param');
  });

  it("tracks that the spy was called", function() {
    expect(foo.setBar).toHaveBeenCalled();
  });

  it("tracks all the arguments of its calls", function() {
    expect(foo.setBar).toHaveBeenCalledWith(123);
    expect(foo.setBar).toHaveBeenCalledWith(456, 'another param');
  });

  it("stops all execution on a function", function() {
    expect(bar).toBeNull();
  });
});

当然还有对异步的支持:

// 使用done来支持异步describe("long asynchronous specs", function() {
  beforeEach(function(done) {
    done();
  }, 1000);

  it("takes a long time", function(done) {
    setTimeout(function() {
      done();
    }, 9000);
  }, 10000);

  afterEach(function(done) {
    done();
  }, 1000);
});

小结

使用Karma+jasmine可以方便的进行单元测试、BDD开发和持续集成。正确的应用这些开发理念,可以加快开发,减少错误,让我们在开发过程中更自信、更愉快。

使用karma+jasmine做单元测试的更多相关文章

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

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

  2. Karma和Jasmine自动化单元测试

    从零开始nodejs系列文章,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发.Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎.chrome浏 ...

  3. angularJS测试一 Karma Jasmine Mock

    AngularJS测试 一 测试工具 1.NodeJS领域:Jasmine做单元测试,Karma自动化完成单元测试,Grunt启动Karma统一项目管理,Yeoman最后封装成一个项目原型模板,npm ...

  4. karma、jasmine做angularjs单元测试

    引用文:karma.jasmine做angularjs单元测试 karma和jasmine介绍 <1>技术介绍 karma karma是Testacular的新名字 karma是用来自动化 ...

  5. Karma和Jasmine自动化单元测试——本质上还是在要开一个浏览器来做测试

    1. Karma的介绍 Karma是Testacular的新名字,在2012年google开源了Testacular,2013年Testacular改名为Karma.Karma是一个让人感到非常神秘的 ...

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

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

  7. Karma:1. 集成 Karma 和 Jasmine 进行单元测试

    关于 Karma 会是一个系列,讨论在各种环境下,使用 Karma 进行单元测试. 本文讨论 karma 集成 Jasmine 进行单元测试. 初始化 NPM 实现初始化 NPM 包管理,创建 pac ...

  8. Karma +Jasmine+ require JS进行单元测试并生成测试报告、代码覆盖率报告

    1. 关于Karma Karma是一个基于Node.js的JavaScript测试执行过程管理工具(Test Runner). 该工具可用于测试所有主流Web浏览器,也可集成到CI(Continuou ...

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

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

随机推荐

  1. 在java中使用dom4j包对String格式的xm数据l解析

    在网上找了好久,都没搞出来,借鉴别人的代码,依葫芦画瓢,写了个自己用的解析类.注意节点属性和子节点的区别就好了,这个包的方法还挺好用的 package com.allinpay.utils; impo ...

  2. 手把手教你使用startuml画用例图

    转自:http://www.2cto.com/os/201502/377091.html 最近准备研究下volley的源码,但看了网上一些大牛的博客都是配合图这样看起来更直观,分析起来逻辑也很好,什么 ...

  3. 关于MySql中自增长id设置初始值

    在MySQL数据库,设置了id为自增长类型,但由于程序还处于开发阶段,很容易的会产生错误数据,然后就直接删除了,可是id的自增长值没有跟着减少,这里提示: 如果表中数据没有用,直接删除了数据,自动增长 ...

  4. CentOS新增开机启动项

    编辑rc.local文件 vi /etc/rc.d/rc.local 例如 #!/bin/sh # # This script will be executed *after* all the oth ...

  5. Codeforces Round #369 (Div. 2) C. Coloring Trees (DP)

    C. Coloring Trees time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  6. Counting Haybales

    Counting Haybales 题目描述 Farmer John is trying to hire contractors to help rearrange his farm, but so ...

  7. Python+Selenium 环境配置之Firefox,IE,Chrome几种浏览器运行

    Selenium(Webdriver)支持Firefox,IE,Chrome等多个浏览器.很多人可能装环境时遇到很多问题,下面简单聊聊如何配置测试这几个浏览器以及相关通过简单的实例来测试. 1.Fir ...

  8. JVM线程安全

    一.线程的调度方式 线程调度分为两种方式: 协同式调度和抢占式调度.协同式调度:线程的执行时间由线程本身控制,线程将工作执行完之后,通知操作系统切换到其他线程上.缺点:时间不可控,就算出问题,也不会通 ...

  9. spring 5种通知

    方法实现接口 package com.cn.spring.aop.impl; //加减乘除的接口类 public interface ArithmeticCalculator { int add(in ...

  10. HUST 1606 Naive

    预处理一下,然后o(1)询问. #include<cstdio> #include<cstring> #include<cmath> #include<str ...