使用jest测试用例之入门篇

Jest使用

Jest 是由 Facebook 开发的一个 js 测试框架,jest 主要侧重于被用于做单元测试和集成测试

安装

npm i jest -D

运行

**package.json**里面配置命令

// scripts添加测试脚本
{"test": "jest" /* 运行后便会使用 jest 执行所有的 .test.js 为后缀的测试文件 */
}
// 如果只想测试对应的文件并一直执行,可以使用如下命令
{"test": "npx jest 测试文件名称 --watch"
}

运行相应的文件代码,√ 测试加法 (5 ms)是测试通过,代表写的程序没问题, × 测试加法 (8 ms)是没通过

需要的结果-Expected: 3
实际的结果-Received: 4

使用

在项目中的任意位置(通常单独建个名为 test 的文件夹)新建以 .test.js 为后缀的测试文件,如 expect.test.js (若项目中有 test.js 存在,请改为其他名称,JEST 会将 test.js 也视为测试文件)

安装了 jest 之后,会提供一些全局的方法或者对象,例如 test、expect、jest,这些方法或者对象不需要导入,直接在测试文件中使用即可

it 方法实际上是 test 方法的一个别名

**expect**是断言方法

分组

describe

可以针对不同的测试用例来进行分组,分组语法:describe(这个分组的描述,回调函数),该方法也是一个全局方法,不需要导入直接使用

const { sum, sub, mul, div } = require('./tools')
describe("这是一组测试,测试加减法", () => {// 回调函数中就放一个一个的测试用例/*** 一个 test 方法意味着书写了一个测试用例* param1 :针对这个测试用例的一个描述* param2 :执行该用例所对应的回调函数*/test("测试加法", () => {expect(sum(1, 2)).toBe(3);});test("测试减法", () => {expect(sub(10, 5)).toBe(5);});
});describe("这是一组测试,测试乘除法", () => {/*** it 方法实际上是 test 方法的一个别名*/it("测试乘法", () => {expect(mul(2, 3)).toBe(6);});it("测试除法", () => {expect(div(10, 2)).toBe(5);});
});

修饰符

not

用于对断言进行取反操作,可以与各种断言函数结合使用,以表示一个断言的否定形式。

// not表示不相等
it('1+2不等于4', () => {// 1+2判断不等于4expect(1+2).not.toBe(4) //  true
})
resolves
rejects

匹配器

toBe

执行的是 ES6 的Object.is,与严格相等运算符(===)基本一致,不会进行强制类型转换,不同之处为 +0不等于-0,NaN等于自身,对引用类型的数据(如对象、数组等),比较其地址是否相同。

const { sum, sub, mul, div } = require("./tools")
test("断言2+2=4", () => {expect(2 + 2).toBe(4);
});// 可以以相同的方式测试其他的工具函数:
it("测试加法", ()=>{expect(sum(1, 2)).toBe(3);expect(sub(10, 5)).toBe(5);expect(mul(2, 3)).toBe(6);expect(div(10, 2)).toBe(5);
})
// toBe比较不了深度对象
test('深度比较对象', () => {const stu = {name : "张三", score : {html : 100, css : 90}};expect(stu).not.toBe({name : "张三", score : {html : 100, css : 90}}) // 测试通过
})
toEqual

会递归比较对象的所有属性, 比较数组/对象的每一项,但会忽略 undefined

test('深度比较对象', () => {// expect({ a: 1, b: 2 }).toEqual({ a: 1, b: 2 }) // 结果是trueconst stu = {name : "张三", score : {html : 100, css : 90}};expect(stu).toEqual({name : "张三", score : {html : 100, css : 90}}) // 测试通过expect(stu).toEqual({name : "张三", score : {html : 100, css : 100}}) // 测试报错
})it('有undefined', () => {const stu = {name : "张三", job: undefined, score : {html : 100, css : 90}};expect(stu).toEqual({name : "张三", score : {html : 100, css : 90}}) // 测试通过
})

**toBe与toEqual**的区别是:

toBe‌用于比较两个值是否严格相等(使用===操作符)适用于以下场景:

  • 原始类型‌:如数字、字符串、布尔值。
  • 引用类型‌:检查两个引用是否指向同一个内存地址。

