如何做好前端单元测试?字节5年测试老司机是这样说的!

news2024/11/16 11:40:02

近几年,前端发展越来越迅猛,各类框架层出不穷,前端实现的业务逻辑也越来越复杂,前端单元测试也越来越受重视,包括百度在内的一些大厂在面试中也会问到单元测试相关的题目。那么前端应该如何做好单元测试?

什么是单测

单测的定义

来自维基百科的定义:

在计算机编程中, 单元测试(Unit Testing)又称为 模块测试,是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。
程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最小单元就是方法,包括基类(超类)、抽象类、或者派生类(子类)中的方法。

定义里面指出,单元测试针对的是程序的最小单元,因此我们应该针对最小单元来写单测。

单测完善程度的衡量

单测完善程度的衡量用覆盖率来衡量

关于测试覆盖率,我们大致了解下以下几个常见的计算维度:

  • 行覆盖率:可执行语句执行的比例
  • 函数覆盖率:函数被调用的比例
  • 分支覆盖率:判断语句分支被执行的比例

来看下面这个例子:

对于测试用例 foo(4),分支覆盖率只有50%,原因是 foo(4) 只测试了if 为 true 的情况,没有测试到 if 为 false 的情况。

如果想要分支覆盖率达到100%,还应该测试 foo(5)。

为什么需要单测

现状与问题

  • 缺乏意识:没有单测意识,很多代码没有单测
  • 缺乏设计:模块缺乏设计,相互耦合,写单测困难
  • 测试困难:升级公共 API,人工测试验证困难
  • 测试不全面:部分代码分支众多,人工测试没办法覆盖所有分支

单测的价值与意义

  • 能力建设:一个具备开发经验的开发人员,基本上都会编写单元测试。即便不会,可以通过培训来快速达成。从学习曲线上看,单元测试很容易上手。
  • 提升效率:能够通过 mock 数据,及早发现问题,而越早发现Bug,造成的浪费就会越小。
  • 追求卓越:单元测试可以充当一个设计工具,它有助于开发人员去思考代码结构的设计,让代码更加有利于测试。
  • 测试更全面:能够覆盖 QA 测试覆盖不到的情况,比如各种 if 分支、异常处理。
  • 更有信心:升级公共 API 时,如果依赖这个 API 的所有代码单测都能通过,那我们对这次代码升级是更有信心的。
现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:110685036【暗号:csdn999】

怎样写单测

单测的原则:FIRST

单测需要测什么:RIGHT BICEP

结果正确

这个是最基本的检查,如果单测的运行结果都不正确,那其他的都免谈。

边界条件检查

边界检查尤为重要,很多错误都是发生在边界上。边界检查遵循 CORRECT

  • 有序性:如果一组值是有序的,那么在向其中删除或者添加时,需要校验这组值是否仍然是有序的
  • 引用/耦合性:对于类的状态、其他对象的状态等需要做一些假设,程序员就需要对代码进行测试,保证在假设未满足的情况下运行良好。
  • 存在性:当数据不存在的时候,程序是否运行良好,例如null,空字符串等
  • 基数性:这里的基数主要强调的是计数,考虑以“0-1-N 原则”,当数值分别为0、1、N 时,可能出现的结果,其中N 为最大值。
  • 时间性:要充分考虑与时间相关的问题,涉及到并发、异步、超时等这些情况需要特别注意,所有事情的发生时间是否在预期范围内。

反向关联检查

  • 例:对于加密算法,使用解密算法反向检查其输出,验证解密后明文是否正确。
  • 例:对于写操作API,使用读操作API来反向检查验证

交叉检查

  • 例: 对性能优化的算法,使用性能差但验证过的算法交叉检查


强制错误条件发生

  • 例: Mock依赖系统不可用
 或者 Mock系统时间错误
  • 例:甚至可以直接throw error,来验证程序对错误的处理

满足性能要求

当某个程序升级的时候,是否会对性能造成影响?这需要我们对程序的性能进行测试

写单测的时机

写单测的时机主要有以下三种,大家可以根据自己的实际情况来进行选择。

具体实现代码之前

