Jest和Mocha两者之间有哪些区别?

什么是单元测试?

  所谓单元测试,是对软件中单个功能组件进行测试的一种软件测试方式,其目的是确保代码中的每一个基本单元都能正常运行。因此,开发人员在应用程序开发的整个过程(即代码编写过程)中都需要进行单元测试。在进入到软件开发的下一阶段之前,对程序进行单元测试是一个不错的主意。单元测试非常有用,它使用简单并且运行迅速。

  单元测试是测试驱动开发(TDD)的重要组成部分,在我们进行实际功能开发之前,它是用来描述功能的预期行为以及我们想要它实现(或不实现)哪些功能的一种实践方式。采用TDD的方式来进行软件开发有几个目的:

  • 这种技术可以帮助我们识别一些边界情况,并确保在这些情况下我们的代码仍然可以正常工作。
  • 帮助我们确定如何才能成功实现程序中的某项功能。
  • 随着代码库的增长,单元测试可以确保新的修改不会对代码库中原有的功能产生不良影响。

Jest和Mocha介绍

Jest

  Jest是Facebook开发的一个JavaScript测试框架,它主要被用于基于React的应用程序测试,当然也可以用于Babel、JavaScript、Node、Angular和Vue。此外,它还可以用来测试NestJS、Next.js和GraphQL。Jest测试框架可以与其它JavaScript代码库进行整合,使你能够非常容易地使用功能丰富的API来开发测试程序并快速地返回测试结果。

Jest的特点:

  • 零配置:Jest可以在没有任何配置的情况下在大多数javaScript应用程序中运行,这意味着你可以将Jest作为一个依赖项添加到项目中并开始编写你的第一个测试程序,而不需要添加或者只需要添加非常少量的配置项。
  • 丰富的API:Jest以拥有健壮的API而闻名,这些API包含了针对各种不同需求的断言。此外,它还拥有非常优秀的文档,可以帮助你快速上手并运行测试程序。
  • 快照:对前端测试而言快照是必不可少的,因为它们允许你验证大量对象的完整性,这意味着你不需要创建包含断言的冗长的测试来确保对象上的每个属性都存在并包含正确的值。
  • 隔离:在执行单元测试的过程中,隔离非常重要,它可以确保不同的测试结果之间不会相互干扰。Jest以并行方式运行测试,并且每个测试都在自己的进程中运行,所以各个测试之间不会相互干扰。Jest会协调管理所有的测试并收集测试结果。
  • 支持快照测试:快照测试可以确保我们要测试的应用程序的用户界面不会在不同的版本之间发生意外的改变。
  • 对TypeScript的支持:通过安装ts-jest包,Jest提供了对TypeScript的支持。
  • 兼容性:Jest框架可以和Angular、React、NodeJS、VueJS以及其它使用Babel的项目兼容。
  • Jasmine特性:Jest基于Jasmine,并且继承了Jasmine的所有特性。虽然Jest从Jasmine脱离出来,但是它保留了Jasmine的所有特性并对功能进行了改进。
  • 速度:Jest是一款执行速度非常快的测试工具。当我们的测试程序受到CPU资源限制时,Jest可以在整个测试过程中节省大量的时间,例如,Jest将本地测试时间从45分钟缩短到15分钟。
  • Timer模拟:Jest可以通过下面几种方法来操作时间:
  1. setTimeout
  2. clearInterval
  3. setInterval
  4. clearTimeout

Jest的使用限制

  • 使用自动mocking功能可能会导致测试程序运行缓慢。这是因为模块的依赖项越多,Jest就需要更多的时间来查找和模拟这些依赖项以完成代码测试。
  • 对于那些创建大量包含数千行代码的快照文件的项目而言,Jest快照测试并不适用。
  • Jest所包含的工具很少,与那些成熟的库(如Mocha)相比,它的支持也不是很多。所以对那些希望使用IDE(如WebStorm)来运行和调试测试代码的开发者来说,这可能是一个缺点。