toEqual‌用于深度比较两个对象或数组,检查它们的值是否相等,而不是检查它们是否指向同一个内存地址。它适用于以下场景:

  • 对象‌:比较对象的属性值是否相等。
  • 数组‌:比较数组的元素是否相等
toStrictEqual

严格相等:与 toEqual 类似,但不会忽略 undefined

it('有undefined', () => {const stu = {name : "张三", job: undefined, score : {html : 100, css : 90}};expect(stu).toStrictEqual({name : "张三", score : {html : 100, css : 90}}) // 测试报错
})
布尔值

toBeFalsy: 断言为 false

toBeTruthy:断言为 true

toBeNull: 断言为 null

toBeDefined:测试一个值是否被定义,即检查该值是否不是undefined

toBeUndefined:断言为 undefined

test("布尔值相关匹配器",()=>{const n = null;expect(n).toBeFalsy();// 取反:是falseexpect(n).not.toBeTruthy();const a = 0;// 0是falseexpect(a).toBeFalsy();// toBeTruthy断言是true,not是取反就是falseexpect(a).not.toBeTruthy();
})test("无参匹配器",()=>{const n = null;// toBeNull断言是nullexpect(n).toBeNull();// toBeDefined断言不是undefinedexpect(n).toBeDefined();// toBeUndefined断言不是undefinedexpect(n).not.toBeUndefined();const a = 0;// toBeNull断言不是nullexpect(a).not.toBeNull();// toBeDefined断言不是undefinedexpect(a).toBeDefined();// toBeUndefined断言不是undefinedexpect(a).not.toBeUndefined();
})
数值

数值就是两个数值之间大小的比较,有大于、大于等于、小于、小于等于之类的

toBeGreaterThan:大于

toBeGreaterThanOrEqual:大于等于

toBeLessThan:小于

toBeLessThanOrEqual: 小于等于

toBeCloseTo:是否接近某个数

// 数值匹配器
test("数值相关匹配器",()=>{const a = 1;const b = 2;// toBeGreaterThan断言大于expect(a).toBeGreaterThan(b); // 输出错误// toBeGreaterThanOrEqual断言大于等于expect(a).toBeGreaterThanOrEqual(b); // 输出错误// toBeLessThan断言小于expect(a).toBeLessThan(b); // 输出正确// toBeLessThanOrEqual断言小于等于expect(a).toBeLessThanOrEqual(b);// 这里需要注意一下浮点数const value2 = 0.1 + 0.2;// toBeCloseTo断言是否接近expect(value2).toBeCloseTo(0.3);// toBeCloseTo 还接受第二个参数,第二个参数用于指定位数,默认是两位expect(0.302).toBeCloseTo(0.301);expect(0.302).not.toBeCloseTo(0.301, 5);
})
toMatch

可以检查字符串是否和某一个正则表达式能够匹配上

test("字符串相关匹配器",()=>{expect("this is a test").toMatch(/test/); // 输出正确expect("this is a test").not.toMatch(/abc/); // 输出正确,not 取反
})
toContain

数组中查找指定项,toContain进行的是全等比较,也就是严格比较

const shoppingList = ["diapers","kleenex","trash bags","paper towels","milk",
];
test("数组相关匹配器", () => {expect(shoppingList).toContain("milk");// toContain 进行的是全等比较,也就是严格比较expect([1, 2, 3]).not.toContain("1");expect([{ name: "张三" }, { name: "李四" }]).not.toContain({ name: "张三" });// // toContain 还可以用来检测一个字符串是否是另一个字符串的子串expect("this is a test").toContain("test");// // 也可以用到集合(set)里面expect(new Set(shoppingList)).toContain("milk");
});
toThrow

用于判断函数是否抛出异常,并可以指定抛出异常的具体内容。

function compileCode(){throw new Error("aaa you are using the wrong JDK bbb");
}test("异常相关的匹配器",()=>{expect(()=>compileCode()).toThrow();// toThrow 里面可以传递不同的参数expect(()=>compileCode()).toThrow(Error);expect(()=>compileCode()).toThrow("you are using the wrong JDK");expect(()=>compileCode()).toThrow(/JDK/);
})
arrayContaining

