前端测试框架对比(js单元测试框架对比)

本文主要目的在于横评业界主流的几款前端框架,顺带说下相关的一些内容。

测试分类

通常应用会有 单元测试(Unit tests) 和 功能测试(Functional tests),复杂大型应用可能会有整合测试(Integration tests)。

其中:

  • 单元测试:关注应用中每个零部件的正常运转,防止后续修改影响之前的组件。
  • 功能测试:确保其整体表现符合预期,关注能否让用户正常使用。
  • 整合测试:确保单独运行正常的零部件整合到一起之后依然能正常运行。

    详细资料1

    详细资料2

    开发人员主要关注单元测试,作为开发中的反馈。本文重点讨论的单元测试框架。

    单元测试的好处:
  • 如果能通过单元测试,那么通过后续测试且软件整体正常运行的概率大大提高。
  • 单元测试发现的问题定位到细节,容易修改,节省时间。
  • 追踪问题变得更加方便。

选择单元测试框架

单元测试应该:简单,快速执行,清晰的错误报告。

测试框架基本上都做了同一件事儿:

  • 描述你要测试的东西
  • 对其进行测试
  • 判断是否符合预期

    选择框架会考虑下面的点:
  • 断言(Assertions):用于判断结果是否符合预期。有些框架需要单独的断言库。
  • 适合 TDD / BDD:是否适合 测试驱动型 / 行为驱动型 的测试风格。
  • 异步测试:有些框架对异步测试支持良好。
  • 使用的语言:大部分 js 测试框架使用 js。
  • 用于特定目的:每个框架可能会擅长处理不同的问题。
  • 社区是否活跃。

    注:
  • TDD:测试驱动型的开发方式,先写测试代码,之后编写能通过测试的业务代码,可以不断的在能通过测试的情况下重构。
  • BDD:与 TDD 很相似,测试代码的风格是预期结果,更关注功能,看起来像需求文档。

    其实都是先写测试代码,感觉BDD 风格更人性。

    参考链接

测试工具的类型

组合使用工具很常见,即使已选框架也能实现类似的功能

  • 提供测试框架(Mocha, Jasmine, Jest, Cucumber)
  • 提供断言(Chai, Jasmine, Jest, Unexpected)
  • 生成,展示测试结果(Mocha, Jasmine, Jest, Karma)
  • 快照测试(Jest, Ava)
  • 提供仿真(Sinon, Jasmine, enzyme, Jest, testdouble)
  • 生成测试覆盖率报告(Istanbul, Jest, Blanket)
  • 提供类浏览器环境(Protractor, Nightwatch, Phantom, Casper)

    解释上面提到的点:
  • 测试框架,即组织你的测试,当前流行 BDD 的测试结构。
  • 快照测试(snapshot testing),测试 UI 或数据结构是否和之前完全一致,通常 UI 测试不在单元测试中
  • 仿真(mocks, spies, and stubs):获取方法的调用信息,模拟方法,模块,甚至服务器

    相关资料

各框架特点

Jest

  • facebook 坐庄
  • 基于 Jasmine 至今已经做了大量修改添加了很多特性
  • 开箱即用配置少,API简单
  • 支持断言和仿真
  • 支持快照测试
  • 在隔离环境下测试
  • 互动模式选择要测试的模块
  • 优雅的测试覆盖率报告,基于Istanbul
  • 智能并行测试(参考)
  • 较新,社区不十分成熟
  • 全局环境,比如 describe 不需要引入直接用
  • 较多用于 React 项目(但广泛支持各种项目)

Mocha

  • 灵活(不包括断言和仿真,自己选对应工具)

    流行的选择:chai,sinon
  • 社区成熟用的人多,测试各种东西社区都有示例
  • 需要较多配置
  • 可以使用快照测试,但依然需要额外配置

Jasmine

  • 开箱即用(支持断言和仿真)
  • 全局环境
  • 比较'老',坑基本都有人踩过了