Mocha

  Mocha是一款开源的JavaScript测试框架,可以在浏览器和Node.js中运行。Mocha可以用来测试同步和异步代码。

  Mocha可以提供灵活和精准的测试报告,同时可以将未捕获的异常映射到相应的测试用例中。Mocha支持多种形式的测试,例如单元测试、集成测试,以及端到端的测试等。Mocha为开发人员提供了一个基本的测试框架,同时它还包括大量的断言、模拟和间谍库,这些库必须单独安装,其中Chai和Sinon非常受欢迎。

Mocha的特点

  • 支持任何断言库:Mocha支持许多JavaScript断言库,包括Express.js、Should.js和Chai,这使得我们可以非常容易地编写测试代码,对于编写复杂的测试用例来说也会很轻松。
  • 支持同步和异步测试:Mocha通过执行测试用例中的回调函数来完成异步测试过程。如果不指定回调函数,Mocha也可以进行同步测试。
  • 同时支持BDD和TDD:Mocha同时支持行为驱动开发(BDD——Behavior-Driven Development)和测试驱动开发(TDD——Test-Driven Development),使得构建高质量测试和增加代码覆盖率变得简单。
  • 多浏览器支持:通过Mocha,我们可以非常容易地编写在各主流浏览器中运行的测试代码。同时Mocha还支持浏览器插件扩展。每个Mocha版本都包含了针对不同Web浏览器中对JavaScript和CSS构建的更新。
  • 多种安装方式:Mocha可以在本地全局安装,也可以作为项目的依赖项进行局部安装。另外,它也可以直接在Web浏览器中执行测试用例。

使用Mocha的限制

  • 与作为独立框架运行的Jest不同,Mocha需要的配置项更多,而且依赖的库也比较多。
  • 在使用Mocha时必须为其选择一种断言库。

Jest和Mocha的全面比较

  乍一看,Jest和Mocha之间的区别不太大,但是有几个地方我们必须考虑。

  首先,Jest被设计成一个独立的测试框架,它不需要依赖于任何其它库。而Mocha则需要借助于其它库来完成测试工作,所以使用Mocha时开发人员必须首先选择在项目中使用哪些assertion库、mocking库以及其它库。

  此外,Mocha并没有为这些第三方库指定复杂的依赖关系,这也是它被认为是一种有效的工具而能够快速执行测试工作的原因之一。同样,由于Mocha对这些库的配置没有严格要求,所以它被认为是一个不错的工具,而且通常比其它类似的工具使用起来更容易,运行更高效。

  相比Mocha而言,Jest所包含的特性要少一些,而且有些基本功能不支持,例如不支持异步测试。但是Jest最大的优点就是使用简单。作为一个轻量级的、简单易用的测试框架,Jest也许是最好的选择。

  Jest的运行速度比Mocha要快,这是因为它具备快照测试能力,当代码被修改时测试会自动执行,因而测试始终都能保持最新。

  Mocha提供了更多的功能,与Jest相比它更成熟,同时也拥有更多的社区贡献者。

  让我们快速看一下这个图:

  上面显示了两个npm模块的下载量随时间变化的趋势。可以看到,Jest的地位远超Macha,其每周的下载量几乎是Mocha的两倍。不过,Mocha与Jest的市场定位不同,它更成熟,可靠性高,所提供的解决方案也更加紧凑。