匹配一个测试返回的数组,它包含所有预期的元素。就是说,这个预期数组是测试返回数组的一个子集。

const arr = ["张三"];
test("上面的数组不包含某一项", () => {expect(["李四", "王武", "赵六"]).toEqual(expect.not.arrayContaining(arr));
});
objectContaining

匹配一个测试返回的对象,它包含所有预期的元素。就是说,这个预期数组是测试返回对象的一个子集。

const obj = {name : "张三"};
test("对象不包含上面的键值对",()=>{expect({age : 18}).toEqual(expect.not.objectContaining(obj));expect({name: "李四",age : 18}).toEqual(expect.not.objectContaining(obj));
})

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

推荐一个比较好的开源的工作流引擎

由于DeepSeek等AI大模型的出现,工作流模式再次流行起来,低代码甚至零代码就可以实现应用开发,而且有DeepSeek这样的超级AI作为大脑,人人都可以开发自动化工作流。 比如搭建邮件助手工作流,可以自动润色各种邮件内容。…

CarPlanner:用于自动驾驶大规模强化学习的一致性自回归轨迹规划

25年2月来自浙大和菜鸟网络的论文“CarPlanner: Consistent Auto-regressive Trajectory Planning for Large-scale Reinforcement Learning in Autonomous Driving”。 轨迹规划对于自动驾驶至关重要,可确保在复杂环境中安全高效地导航。虽然最近基于学习的方法&a…

Fedora41安装MySQL8.4.4

Fedora41安装MySQL8.4.4 Fedora41用yum仓库安装MySQL8.4.4 笔记250310下载安装启动mysqld服务查看生成的初始密码 , 用初始密码登录登录后,必须修改初始密码才能执行其它操作可选设置降低密码强度要求, 使用简单密码降低 validate_password 组件对密码强度的要求 用SET GLOBAL命…

信息安全意识之安全组织架构图

一、信息安全技术概论1.网络在当今社会中的重要作用2.信息安全的内涵 网络出现前:主要面向数据的安全,对信息的机密性、完整性和可用性的保护,即CIA三元组 网络出现后,还涵盖了面向用户的安全,即鉴别,授权&…

安卓Android与iOS设备管理对比:企业选择指南

目录 一、管理方式差异 Android Enterprise方案包含三种典型模式: Apple MDM方案主要提供两种模式: 二、安全防护能力 Android系统特点: 三、应用管理方案 四、设备选择建议 五、典型场景推荐 需求场景 推荐方案 六、决策建议要点…

linunx ubuntu24.04.02装libfuse2导致无法开机进不了桌面解决办法

osu.appimage运行需要libfuse2 然后我就下了fuse,打了两把第二天无法开机 这样是不能开机的 这样是可以开机的 解决办法一:玩星火商店的osu,好了问题解决 解决办法二: 在这个页面 ctrl alt f2进入tty6 sudo apt install ubuntu-desktop 进…

mysql-8.0.41-winx64 手动安装详细教程(2025版)

mysql-8.0.41-winx64 手动安装详细教程(2025版) 一、下载安装包二、配置环境变量三、安装配置四、启动 MySQL 服务,修改密码 一、下载安装包 安装地址如下: https://dev.mysql.com/downloads/mysql/使用7-zip或其他解压软件&…

wireguard搭配udp2raw部署内网

前言 上一篇写了使用 wireguard 可以非常轻松的进行组网部署,但是如果服务器厂商屏蔽了 udp 端口,那就没法了 针对 udp 被服务器厂商屏蔽的情况,需要使用一款 udp2raw 或 socat 类似的工具,来将 udp 打包成 tcp 进行通信 这里以…

[杂学笔记] TCP和UDP的区别,对http接口解释 , Cookie和Session的区别 ,http和https的区别 , 智能指针 ,断点续传

文章目录 1. TCP和UDP的区别2. 对http接口解释3. Cookie和Session的区别4. http和https的区别5. 智能指针6.断点续传 1. TCP和UDP的区别 tcp的特点: 面向连接,可靠性高,全双工,面向字节流udp特点:无连接,不…

