js单元测试框架
js单元测试框架
前端测试框架对比(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();
});
js单元测试框架的更多相关文章
- 前端测试框架对比(js单元测试框架对比)
前端测试框架对比(js单元测试框架对比) 本文主要目的在于横评业界主流的几款前端框架,顺带说下相关的一些内容. 测试分类 通常应用会有 单元测试(Unit tests) 和 功能测试(Function ...
- JS单元测试框架:QUnit
QUnit:jQuery的单元测试框架,但不仅限于jQuery(从这个工具不需要引用jquery.js可以看出) index.html <!-- 官网 http://qunitjs.com/ - ...
- javascript单元测试框架mochajs详解
关于单元测试的想法 对于一些比较重要的项目,每次更新代码之后总是要自己测好久,担心一旦上线出了问题影响的服务太多,此时就希望能有一个比较规范的测试流程.在github上看到牛逼的javascript开 ...
- JavaScript单元测试框架JsUnit基本介绍和使用
JavaScript单元测试框架JsUnit基本介绍和使用 XUnit framework XUnit是一套标准化的独立于语言的概念和结构集合,用于编写和运行单元测试(Unit tests). 每一个 ...
- JavaScript单元测试框架-Jasmine
Jasmine的开发团队来自PivotalLabs,他们一开始开发的JavaScript测试框架是JsUnit,来源于著名的JAVA测试框架JUnit.JsUnit是xUnit的JavaScript实 ...
- 现在流行什么 JS库/框架?
现在大家最感兴趣的 JS 库和框架是什么? jQuery 91.5% Underscore 38.6% AngularJS 28.5% Backbone 18.6% React 15.7% Knock ...
- Javascript单元测试框架比较Qunit VS Jasmine
Javascript单元测试框架比较Qunit VS Jasmine 工欲行其事必先利其器,好的单元测试框架是TDD成功的一半.Javascript优秀的测试框架很多, 包括Jasmine,Qunit ...
- 玩转Node.js单元测试
代码部署之前,进行一定的单元测试是十分必要的,这样能够有效并且持续保证代码质量.而实践表明,高质量的单元测试还可以帮助我们完善自己的代码.这篇博客将通过一些简单的测试案例,介绍几款Node.js测试模 ...
- Selenium+Python ---- 免登录、等待、unittest单元测试框架、PO模型
1.免登录在进行测试的过程中难免会遇到登录的情况,给测试工作添加了工作量,本文仅提供一些思路供参考解决方式:手动请求中添加cookies.火狐的profile文件记录信息实现.人工介入.万能验证码.去 ...
随机推荐
- The Super Powers UVA - 11752(合数幂)
题意: 求1~2^64-1之间所有的 至少是两个不同的正整数的幂的数 升序输出 一个数的合数次幂即为这样的数 找出1~2^64-1中所有数的合数次幂 用set存起来(既能防止重复 又能升序) 最后输 ...
- C语言常用修饰符
前言 这两天在梳理自己C语言的知识,发现写了这么久的代码,居然所有的知识点都在自己的脑袋里.这可不好,万一老了呢.... 接下来的几天里,会以文字的形式,将这些知识整理出来,分享给大家. 想要看看英文 ...
- 【BZOJ1071】[SCOI2007]组队(神仙题)
[BZOJ1071][SCOI2007]组队(神仙题) 题面 BZOJ 洛谷 题解 首先把式子整理一下,也就是\(A*h+B*v\le C+A*minH+B*minV\) 我们正常能够想到的做法是钦定 ...
- kubernetes1.8开启swagger-ui
现在的版本默认只开启了6443安全端口,需要证书验证才能访问api,实现起来稍微有点麻烦,这里提供一个简单的方法. 先来看看官方说明: Complete API details are documen ...
- 解题:NOIP 2018 保卫王国
题面 最小支配集=全集-最大独立集 所以先把点权改成正无穷/负无穷来保证强制选/不选某个点到独立集里,然后变成了洛谷的动态DP模板 GTMDNOIP2018ZTY #include<stack& ...
- AtCoder Regular Contest 069 F - Flags
题意: 有n个点需要摆在一个数轴上,每个点需要摆在ai这个位置或者bi上,问怎么摆能使数轴上相邻两个点之间的距离的最小值最大. 二分答案后显然是个2-sat判定问题,因为边很多而连边的又是一个区间,所 ...
- java web 验证码-字符变形(推荐)
该文章转载自:http://www.cnblogs.com/jianlun/articles/5553452.html 因为在我做的这个系统中发现验证码有点偏上,整体效果看起来不太好,就做了一些修改. ...
- 如何解决eclipse、MyEclipse中变量名自动补全问题
背景:这个问题困扰了很长时间,解决过程也并不顺利.不断的试错,再次让我理解这下面这句话—— 世界上对的路可能只有一条,错的路却可能有成千上万条,不要成为别人的前车之鉴.开发之路,只需要记住对的路就行了 ...
- python之旅:网络编程
一 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构 互联网中处处是C/S架构 如黄色网站是服务端,你的浏览器是客户端(B/S架构也是C/S架构的一种) 腾讯作为服务端为你提供视频 ...
- Android后台服务拍照
原文:https://blog.csdn.net/wurensen/article/details/47024961 一.背景介绍最近在项目中遇到一个需求,实现一个后台拍照的功能.一开始在网上寻找解决 ...