我们应该使用哪个测试框架?

  Jest内置了许多工具,对开发人员来说,有些工具并不是必须的,这种将所有工具都打包到一起的做法对有些人来说并非受欢迎(想想后端项目中的快照测试)。但对其他人来说,这也并非是一个坏处,因为这样做避免了在需要时到处去找。

  许多人可能会认为对很多后端项目而言,Mocha的这种按需配置提供了更多的灵活性。但假如测试程序的运行速度是一个必须要考虑的因素,那么Mocha所带来的这种灵活性与Jest的执行效率之间相比就需要认真考虑。

  对前端开发而言,使用Mocha的标准做法是使用框架的创建者所发布的工具包,这样有利于Mocha与工具包更好地集成,同时当框架的新版本发布时,这些工具包也能更快地得到更新。React-Testing-Library很好地说明了为什么在React项目中Jest比Mocha更加合适。

  如果你的项目很大,并且要求足够的灵活性和可定制性,那么Mocha无疑是你最好的选择。但是如果你的项目比较小而且不需要太多额外的配置项,那么Jest则是最好的选择。所以,对你和你的团队来说究竟要选择哪个测试框架这完全取决于你自己。

结论

  在本文中,我们对Jest和Mocha这两种测试框架进行了简要的分析和评估,以帮助我们在项目中如何选择最合适的测试框架。更多内容可以访问Mocha和Jest的站点。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《Web安全基础》03. SQL 注入

web 1:简要 SQL 注入2:MySQL 注入2.1:信息获取2.2:跨库攻击2.3:文件读写2.4:常见防护 3:注入方法3.1:类型方法明确3.2:盲注3.3:编码3.4:二次注入3…

循环神经网络(RNN)

目录 1.序列模型的应用 2.循环神经网络(Recurrent Neural Network, RNN) RNN的输入序列和输出序列的长度不一定一致。RNN也有不同的架构。 3.使用RNN构建一个语言模型(language model) 对于一个语言识别任务,对于一个…

离散 Hopfield 神经网络的分类与matlab实现

1 案例背景 1.1离散 Hopfield 神经网络学习规则 离散型 Hopfield神经网络的结构、工作方式,稳定性等问题在第9章中已经进行了详细的介绍,此处不再赘述。本节将详细介绍离散Hopfield神经网络权系数矩阵的设计方法。设计权系数矩阵的目的是: ①保证系统在异步工作时的稳…

学生信息管理系统自动化测试

项目地址: http://82.156.151.156:8080/login.html 一、系统测试用例 二、测试实现过程 先是根据自己的项目设计了一个 UI 自动化测试用例, 然后根据这个测试用例使用了 selenium4自动化测试工具和 JUnit5单元测试框架结合实现的 web 自动化测试.。 测试模块划分…

视频爬虫:解析m3u8文件 python m3u8库,m3u8文件中.ts视频流的解密下载

一、引用的库 这里需要引用的库是:from Crypto.Cipher import AES 有坑哈,python3.0之后直接安装crypto你会发现不管怎么着都会报错。 经过查找资料找到了原因,原来是20年之后crypto已经被pycryptohome替换掉啦, 如果之前安装过…

Spring Cloud实战案例 │ Apollo和Zuul的整合开发

Apollo是携程研发的开源配置管理中心,能够集中管理应用于不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性。 本案例结合一个案例介绍Apollo和Zuul的整合开发。整个应用分为4个微服务项目&…

Nacos 下载安装教程

文章目录 事先准备下载并启动 Nacos设置 Nacos 开机自启动开放 Linux 外部访问权限访问 Nacos 管理界面附录 笔者的运行环境: 安装成功过的 Nacos: Nacos 2.2.3 安装成功过的 Java: Java 17.0.7 安装成功过的 Linux: RedHat Ent…

Windows 安装Tensorflow2.1、Pycharm开发环境

文章目录 1、安装anaconda2、安装Tensoflow2.1、创建虚拟环境2.2、安装Tensorflow依赖2.3、验证Tensorflow是否成功 3、配置pycharm环境4、错误记录 1、安装anaconda https://www.anaconda.com/download 打开命令行工具,出现base就表示安装成功了,表示当…

Vue2 第十一节 Vue的生命周期

