使用Jest进行JavaScript单元测试

💓 博客主页:瑕疵的CSDN主页
📝 Gitee主页:瑕疵的gitee主页
⏩ 文章专栏:《热点资讯》

使用Jest进行JavaScript单元测试

    • 引言
    • Jest 简介
      • 安装 Jest
      • 创建基本配置
      • 编写测试用例
      • 运行测试
      • 快照测试
      • 模拟函数
      • 代码覆盖率报告
      • 最佳实践
        • 保持测试独立
        • 使用描述性命名
        • 模拟外部依赖
        • 写测试先于写代码
      • 实际案例
      • 总结

引言

在现代软件开发中,测试是确保代码质量和稳定性的关键步骤。Jest 是一个流行的 JavaScript 测试框架,它提供了丰富的功能和易用的 API,使得编写和运行单元测试变得更加简单。本文将详细介绍如何使用 Jest 进行 JavaScript 单元测试,包括安装、配置、编写测试用例和最佳实践等内容。

Jest 简介

Jest 是一个 JavaScript 测试框架,由 Facebook 维护。它主要用于测试 JavaScript 代码,但也支持 React、Vue 等前端框架。Jest 的主要特点包括:

  • 零配置:开箱即用,无需复杂的配置即可开始编写测试。
  • 快照测试:支持快照测试,可以轻松捕获 UI 组件的变化。
  • 模拟函数:提供强大的模拟函数功能,可以模拟外部依赖。
  • 并行执行:支持并行执行测试,提高测试速度。
  • 代码覆盖率报告:生成详细的代码覆盖率报告,帮助开发者了解测试覆盖情况。

安装 Jest

在使用 Jest 之前,需要安装必要的依赖。假设你已经安装了 Node.js 和 npm,可以使用以下命令安装 Jest:

npm init -y
npm install jest --save-dev

创建基本配置

Jest 默认会查找 package.json 中的 test 脚本。你可以在 package.json 中添加一个测试脚本:

{
  "scripts": {
    "test": "jest"
  }
}

编写测试用例

在项目的 __tests__ 目录下创建一个测试文件,例如 sum.test.js

// __tests__/sum.test.js
const sum = require('../sum');

it('adds 1 + 2 to equal 3', () => {
  expect(sum(1, 2)).toBe(3);
});

运行测试

使用以下命令运行测试:

npm test

这将根据配置文件运行所有的测试用例,并输出测试结果。

快照测试

快照测试是 Jest 的一个强大功能,可以捕获组件的输出并在后续测试中进行比较。例如,假设你有一个 React 组件:

// components/MyComponent.js
import React from 'react';

const MyComponent = () => (
  <div>
    <h1>Hello, World!</h1>
  </div>
);

export default MyComponent;

在测试文件中编写快照测试:

// __tests__/MyComponent.test.js
import React from 'react';
import renderer from 'react-test-renderer';
import MyComponent from '../components/MyComponent';

it('matches the snapshot', () => {
  const component = renderer.create(<MyComponent />);
  const tree = component.toJSON();
  expect(tree).toMatchSnapshot();
});

模拟函数

Jest 提供了强大的模拟函数功能,可以模拟外部依赖。例如,假设你有一个函数需要调用外部 API:

// src/api.js
const fetchData = async () => {
  const response = await fetch('https://api.example.com/data');
  return response.json();
};

module.exports = fetchData;

在测试文件中模拟 fetch 函数:

// __tests__/api.test.js
const fetchData = require('../src/api');

jest.mock('node-fetch');

it('calls the API and returns data', async () => {
  global.fetch = jest.fn(() =>
    Promise.resolve({
      json: () => Promise.resolve({ data: 'example' })
    })
  );

  const result = await fetchData();
  expect(result).toEqual({ data: 'example' });
});

代码覆盖率报告

Jest 可以生成详细的代码覆盖率报告。在 package.json 中添加一个覆盖率脚本:

{
  "scripts": {
    "test": "jest",
    "coverage": "jest --coverage"
  }
}

使用以下命令生成覆盖率报告:

npm run coverage

最佳实践

保持测试独立
每个测试用例应该独立于其他测试用例,避免相互影响。