Qt入门笔记

目录 一、前言 二、创建Qt项目 2.1、使用向导创建 2.2、最简单的Qt应用程序 2.2.1、main函数 2.2.2、widget.h文件 2.2.3、widget.cpp文件 2.3、Qt按键Botton 2.3.1、创建一个Botton 2.3.2、信号与槽 2.3.3、按键使用信号与槽的方法 2.4、文件Read与Write-QFile类 2…

Unity辅助工具_头部与svn

Unity调用者按钮增加PlaySideButton using QQu; using UnityEditor; using UnityEngine; [InitializeOnLoad] public class PlaySideButton {static PlaySideButton(){UnityEditorToolbar.RightToolbarGUI.Add(OnRightToolbarGUI);UnityEditorToolbar.LeftToolbarGUI.Add(OnLe…

ubuntu软件

视频软件,大部分的编码都能适应 sudo apt install vlc图片软件 sudo apt install gwenview截图软件 sudo apt install flameshot设置快捷键 flameshot flameshot gui -p /home/cyun/Pictures/flameshot也就是把它保存到一个自定义的路径 菜单更换 sudo apt r…

Spring (十)事务

目录 一 Spring数据库的相关配置: 1 导入包: 2 配置数据库连接信息 3 可以直接使用:DataSource,JdbcTemplate 二 事务管理: 1 事务管理的实现 1.1 开启Spring事务管理 1.2 为指定方法添加事务 2 关键类与接口 2.1 事务拦…

【MySQL_04】数据库基本操作(用户管理--配置文件--远程连接--数据库信息查看、创建、删除)

文章目录 一、MySQL 用户管理1.1 用户管理1.11 mysql.user表详解1.12 添加用户1.13 修改用户权限1.14 删除用户1.15 密码问题 二、MySQL 配置文件2.1 配置文件位置2.2 配置文件结构2.3 常用配置参数 三、MySQL远程连接四、数据库的查看、创建、删除4.1 查看数据库4.2 创建、删除…

Java算术运算符与算术表达式

Java算术运算符包括(加、正号)、-(减、负号)、*(乘)、/(除)、%(求余)、(自增)和--(自减)。它们用于构建算术表…

【网络】HTTP协议、HTTPS协议

HTTP与HTTPS HTTP协议概述 HTTP(超文本传输协议):工作在OSI顶层应用层,用于客户端(浏览器)与服务器之间的通信,B/S模式 无状态:每次请求独立,服务器不保存客户端状态(通过Cookie/Session扩展状态管理)。基于TCP:默认端口80(HTTP)、443(HTTPS),保证可靠传输。请…

Linux 网络:skb 数据管理

文章目录 1. 前言2. skb 数据管理2.1 初始化2.2 数据的插入2.2.1 在头部插入数据2.2.2 在尾部插入数据 2.2 数据的移除 3. 小结 1. 前言 限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。 2. skb 数据管理 数…

考研数学复习之定积分定义求解数列极限(超详细教程)

定积分定义求解数列极限是一种将数列极限问题转化为定积分问题进行求解的方法。这种方法通常适用于那些和式数列极限,其主要思路是将数列的项看作是某个函数在某一点或某一段区间上的取值或某种形式的和,然后利用定积分的性质和计算方法,来求解这类数列的极限。 定积分定义 设函…

Linux-基础开发工具

1.软件包管理器 1.1什么是软件包 • 在Linux下安装软件, ⼀个通常的办法是下载到程序的源代码, 并进⾏编译, 得到可执⾏程序. • 但是这样太⿇烦了, 于是有些⼈把⼀些常⽤的软件提前编译好, 做成软件包(可以理解成windows上 的安装程序)放在⼀个服务器上, 通过包管理器可以很…

【无人机路径规划】基于麻雀搜索算法(SSA)的无人机路径规划(Matlab)

效果一览 代码获取私信博主基于麻雀搜索算法(SSA)的无人机路径规划(Matlab) 一、算法背景与核心思想 麻雀搜索算法(Sparrow Search Algorithm, SSA)是一种受麻雀群体觅食行为启发的元启发式算法&#xff0…