即测试驱动开发(TDD):编写某个功能的代码之前先编写测试代码,然后编写使测试通过的功能代码,重复这个过程,通过测试来推动整个开发的进行。

特点:UT 能够更好的实践我们的代码设计。对于某些复杂度较高的接口(甚至是一些私有方法),建议使用 TDD 进行开发。

与具体实现代码同步进行

先写少量功能代码,紧接着写单元测试(重复这两个过程,直到完成功能代码开发)。

特点:每个单测比较简单易懂,可读性可维护性都比较好(重构时单测的改动不大)。

编写完功能代码后

这种单元测试“粒度”会比较粗。对同样的功能代码,采取前两种方案的结果可能是用10个“小”的单测来覆盖,而这种方案写的单测,往往是用1个“大”的单测来覆盖。

特点:逻辑就比较复杂,因为它要测的东西很多,可读性可维护性可能会比较差。

单测的思路

测试工具的分类

在我们开始选择单测工具之前,需要先了解测试工具的几种分类:

  • Test runner
  • Test framework
  • Assertion library
  • Testing Plugins

通常需要这几种类别的工具组合一起使用来完成测试,也有测试框架集成了这几类工具,如 Jest,做到开箱即用。

Test runner

测试运行器,只负责找出代码中所有的单元测试用例,然后启动运行它们,最终获取测试结果。并不关心那些测试用例到底是用什么语言编写的,以及我们究竟采用的是什么框架,它所做的仅仅是运行这些测试而已。

Karma是 Test runner

Test framework

测试框架,它定义了测试用例的语法和API,以及如何为这些用例编写断言。

Jasmine MochaJest 是 Test framework

Testing Plugins

测试插件如Sinon,使我们能够执行更多不同的测试,如mock、stubs、 fake servers等。

Assertion library

断言指的是一些布尔表达式,在程序中的某个特定点该表达式值为真,判断代码的实际执行结果与预期结果是否一致,而断言库则是讲常用的方法封装起来。

常用断言库主要有:

  • assert (TDD) node自带
assert("mike" == user.name);
  • expect.js(BDD) expect 风格的断言
expect(foo).to.be("aa");
  • should.js(BDD)should 风格的断言
foo.should.be("aa"); 
  • chai(BDD/TDD) - 集成了expect()、assert()和 should 风格的断言

测试框架的选择

以下介绍几种目前流行的测试工具供大家参考,主要有:

  • Jest
  • Mocha
  • Jasmine
  • AVA
  • Tape

Jest

Jest是目前最流行的框架之一,是Facebook团队构建和维护的JavaScript测试框架,基于 Jasmine,至今已经做了大量修改添加了很多特性。

主要有以下优点:

  • 开箱即用配置少,API简单
  • 支持断言和仿真
  • 支持快照测试
  • 在隔离环境下测试
  • 优雅的测试覆盖率报告
  • 良好的官网文档

Mocha

Mocha是目前使用最多的js测试框架,同时支持前端和后端测试。可以在node.js和浏览器中运行,使异步测试变的简单而有趣。Mocha测试按串行运行,将未捕获的异常映射到正确的测试用例上,从而可以灵活、准确地报告。

主要优点包括:

  • 适用于前端和后端
  • 支持NodeJS调试器
  • 支持任何浏览器
  • 支持Object Mock
  • 社区成熟用的人多,测试各种东西社区都有示例

但是mocha不提供断言,需要引入断言库,断言库可以选择 chai sinon

Jasmine

Jasmine可以模仿用户行为,Jasmine可用于测试前端的可见性,单击清晰度以及不同分辨率下的UI响应速度。 Jasmine允许通过延迟和等待时间来自动化用户行为,以模拟实际的用户行为。

主要优点有:

  • 几乎为0的外部依赖,适用于网站、Node.js项目或任何JavaScript可以运行的地方
  • 开箱即用(支持断言和仿真),API简单
  • 支持前端和后端测试

AVA

AVA是一种极简的轻量级测试框架,它利用了Javascript的异步特性,可以并发运行测试。它主要专注于针对基于NodeJS的代码运行测试。