使用描述性命名
测试用例的名称应该清晰明了,便于理解测试的目的。

模拟外部依赖
使用模拟函数和模块,避免测试依赖外部环境。

写测试先于写代码
遵循测试驱动开发(TDD)的原则,先编写测试用例再编写实现代码。

实际案例

Jest 已经被广泛应用于各种 JavaScript 项目,例如:

  • 前端应用:测试 React、Vue 等前端框架的组件和逻辑。
  • 后端应用:测试 Node.js 应用的业务逻辑和 API。
  • 库和框架:测试第三方库和框架的功能和性能。

总结

通过本文,你已经学会了如何使用 Jest 进行 JavaScript 单元测试。Jest 的零配置、快照测试、模拟函数和代码覆盖率报告等功能使其成为现代 JavaScript 开发的强大工具。
Jest 测试流程图

Jest 支持快照测试和模拟函数,可以更好地管理和验证代码的行为。
Jest 代码覆盖率报告示意图

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

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

相关文章

白杨SEO:百度在降低个人备案类网站搜索关键词排名和流量?怎样应对?【参考】

很久没有写百度或者网站这块内容了&#xff0c;一是因为做百度网站朋友越来越少&#xff0c;不管是个人还是企业&#xff1b;二是百度上用户搜索与百度给到网站的流量都越来越少。 为什么想到今天又来写这个呢&#xff1f;因为上个月有个朋友来咨询我说网站百度排名全没了&…

Linux——Shell的运行原理和Linux文件权限

Shell的运行原理和Linux文件权限 文章目录 Shell的运行原理和Linux文件权限1. Shell的运行原理(1) Shell是什么(2) 为什么要有Shell(3) Shell的运行原理(4) 解析命令行 2. Linux文件(1) 文件属性(2) 文件类型(3) 文件权限(4) 文件权限的修改(1) chmod(2) chown(3) chgrp (5) um…

linux守护进程与后台进程的区别

守护进程与后台进程有以下区别&#xff1a; 1. 概念与定义 后台进程&#xff1a; 是指在操作系统后台运行的进程&#xff0c;它不与用户直接交互&#xff08;没有连接到用户的终端&#xff09;。用户在终端中启动一个程序并让其在后台运行&#xff08;如通过在命令后加“&…

Jmeter5.X性能测试

Jmeter5.X性能测试 文章目录 Jmeter5.X性能测试一、掌握Http基础协议1.1 浏览器的B/S架构和C/S架构1.2 HyperText Transfer Protocol 超文本传输协议1.3 超文本传输协议Http消息体拆分讲解1.4 HTTP的九种请求方法和响应码介绍1.5 Http请求头/响应头1.6 Http常见请求/响应头cont…

Spring 配置绑定原理分析

Spring 配置绑定原理分析 前言 Spring 应用中存在诸多配置&#xff0c;有的是系统配置&#xff0c;有的命令行启动参数配置&#xff0c;有的是yaml配置&#xff0c;有的是分布式配置中心配置&#xff0c;但对使用者而言总是可以通过ConfigurationProperties将它关联到一个Java…

爬虫下载网页文夹

爬虫下载网页pdf文件 import os import requests from bs4 import BeautifulSoup from urllib.parse import urljoin from urllib.parse import urljoin, unquote from tqdm import tqdm # 设置网页的URL base_url "http://119/download/dzz/pdf/"# 创建保存文件的…

数据结构-归并排序笔记

【数据结构】八大排序(超详解附动图源码)_数据结构排序-CSDN博客 看这个学思路 一 归并排序介绍: 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法&#xff0c;该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解&#xf…

编译器优化乌龙——记一次死循环不进入问题

记一次死循环不生效问题 看如下代码&#xff0c;本意是我们模拟一次死循环&#xff0c;然后会在中断处理函数中更改waiting的值&#xff0c;更改waiting的值后&#xff0c;跳出死循环。 int waiting 0; while(waiting0){}运行起来发现&#xff0c;程序根本就没有进入这个死循…

构建第一个ArkTs应用

1、新建第一个页面文件。在“Project”窗口&#xff0c;点击“entry > src > main > ets > pages”&#xff0c;打开“Index.ets”文件&#xff0c;进行页面的编写。 2、新建第二个页面文件。在“Project”窗口&#xff0c;打开“entry > src > main > e…

