资讯专栏INFORMATION COLUMN

Angular单元测试系列-简介

CNZPH / 635人阅读

摘要:单元测试我们可以将其分成两类独立多带带测试与测试工具集。工具集还有更多,这一切我们将在单元测试组件与指令单元测试逐一说明。那么下一篇,我们将介绍如何使用进行单元测试。

本文将探讨如何搭建测试环境、以及Angular测试工具集。

测试环境

绝大部分都是利用Angular Cli来创建项目,因此,默认已经集成我们所需要的npm包与脚本;当然,如果你是使用自建或官网 quickstart 的话,需要自行安装;但所有核心数据全都是一样的。

Angular单元测试我们可以将其分成两类:独立多带带测试与Angular测试工具集。

Pipe与Service适为独立多带带测试,因为它们只需要 new 实例类即可;同样是无法与Angular组件进行任何交互。

与之相反就是Angular测试工具集。

测试框架介绍

Jasmine

Jasmine测试框架提供了编写测试脚本的工具集,而且非常优秀的语义化,让测试代码看起来像是在读一段话。

Karma

有测试脚本,还需要Karma来帮忙管理这些脚本,以便于在浏览器中运行。

Npm 包

如果你非要折腾,那么最简单的办法便是通过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单元测试的世界了。

Angular测试工具集

普通类诸如Pipe或Service,只需要通过简单的 new 创建实例。而对于指令、组件而言,需要一定的环境。这是因为Angular的模块概念,要想组件能运行,首先得有一个 @NgModule 定义。

工具集的信息量并不很多,你很容易可以掌握它。下面我简略说明几个最常用的:

TestBed

TestBed 就是Angular测试工具集提供的用于构建一个 @NgModule 测试环境模块。当然有了模块,还需要利用 TestBed.createComponent 创建一个用于测试目标组件的测试组件。

异步

Angular到处都是异步,而异步测试可以利用工具集中 asyncfakeAsync 编写优雅测试代码看着是同步。

工具集还有更多,这一切我们将在[Angular单元测试-组件与指令单元测试]()逐一说明。

那么下一篇,我们将介绍如何使用Jasmine进行Angular单元测试。

happy coding!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/87039.html

相关文章

  • Angular单元测试系列

    摘要:整个系列差不多涵盖或满足日常单元测试开发所需的知识,当然,像前面说的,你也认同单元测试的重要性,否则看这系列并无任何意义因为,我并不描述任何有关于开发技巧。 Angular单元测试在所有前端框架当中不要太爽了,但是要全面说好它,还真需要很长的篇幅,因为各种测试方式就如同在写一份Angular入门级开发一样。因此,我打算使用一个系列来说明。 当然,一切的前提是,你同我一样认同单元测试的重...

    iliyaku 评论0 收藏0
  • Angular单元测试系列-如何使用Jasmine进行Angular单元测试

    摘要:四结论本章几乎所有的内容在单元测试经常使用到的东西特别是异步部分,三种不同异步方式并非共存的,而是需要根据具体业务而采用。否则,你会发现真难写单元测试。自此,我们算是为写单元测试打下了基础。 以下是我假定那些极少或压根没写单元测试的人准备的,因此,会白话解释诸多概念性问题,同时会结合 Jasmine 与之对应的方法进行讲解。 一、概念 Test Suite 测试套件,哪怕一个简单的类,...

    zeyu 评论0 收藏0
  • Angular-mock之使用$httpBackend服务测试$http

    摘要:简介模块为单元测试提供模块定义加载注入等支持。为使用了的应用提供单元测试的伪后台。根据提示进行设置即可。将该文件保存为,测试时需按顺序将测试项目文件及依赖文件引入。最后在请求后执行就会立即执行完成请求。参考官方单元测试学习笔记 Angular-mock简介 Angular-mock模块为angular单元测试提供模块定义、加载、注入等支持。辅助Karma、Jasmine等JS测试工具来...

    rockswang 评论0 收藏0
  • 前端每周清单第 29 期:Web 现状分析与优化策略、Vue 单元测试、Headless Chrom

    摘要:前端每周清单第期现状分析与优化策略单元测试爬虫作者王下邀月熊编辑徐川前端每周清单专注前端领域内容,以对外文资料的搜集为主,帮助开发者了解一周前端热点分为新闻热点开发教程工程实践深度阅读开源项目巅峰人生等栏目。 showImg(https://segmentfault.com/img/remote/1460000011008022); 前端每周清单第 29 期:Web 现状分析与优化策略...

    HackerShell 评论0 收藏0
  • 王下邀月熊_Chevalier的前端每周清单系列文章索引

    摘要:感谢王下邀月熊分享的前端每周清单,为方便大家阅读,特整理一份索引。王下邀月熊大大也于年月日整理了自己的前端每周清单系列,并以年月为单位进行分类,具体内容看这里前端每周清单年度总结与盘点。 感谢 王下邀月熊_Chevalier 分享的前端每周清单,为方便大家阅读,特整理一份索引。 王下邀月熊大大也于 2018 年 3 月 31 日整理了自己的前端每周清单系列,并以年/月为单位进行分类,具...

    2501207950 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<