主要优点包括:

  • 体积小,运行速度快
  • 异步并发运行测试
  • 比大多数其他测试框架更快
  • 简单语法
  • 干净的堆栈跟踪,使得可以检测到任何潜在的错误

Tape

Tape 架构上与AVA非常相似,它不支持全局变量,因此需要在每个测试文件中require Tape。

主要优点为:

  • 体积最小,只提供最关键的东西
  • 只提供最底层的 API,为开发人员编写测试用例提供完全的自由
  • 支持ES6,Typescript和coffee脚本标准
  • 支持大多数现代浏览器上的测试执行

选择哪种测试框架不是非黑即白的,每种测试框架都有各自的优缺点,选择哪种框架可以根据项目实际情况及个人习惯来定。

个人更倾向于 Jest,因为它容易上手,开箱即用,功能全面,官方文档很详细,对于新手来说使用成本很低。

END今天的分享就到此结束了!点赞关注不迷路~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1272756.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

写给步入三十的自己,2023年终总结!

前言 古语有云: “二十而立,三十而肆”,而我在二十岁这些年已经有一定的责任感和独立思考了,但是还未步入三十,所以为了之后有一定的胆识和能力,我在今年做了目前能做的准备。 今年已做事件 工作相关 1.拿到了PMP证书…

2023年大数据场景智能运维实践总结

作者:放纵 引言 在当今数字化世界中,如何充分挖掘和发挥数据价值已经成为了企业成功的关键因素,大数据也成为企业决策和运营的重要驱动力。在《当我们在谈论DataOps时,我们到底在谈论什么》一文中也提到,企业在面对到…

开关电源基础而又硬核的知识

1.什么是Power Supply? Power Supply是一种提供电力能源的设备,它可以将一种电力能源形式转换成另外一种电力能源形式,并能对其进行控制和调节。 根据转换的形式分类:AC/DC、DC/DC、DC/AC、AC/AC 根据转换的方法分类:线性电源、…

Docker篇之利用docker搭建ftp服务器可实现多用户上传

一、前言 场景:公司需要搭建FTP服务器,供内网之前可以互相传递数据,安全稳定,需要满足开通多个账号,每个用户上传的文件有自己对应的文件目录。 这里建议:用户目录Disk尽量大一点,避免因为空间不…

滴滴2023.11.27P0级故障技术复盘回顾(k8s的的错?)

本文从滴滴官方恢复及技术公众号带大家从技术角度复盘这次事故 目录 1. 背景 2. 滴滴官方消息 3. 问题分析及定位 4.网传的k8s及解析 5.k8s引发的思考:举一反三,怎么避免再次出现 6.近段时间其他平台崩溃回顾 1. 背景 11 月 27 晚约 10 点&#xf…

【Openstack Train安装】六、Keystone安装

OpenStack是一个云计算平台的项目,其中Keystone是一个身份认证服务组件,它提供了认证、授权和目录的服务。其他OpenStack服务组件都需要使用Keystone来验证用户的身份和权限,并且彼此之间需要相互协作。当一个OpenStack服务组件接收到用户的请…

FastDFS+Nginx - 本地搭建文件服务器同时实现在外远程访问「内网穿透」

文章目录 前言1. 本地搭建FastDFS文件系统1.1 环境安装1.2 安装libfastcommon1.3 安装FastDFS1.4 配置Tracker1.5 配置Storage1.6 测试上传下载1.7 与Nginx整合1.8 安装Nginx1.9 配置Nginx 2. 局域网测试访问FastDFS3. 安装cpolar内网穿透4. 配置公网访问地址5. 固定公网地址5.…

智安网络|发现未知风险,探索渗透测试的奥秘与技巧

在当今信息时代,网络安全已成为组织和个人面临的重大挑战。为了保护网络系统的安全,渗透测试成为一种重要的手段。 一、渗透测试的基本原理 渗透测试是通过模拟黑客攻击的方式,对目标系统进行安全评估。其基本原理是模拟真实攻击者的思维和行…

特征变换1

编译工具:PyCharm 有些编译工具不用写print可以直接将数据打印出来,pycharm需要写print才会打印出来。 概念 1.特征类型 特征的类型:“离散型”和“连续型” 机器学习算法对特征的类型是有要求的,不是任意类型的特征都可以随意…

