Karma简介

Karma是无痛的、超高速运行的测试运行器。 它使用NodeJSSocketIO技术,让多浏览器超高速测试变得容易。

测试运行器和测试框架

我们常常注意到开发人员有时会对测试运行器和测试框架感到困惑。这可能是因为同一JavaScript库通常处理这两个任务。

与JS(AngularJS)工作时,我们为每个目标使用不同的工具库。Karma作为测试运行器,仅负责寻找代码库中所有的单元测试,打开浏览器,运行这些测试,并获取结果。它不关心我们使用语言或框架编写测试;只简单地运行它们。

Jasmine是我们将使用的测试框架。Jasmine定义了我们写测试的语法、APIs、断言方式。我们可以不使用Jasmine,而是使用像mocha或其他框架编写AngularJS测试。

Karma是一个很棒的测试运行器,它可以使测试尽可能简单和快速。它很容易编写测试然后就放手不管,让我们开发人员迅速反馈我们的代码和测试。

下面是安装Karma(在撰写本文时)的步骤:

  1. 安装NodeJS。 您可以从这里获取安装程序。
  2. 安装Karma CLI,它允许您用使用简单步骤运行Karma。它是一个npm (Node包管理器)包,所以您可以用下面命令来安装:
    npm install- g karma-cli
    Windows用户可以在NodeJS安装成功之后从命令行运行它。
  3. 本地安装Karma到您想要运行测试的文件夹:
    npm install karma
  4. Karma有一个概念叫做插件,它允许为您项目只选择所需组件。这些插件允许您选择什么框架用于编写单元测试(Karma是框架未知论者),用什么浏览器启动等。我们将开始安装Jasmine插件编写我们的测试,安装Chrome启动器自动打开Google Chrome。这两个插件使用下面的命令来安装:
    npm install karma-jasmine karma-chrome-launcher

确保您从您下载代码库的文件夹路径运行最后两个命令。这些命令都是特定于每个项目,需要为每个新项目运行。

我们项目运行Karma的推荐方式已经随Karma版本的更新发生改变,现在推荐为每个项目本地安装Karma包而不是全局安装。在前面的教程中我们演示了本地安装。

这也意味着我们必须从Karma本地npm安装文件夹路径执行命令而不是从命令行直接运行。 那就是:
karma start myconf.js
将不得不写成:
node_modules/karma/bin/karma start myconf.js
Karma有一个称为karma-cli npm包允许我们不这样做,我们已经安装过了。它让我们能够在不完全路径下执行Karma,因为系统会搜索Karma的本地安装。

Karma插件

上文我们给Karma安装了两个插件。让我们进一步讲解Karma插件。Karma插件大致可以分成以下类别:

浏览器启动器

第一种插件作为测试运行的一部分,帮助Karma自动启动浏览器。我们安装了Chrome浏览器启动插件,还有其它类似如Firefox、IE等。

测试框架

编写单元测试时,我们也可以选择想要使用的那种框架。我们将使用在前面小节中已经安装过的Jasmine,但如果您喜欢用不同风格编写单元测试,比如mocha或qunit,也是可用相应的插件。

报告

Karma也可以用各种形式输出测试结果。默认的过程报告是内置的,但您可以通过junit.xml文件决定需要测试结果。您可以为此安装一个Karma插件。

集成

另一种主要类别插件允许我们集成现有的JavaScript库或工具,比如谷歌Closure或RequireJS。它们大多数也有相应的Karma插件,可以根据需要安装。

Karma配置解释

使用Karma,我们需要一个告诉Karma如何操作的配置文件。下一节我们将看到生成这个配置文件是多么容易。但在本章节让我们先来看一看Karma配置和单元测试选项。这个文件的缺省名称是karma.conf.js,除非您告诉Karma否则它会在Karma运行目录中自动寻找该名字的文件:

// Karma 配置
module.exports = function(config) {
  config.set({
    // 基本路径,用来解析排除文件
    basePath: '',
    // 使用的测试框架(jasmine/mocha/qunit/...)
    frameworks: ['jasmine'],
    // 加载到浏览器的文件列表或通配规则
    files: [
      'angular.min.js',
      'angular-mocks.js',
      'controller.js',
      'simpleSpec.js',
      'controllerSpec.js'
    ],
    // 排除的文件列表或通配规则
    exclude: [],
    // 服务器端口
    port: 8080,
    // 日志级别
    // 可设定值: LOG_DISABLE || LOG_ERROR ||
    //                  LOG_WARN || LOG_INFO || LOG_DEBUG
    logLevel: config.LOG_INFO,
    // 任何文件变化时激活或禁止观察文件执行测试
    // whenever any file changes
    autoWatch: true,
    // 启动浏览器,目前可用值:
    // - Chrome
    // - ChromeCanary
    // - Firefox
    // - Opera
    // - Safari (only Mac)
    // - PhantomJS
    // - IE (only Windows)
    browsers: ['Chrome'],
    // 持续集成模式
    // 如果设置成true,它将捕获浏览器、运行测试并退出
    singleRun: false
  });
};

让我们看一看前面例子中每个选项,看一看他们对Karma有什么影响:

basePath

所有文件的进行测试和测试自己的需要加载的基本路径。这是相对于Karma配置文件的位置。

frameworks

什么框架将作为一个数组加载。 在我们的示例中,我们加载Jasmine(要求karma-jasmine插件安装)。 您可以选择mocha、qunit或其它框架。

files

文件列表(或文件路径)作为一个数组加载。对于AngularJS,我们首先加载AngularJS库,然后加载测试助手:angular-mocks.js文件,AngularJS将其作为测试助手。最后,我们加载应用程序源代码,接着加载实际的单元测试。

exclude

需要排除的文件列表(或文件路径)。该选项用对文件使用大量的通配规则(通配符声明包括一组文件,如* * . js),从而排除某些特殊文件(如karma.conf.js)。

port

指定Karma测试运行器服务器的端口。在默认情况下,端口是8080。

logLevel

指定Karma需要从浏览器获取的日志级别(console.log、console.info)。

autoWatch

这是Karma到目前为止最酷最有用的特性。它告诉Karma一直观察文件配置的所有文件,如果其中任何一个文件变化,将运行影响的单元测试。 如果该选项设置为true,您不需要手动触发运行单元测试;Karma将为您代办。

browsers

浏览器应该在Karma初始化打开。大部分浏览器要求安装karma-launcher插件(我们安装了chrome-launcher,所以我们此处指定选项为Chrome)。

singleRun

这是一个布尔值,它告诉Karma运行一个单元测试后关闭服务器。持续集成环境应该设置为true,否则会被忽略。

还有您可以设置和修改与Karma的更多配置,但我们不会在这本书深入讲解。您可以在Karma配置文件概述页面了解更多。

生成Karma配置

现在,您当然可以从前面的配置文件章节复制和粘贴的内容开始,但Karma提供了一个更好的方式让您开始自己的Karma配置。Karma可以通过运行下面的命令自动生成配置 :
karma init
该命令触发一个交互式shell,它提示我们的一系列问题。每个回答通常有一系列的选项,您可以通过使用键盘上的Tab键来选择。当选择所有选项之后,将生成karma.conf.js文件。

不完全译自《AngularJS-Up and Running》。

发表评论