1.生命周期的概念 2.生命周期流程图 3.生命周期分析 一.生命周期概念 生命周期又称为生命周期回调函数,生命周期函数,生命周期钩子是Vue在关键时刻帮我们调用的一些特殊名称的函数生命周期函数的名字不可更改,但函数的具体内容是程序员根…

如祺出行冲刺自动驾驶商业化,人少的地方机会多?

网约车,正在迎来让人“不明觉厉”的新一轮竞赛。 网约车监管信息交互系统的数据显示,截至今年6月30日,全国共有318家网约车平台公司取得网约车平台经营许可,环比增加5家;网约车监管信息交互系统6月份共收到订单信息7.…

【数据结构】二叉树、二叉搜索树、平衡二叉树、红黑树、B树、B+树

概述 二叉树(Binary Tree):每个节点最多有两个子节点(左子节点和右子节点),没有限制节点的顺序。特点是简单直观,易于实现,但查找效率较低。 二叉搜索树(Binary Search…

【网络基础进阶之路】设计网络划分的实战详解

PS:本要求基于华为的eNSP模拟软件进行 具体要求: 完成步骤: 1、对192.168.1.0/24进行子网划分 2、对每一个路由器进行IP的配置 3、开始静态路由的书写,在写之前,我们可以先对每一个路由器写一条通向右边的缺省路由&…

父类B为抽象类,继承接口A,子类C必须实现B和A中的抽象方法

1. 子类C必须实现A中的抽象方法。 2. 子类C必须实现B中的抽象方法 3 在1中,我们知道,C不显示实现A,依旧要实现A的所有方法。 然而代码设计中,C可能会依旧显示实现A,然后实现A的所有方法。(这样做的好处还…

本科专科毕业论文如何选题-附1000多论文题目-论文选题--【毕业论文】

文章目录 本系列校训毕设的技术铺垫论文选题选题目的和意义:选题举例参考文献 配套资源 本系列校训 互相伤害互相卷,玩命学习要你管,天生我才必有用,我命由我不由天! 毕业论文不怕难,毕业设计来铺垫&#…

【LeetCode】对称二叉树 平衡二叉树

对称二叉树 即先判断根节点的左右子树相不相同,相同时,再判断左孩子的左子树和右孩子的右子树比较,左孩子的右子树和右孩子的左子树(当两个都相同时才是对称的).....依次递推,过程中并设置一些不满足相同的…

Java生成二维码

使用google的开发工具包ZXing生成二维码 一、导入jar包 <!-- zxing生成二维码 --> <dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.3.3</version> </dependency><depen…

FFmpeg常见命令行(一):FFmpeg工具使用基础

前言 在Android音视频开发中&#xff0c;网上知识点过于零碎&#xff0c;自学起来难度非常大&#xff0c;不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》。本文是Android音视频任务列表的其中一个&#xff0c; 对应的要学习的内容是&#xff1a;FFmpe…

【分布式系统】聊聊系统监控

对于分布式系统来说&#xff0c;出现故障的是常有的事情&#xff0c;如何在短时间内找到故障的原因&#xff0c;排除故障是非常重要的&#xff0c;而监控系统是就像系统的眼睛可以通过分析相关数据&#xff0c;进一步管理和运维整个分布式系统。 监控系统的的基本功能包含 全…

C++初阶函数重载

目录 函数重载函数名修饰规则 函数重载 C语言不允许同名函数 CPP可以&#xff0c;但是要求构成函数重载 函数名相同&#xff0c;参数不同(参数类型、参数个数、参数类型的顺序)&#xff0c;返回值不同不能构成重载 int Add(int left, int right) {cout << "int Ad…

【机器学习】Gradient Descent for Logistic Regression

Gradient Descent for Logistic Regression 1. 数据集&#xff08;多变量&#xff09;2. 逻辑梯度下降3. 梯度下降的实现及代码描述3.1 计算梯度3.2 梯度下降 4. 数据集&#xff08;单变量&#xff09;附录 导入所需的库 import copy, math import numpy as np %matplotlib wi…