本文将探讨如何搭建测试环境、以及Angular测试工具集。html
绝大部分都是利用Angular Cli来建立项目,所以,默认已经集成咱们所须要的npm包与脚本;固然,若是你是使用自建或官网 quickstart 的话,须要自行安装;但全部核心数据全都是同样的。node
Angular单元测试咱们能够将其分红两类:独立单独测试与Angular测试工具集。git
Pipe与Service适为独立单独测试,由于它们只须要 new
实例类便可;一样是没法与Angular组件进行任何交互。github
与之相反就是Angular测试工具集。chrome
Jasminetypescript
Jasmine测试框架提供了编写测试脚本的工具集,并且很是优秀的语义化,让测试代码看起来像是在读一段话。npm
Karmajson
有测试脚本,还须要Karma来帮忙管理这些脚本,以便于在浏览器中运行。segmentfault
若是你非要折腾,那么最简单的办法即是经过Angular Cli建立一个新项目,而后将如下Npm包复制到您折腾的项目中。浏览器
"jasmine-core": "~2.5.2", "jasmine-spec-reporter": "~3.2.0", "karma": "~1.4.1", "karma-chrome-launcher": "~2.1.1", "karma-cli": "~1.0.1", "karma-jasmine": "~1.1.0", "karma-jasmine-html-reporter": "^0.2.2", "karma-coverage-istanbul-reporter": "^0.2.0"
那么,咱们重要仍是看配置脚本部分。
咱们核心是须要让 karma 运行器运行起来,而对于 Jasmine,是在咱们编写测试脚本时才会使用到,所以,暂时无须过分关心。
咱们须要在根目录建立 karma.conf.js
文件,这至关于一些约定。文件是为了告知karma须要启用哪些插件、加载哪些测试脚本、须要哪些测试浏览器环境、测试报告通知方式、日志等等。
karma.conf.js
如下是Angular Cli默认提供的 karma 配置文件:
// Karma configuration file, see link for more information // https://karma-runner.github.io/0.13/config/configuration-file.html module.exports = function(config) { config.set({ // 基础路径(适用file、exclude属性) basePath: '', // 测试框架,@angular/cli 指Angular测试工具集 frameworks: ['jasmine', '@angular/cli'], // 加载插件清单 plugins: [ require('karma-jasmine'), require('karma-chrome-launcher'), require('karma-jasmine-html-reporter'), require('karma-coverage-istanbul-reporter'), require('@angular/cli/plugins/karma') ], client: { // 当测试运行完成后是否清除上文 clearContext: false // leave Jasmine Spec Runner output visible in browser }, // 哪些文件须要被浏览器加载,后面会专门介绍 `test.ts` files: [ { pattern: './src/test.ts', watched: false } ], // 容许文件到达浏览器以前进行一些预处理操做 // 很是丰富的预处理器:https://www.npmjs.com/browse/keyword/karma-preprocessor preprocessors: { './src/test.ts': ['@angular/cli'] }, // 指定请求文件MIME类型 mime: { 'text/x-typescript': ['ts', 'tsx'] }, // 插件【karma-coverage-istanbul-reporter】的配置项 coverageIstanbulReporter: { // 覆盖率报告方式 reports: ['html', 'lcovonly'], fixWebpackSourcePaths: true }, // 指定angular cli环境 angularCli: { environment: 'dev' }, // 测试结果报告方式 reporters: config.angularCli && config.angularCli.codeCoverage ? ['progress', 'coverage-istanbul'] : ['progress', 'kjhtml'], port: 9876, colors: true, // 日志等级 logLevel: config.LOG_INFO, // 是否监听测试文件 autoWatch: true, // 测试浏览器列表 browsers: ['Chrome'], // 持续集成模式,true:表示浏览器执行测试后退出 singleRun: false }); };
以上配置基本上能够知足咱们的需求;通常须要变更的,我想是测试浏览器列表了,由于karma支持全部市面上的浏览器。另外,当你使用 Travis CI 持续集成时,启动一个禁用沙箱环境Chrome浏览器会让咱们少了不少事:
customLaunchers: { Chrome_travis_ci: { base: 'Chrome', flags: ['--no-sandbox'] } }
有关karma config文件的全部信息,请参与官网文档。
test.ts
在编写 karma.conf.js
时,咱们配置过浏览器加载的文件指向的是 ./src/test.ts
文件。做用是为了引导 karma 启动,代码也简单许多:
// This file is required by karma.conf.js and loads recursively all the .spec and framework files import 'zone.js/dist/long-stack-trace-zone'; import 'zone.js/dist/proxy.js'; import 'zone.js/dist/sync-test'; import 'zone.js/dist/jasmine-patch'; import 'zone.js/dist/async-test'; import 'zone.js/dist/fake-async-test'; import { getTestBed } from '@angular/core/testing'; import { BrowserDynamicTestingModule, platformBrowserDynamicTesting } from '@angular/platform-browser-dynamic/testing'; // Unfortunately there's no typing for the `__karma__` variable. Just declare it as any. declare var __karma__: any; declare var require: any; // Prevent Karma from running prematurely. __karma__.loaded = function () {}; // First, initialize the Angular testing environment. getTestBed().initTestEnvironment( BrowserDynamicTestingModule, platformBrowserDynamicTesting() ); // Then we find all the tests. // 全部.spec.ts文件 const context = require.context('./', true, /\.spec\.ts$/); // And load the modules. context.keys().map(context); // Finally, start Karma to run the tests. __karma__.start();
一切就绪后,咱们能够尝试启动 karma 试一下,哪怕无任何测试代码,也是能够运行的。
若是是Angular Cli那么 ng test
。折腾的用 node "./node_modules/karma-cli/bin/karma" start
最后,打开浏览器:http://localhost:9876
,能够查看测试报告。
既然环境搭好,那么咱们来写个简单示例试一下。
建立 ./src/demo.spec.ts
文件。.spec.ts为后缀这是一个约定,遵照它。
describe('demo test', () => { it('should be true', () => { expect(true).toBe(true); }) });
运行 ng test
后,咱们能够在控制台看到:
Chrome 58.0.3029 (Windows 10 0.0.0): Executed 1 of 1 SUCCESS (0.031 secs / 0.002 secs)
或者浏览器:
1 spec, 0 failures demo test true is true
无论怎么样,毕竟咱们已经进入Angular单元测试的世界了。
普通类诸如Pipe或Service,只须要经过简单的 new
建立实例。而对于指令、组件而言,须要必定的环境。这是由于Angular的模块概念,要想组件能运行,首先得有一个 @NgModule
定义。
工具集的信息量并不不少,你很容易能够掌握它。下面我简略说明几个最经常使用的:
TestBed
TestBed
就是Angular测试工具集提供的用于构建一个 @NgModule
测试环境模块。固然有了模块,还须要利用 TestBed.createComponent
建立一个用于测试目标组件的测试组件。
异步
Angular处处都是异步,而异步测试能够利用工具集中 async
、fakeAsync
编写优雅测试代码看着是同步。
工具集还有更多,这一切咱们将在[Angular单元测试-组件与指令单元测试]()逐一说明。
那么下一篇,咱们将介绍如何使用Jasmine进行Angular单元测试。
happy coding!