AVA

  • 异步,性能好
  • 简约,清晰
  • 快照测试和断言需要三方支持

Tape

  • 体积最小,只提供最关键的东西
  • 对比其他框架,只提供最底层的 API

总结一下,Mocha 用的人最多,社区最成熟,灵活,可配置性强易拓展,Jest 开箱即用,里边啥都有提供全面的方案,Tape 最精简,提供最基础的东西最底层的API。

参考

选择测试框架并不是非黑即白的事儿,就像你并不能证明PHP不是最好的语言。

个人倾向 Jest,原因:容易上手,开箱即用,功能全面。

社区意见

下面是在 stackshare 最流行的三个测试框架如下,但应考虑到 Jest 比较年轻,参与投票的时间较短的因素。



下面是三个框架在过去一年里 google 的搜索热度,但应该考虑到 Jest 比较年轻,大家尝试新东西,解决新问题,可能会带来较大搜索量。



下面是用户使用情况的调查,可以看出, Jest 忠诚度较高,使用后弃用的概率较低,Mocha 和 Jasmine 知名度最高。数据统计于 2017 年。



参考

代码样例

要测试的代码

'use strict'
var Math = {
add(a, b) {
return a + b;
}
}
module.exports = Math;

AVA

const test = require('ava');
const math = require('../Math'); const firstOperand = 2;
const secondOperand = 3; test("Math add function", t => {
const result = math.add(firstOperand, secondOperand); t.is(result, firstOperand + secondOperand);
});

Jasmine

var math = require('../Math');
describe("Math", function() {
var firstOperand;
var secondOperand;
beforeEach(function() {
firstOperand = 2;
secondOperand = 3;
});
it("should add two numbers", function() {
var result = math.add(firstOperand, secondOperand);
expect(result).toEqual(firstOperand + secondOperand);
});
});

Jest

jest.unmock('../Math'); // unmock to use the actual implementation of Math

var math = require('../Math');

describe("Math", function() {
var firstOperand;
var secondOperand; beforeEach(function() {
firstOperand = 2;
secondOperand = 3;
}); it("should add two numbers", function() {
var result = math.add(firstOperand, secondOperand);
expect(result).toEqual(firstOperand + secondOperand);
});
});

Mocha

var assert = require('assert'); // nodejs 内建断言
var math = require('../Math');
describe("Math", function() {
var firstOperand;
var secondOperand;
beforeEach(function() {
firstOperand = 2;
secondOperand = 3;
});
it("should add two numbers", function() {
var result = math.add(firstOperand, secondOperand);
assert.equal(result, firstOperand + secondOperand);
});
});

Tape

var test = require('tape');
var math = require('../Math');
var firstOperand = 2;
var secondOperand = 3;
test("Math add function", function(t) {
var result = math.add(firstOperand, secondOperand);
t.equal(result, firstOperand + secondOperand);
t.end();
});

参考资料1

参考资料2

参考资料3