数据结构:图文详解顺序表的各种操作(新增元素,查找元素,删除元素,给指定位置元素赋值)

目录 一.顺序表的概念 二.顺序表的实现 新增元素 默认尾部新增 指定位置添加元素 查找元素 查找是否存在 查找元素对应的位置 查找指定位置对应的元素 删除元素 获取顺序表长度 清空顺序表 一.顺序表的概念 在线性数据结构中,我们一般分为俩类&#xf…

【电源专题】DC/DC电源FB分压电阻设计注意事项

在DC/DC电源中我们不可避免的会遇到FB分压电阻的取值,PCB设计等问题。如下所示随意打开一份同步降压稳压器规格书TPS56320X,规格书中的简化电路原理图就已经存在VFB管脚上的两个分压电阻。 很多工程师朋友们会误认为分压电阻只是简单的将输出电压缩小到参考电压,通过此电压来…

网狐类源码游戏配置数据库数据(一键配置网狐数据库)

网狐类源码游戏配置数据库数据(一键配置网狐数据库) 一般拿到网狐的源码或组件,需要先附加或配置数据库,以下为全部需要更改数据的地方,这里以荣耀系列版本数据库为例: 1. 数据库设置 [RYPlatformDB].…

文档理解的新时代:LayOutLM模型的全方位解读

一、引言 在现代文档处理和信息提取领域,机器学习模型的作用日益凸显。特别是在自然语言处理(NLP)技术快速发展的背景下,如何让机器更加精准地理解和处理复杂文档成为了一个挑战。文档不仅包含文本信息,还包括布局、图…

STM32CubeIDE(CUBE-MX)----快速移植FreeRTOS实战

文章目录 前言一、Freertos可视化配置二、生成代码三、实验现象总结 前言 FreeRTOS(Real-Time Operating System)是一个开源的实时操作系统内核,专注于嵌入式系统。它提供了一套用于管理任务、调度器、内存管理等的实时操作系统功能&#xf…

OSG编程指南<十七>:OSG光照与材质

1、OSG光照 OSG 全面支持 OpenGL 的光照特性,包括材质属性(material property)、光照属性(light property)和光照模型(lighting model)。与 OpenGL 相似,OSG 中的光源也是不可见的&a…

MSUSB30模拟开关可Pin to Pin兼容FSUSB30/SGM7222

MSUSB30/MSUSB30N 是一款高速、低功耗双刀双掷 USB 模拟开关芯片,其工作电压范围是1.8V 至5.5V。可Pin to Pin兼容FSUSB30/SGM7222。其具有低码间偏移、高通道噪声隔离度、宽带宽的特性。 MSUSB30/MSUSB30N 主要应用范围包括:具有 USB2.0 接口的手持设备…

天眼销:超有用的企业获客工具

天眼销是资深数据团队开发的一个客户资源查询平台,可以通过多重筛选:企业名称/信用代码,所在地区,行业,注册资本,年限,是否在营/有电话/邮箱等。 天眼销和某查查有什么区别? 天*查/…

python高级练习题库实验1(A)部分

文章目录 题目1代码实验结果题目2代码实验结果题目3代码实验结果题目4代码实验结果题目总结题目1 输入一个整数,用于控制输出*的个数,输入日期,按照特定格式输出 研究下面的例子,并编写一个与这些例子完全相同的程序。 代码 import datetime# ask user for length of b…

STC15-串口通信打印输出数据printf函数与sprintf函数

STC15-串口通信打印输出数据printf函数与sprintf函数 1.打印输出数据有二种printf函数与sprintf函数,不同之处有:(1)函数的声明不同(2)函数的功能不同(3)用法举例 该问题引用百度知道…

记i18n ally工具检测语言失败的一则思路

情况 只有某个文件检测不到汉字,其余都可以检测出来,困扰许久,发个博客记一下思路 解决方法: 1、肯定不是i18n ally工具的问题,因为其他的vue都能检测成功 2、是这个文件的问题 采用排除法 先删掉所有代码&#…