一文搞懂Linux kernel编译步骤

一、前言 什么是Linux的内核编译呢&#xff1f;简单来说&#xff0c;Linux内核编译是一个将内核源代码转换成可在特定的硬件架构上运行的二进制文件的过程。通过编译内核&#xff0c;我们可以根据自己的需求和兴趣对内核进行定制和优化&#xff0c;以满足特定的应用场景。下文…

IDEA构建JavaWeb项目,并通过Tomcat成功运行

目录 一、Tomcat简介 二、Tomcat安装步骤 1.选择分支下载 2.点击下载zip安装包 3.解压到没有中文、空格和特殊字符的目录下 4.双击bin目录下的startup.bat脚本启动Tomcat 5.浏览器访问Tomcat 6.关闭Tomcat服务器 三、Tomcat目录介绍 四、WEB项目的标准结构 五、WEB…

消息通知——公众号、小程序、短信对比

消息通知——公众号、小程序、短信对比 引言 在数字化时代&#xff0c;高效、准确的消息通知对于提升用户体验、增强用户粘性至关重要。本报告将深入分析三种常见的消息通知方式&#xff1a;微信公众号推送、微信小程序推送以及手机短信推送&#xff0c;从实现方式、优缺点及细…

三维测量与建模笔记 - 3.2 直接线性变换法标定DLT

DLT - Direct Linear Transform 上图中&#xff0c;透视成像对应的公式是共线方程&#xff0c;可以参考以下链接&#xff1a; https://zhuanlan.zhihu.com/p/101549821https://zhuanlan.zhihu.com/p/101549821 对于标定来说&#xff0c;需要找到。已知量是。 (u,v)是…

消息队列面试——打破沙锅问到底

消息队列的面试连环炮 前言 你用过消息队列么&#xff1f;说说你们项目里是怎么用消息队列的&#xff1f; 我们有一个订单系统&#xff0c;订单系统会每次下一个新订单的时候&#xff0c;就会发送一条消息到ActiveMQ里面去&#xff0c;后台有一个库存系统&#xff0c;负责获取…

【论文复现】KAN卷积:医学图像分割新前沿

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀知识图谱推理 1. 概述2. 核心创新点3. 模块介绍KANUNext模块 4. 本文主要结构5. 主要代码6. 数据集7. 结果展示8. 参考文献 前言&#xff1a;…

Oracle与SQL Server的语法区别

1&#xff09;日期和日期转换函数。 SQL: SELECT A.*, CASE WHEN NVL(PAA009,) OR PAA009 >Convert(Varchar(10), SYSDATE,120) THEN Y ELSE N END AS ActiveUser FROM POWPAA A WHERE PAA001admin or PAA002admin Oracle: SELECT A.*, CASE WHEN NVL(PAA009,) or PAA009&…

基于TRIZ理论的便携式光伏手机充电装置创新

随着智能手机功能的日益强大&#xff0c;电量消耗问题也日益凸显&#xff0c;尤其是在户外活动时&#xff0c;电量告急常常让人措手不及。面对这一挑战&#xff0c;基于TRIZ&#xff08;发明问题解决理论&#xff09;的创新思维&#xff0c;一款全新的便携式光伏手机充电装置应…

Vue3父传子

1. App.vue - 父组件 咱们先来看左边的 App.vue&#xff0c;它扮演的是“父亲”角色——你可以想象它是一位热心的老爸&#xff0c;手里拿着一条消息&#xff0c;正准备把这条消息送到“儿子”那里。 <script setup> // 这个 setup 就像一个神奇的开关&#xff0c;一开…

前端 算法 双指针

文章目录 三数之和移动零盛最多水的容器接雨水 三数之和 leetcode 三数之和 题目链接 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有…

EPSON机械手与第三方相机的校准功能设计By python

EPSON机械手与第三方相机的校准功能设计By python 使用Python来实现EPSON机械手与第三方相机的校准功能是一个复杂但可行的任务。这通常涉及以下几个步骤:硬件接口通信、图像处理、标定算法实现和控制逻辑编写。 1. 环境准备 首先,库 pip install numpy opencv-python pyse…