前端测试框架对比(js单元测试框架对比)的更多相关文章

  1. js单元测试框架

    js单元测试框架 前端测试框架对比(js单元测试框架对比) 本文主要目的在于横评业界主流的几款前端框架,顺带说下相关的一些内容. 测试分类 通常应用会有 单元测试(Unit tests) 和 功能测试 ...

  2. JS单元测试框架:QUnit

    QUnit:jQuery的单元测试框架,但不仅限于jQuery(从这个工具不需要引用jquery.js可以看出) index.html <!-- 官网 http://qunitjs.com/ - ...

  3. python3+requests库框架设计05-unittest单元测试框架

    unittest单元测试框架,主要由四部分组成:测试固件.测试用例.测试套件.测试执行器 测试固件(test fixture) 测试固件有两部分,执行测试前的准备部分setUp(),测试执行完后的清扫 ...

  4. Selenium3+python自动化010-UnitTest框架简介和单元测试框架使用

    一.UnitTest介绍 unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过, ...

  5. python3+selenium框架设计07-unittest单元测试框架

    可以自行百度学习下单元测试框架,或者看Python3学习笔记26-unittest模块 在项目下新建一个entrance.py文件.并使用之前的测试用例进行演示.目前项目结构. ​ 在entrance ...

  6. Java单元测试框架 JUnit

    Java单元测试框架 JUnit JUnit是一个Java语言的单元测试框架.它由Kent Beck和Erich Gamma建立,逐渐成为源于KentBeck的sUnit的xUnit家族中为最成功的一 ...

  7. Selenium+Python ---- 免登录、等待、unittest单元测试框架、PO模型

    1.免登录在进行测试的过程中难免会遇到登录的情况,给测试工作添加了工作量,本文仅提供一些思路供参考解决方式:手动请求中添加cookies.火狐的profile文件记录信息实现.人工介入.万能验证码.去 ...

  8. 单元测试框架unittest

    单元测试:单元测试,是指对软件中的最小可测试单元进行检查和验证,对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义如:c语言中单元指一个函数,java里单元指一个类,图形化的软件中可以 ...

  9. Selenium基于Python web自动化基础二 -- 免登录、等待及unittest单元测试框架

    一.免登录在进行测试的过程中难免会遇到登录的情况,给测试工作添加了工作量,本文仅提供一些思路供参考解决方式:手动请求中添加cookies.火狐的profile文件记录信息实现.人工介入.万能验证码.去 ...

随机推荐

  1. BZOJ 3720: Gty的妹子树 [树上size分块]

    传送门 题意: 一棵树,询问子树中权值大于$k$的节点个数,修改点权值,插入新点:强制在线 一开始以为询问多少种不同的权值,那道CF的强制在线带修改版,直接吓哭 然后发现看错了这不一道树上分块水题.. ...

  2. VUE2.0 elemenui-ui 2.0.X 封装 省市区三级

    1. 效果图 2. 版本依赖  vue 2.X , elementui  2.0.11  使用element ui  <el-form>标签 3. 源码  components/CityL ...

  3. virsh 常用操作

    virsh list 显示在运行的 虚拟机    virsh list --all 显示在运行和停止的虚拟机    ssh 192.168.0.115 通过网络连接子机   如果没有网络 可以通过 v ...

  4. Socket网络通信之数据传递

    Socket通信的步骤: 1.创建ServerSocket和Socket 2.打开连接到Socket的输入/输出流 3.按照协议对Socket进行读/写操作 4.关闭输入输出流.关闭Socket 服务 ...

  5. FastDFS + Nginx 安装

    1.安装FastDFS依赖lib包 cd /usr/local/src/ git clone https://github.com/happyfish100/libfastcommon.git cd  ...

  6. SpringMvc出现Jsp页面不能正常解析成html网页

    <!-- Spring mvc配置 --> <servlet> <servlet-name>springMvc</servlet-name> <s ...

  7. GCC精彩之旅_2(转)

    说明: 本文共两篇,转自GCC精彩之旅.第一篇着重介绍GCC编译一个程序的过程与优化,第二篇侧重在GCC结合GDB对代码的调试. 调试     一个功能强大的调试器不仅为程序员提供了跟踪程序执行的手段 ...

  8. 学习Yii框架,有哪些比较好的网站

    1.http://www.yiiframework.com/ 2.http://www.kancloud.cn/curder/yii/247741 3.http://www.manks.top/yii ...

  9. 聚类-K均值

    数据来源:http://archive.ics.uci.edu/ml/datasets/seeds 15.26 14.84 0.871 5.763 3.312 2.221 5.22 Kama 14.8 ...

  10. java并发 - 自底向上的原理分析

    [TOC] 事先声明,我只是java并发的新手,这篇文章也只是我阅读<java并发编程的艺术>一书(内容主要涉及前3章)的一些总结和感悟.希望大家能多多讨论,对于错误的地方还请指出. 0. ...