【Node.js从基础到高级运用】十五、单元测试与集成测试

引言

在Node.js开发过程中,测试是确保代码质量和功能正确性的关键步骤。单元测试和集成测试是最常见的测试类型。下面我们将使用Jest框架来进行测试。

单元测试

单元测试是指对软件中的最小可测试单元进行检查和验证。在Node.js中,这通常指的是函数或者模块。

安装Jest

首先,你需要在你的Node.js项目中安装Jest。通过npm可以轻松安装:

npm install --save-dev jest

配置Jest

package.json文件中添加以下Jest配置:

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

这样,你就可以通过运行npm test命令来执行测试了。

编写单元测试

假设我们有一个简单的函数add,我们想要测试它:

// js/add.js
function add(a, b) {
  return a + b;
}

module.exports = add;

为了测试这个函数,我们创建一个测试文件add.test.js

// test/add.test.js
const add = require('../js/add');

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

在上面的代码中,我们使用test函数定义了一个测试用例,然后使用expecttoBe来进行断言。

运行单元测试

运行以下命令来执行测试:

npm test

Jest将自动找到所有的测试文件并执行它们。
在这里插入图片描述

集成测试

集成测试是指测试应用程序中多个模块或服务协同工作的情况。在Node.js中,这通常涉及到数据库操作、网络请求等。

编写集成测试

假设我们有一个简单的Express服务器,我们想要测试它的一个端点:

// test15.js
const express = require('express');
const add = require('./add');

const app = express();

app.get('/add', (req, res) => {
  const { a, b } = req.query;
  res.send({ result: add(Number(a), Number(b)) });
});

module.exports = app;

我们可以使用Jest和supertest来测试这个端点:

npm install --save-dev supertest

创建一个测试文件test15.test.js

// test/test15.test.js
const request = require('supertest'); // 引入supertest库,用于对HTTP请求进行模拟
const app = require('./test15'); // 引入我们的Express应用

// 使用describe定义一个测试套件,其中包含了多个测试用例
describe('GET /add', () => {
  // 使用it定义一个测试用例,测试GET /add端点
  it('responds with json containing the sum of a and b', (done) => {
    request(app) // 使用supertest对app发起请求
      .get('/add') // 指定请求类型为GET,并设置请求路径为/add
      .query({ a: 1, b: 2 }) // 设置请求查询参数a=1&b=2
      .expect('Content-Type', /json/) // 预期响应头Content-Type为json类型
      .expect(200) // 预期响应状态码为200
      .then(response => { // 请求成功后获取响应对象
        expect(response.body.result).toBe(3); // 使用expect断言响应体中的result值为3
        done(); // 调用done回调函数表示测试结束
      })
      .catch(err => done(err)); // 捕获异常,如果有异常通过done传递给Jest处理
  });
});

在这个测试文件中,我们使用了describeit来组织我们的测试代码。describe定义了一个测试套件,它是一系列相关测试用例的集合。it则定义了一个具体的测试用例。

我们通过supertest库来模拟发起HTTP请求,并通过链式调用来设置请求的具体参数和预期的响应。通过.expect方法可以设置对响应的预期,例如预期的响应头和状态码。.then方法用于处理请求成功的情况,我们在其中使用expect来进行断言,验证响应体是否符合预期。

最后,我们使用done回调来告诉Jest这个异步的测试用例何时完成。如果请求过程中出现异常,我们通过.catch捕获异常,并通过done将错误传递给Jest,以便Jest可以正确地标记这个测试用例失败。

运行集成测试

和运行单元测试一样,你只需要执行:

npm test

Jest同样会执行集成测试。
在这里插入图片描述

jest高级运用

我们来实现一个异步函数的测试,该函数从某个API获取数据,并使用mock功能来模拟API调用。这样可以在不实际进行网络请求的情况下测试函数的逻辑。

异步数据获取函数

假设我们有一个函数fetchData,它从一个假设的API https://api.example.com/data 获取数据:

// test15-2.js
const axios = require('axios'); // 引入axios库,用于发起HTTP请求

async function fetchData() {
  const response = await axios.get('https://api.example.com/data'); // 使用axios向API发起GET请求
  return response.data; // 返回响应体的数据
}

module.exports = fetchData;

编写测试并使用Jest Mock

为了测试这个异步函数而不实际发起网络请求,我们将使用Jest的mock功能来模拟axios库。

// test/test15-2.test.js
jest.mock('axios'); // 告诉Jest模拟axios模块
const axios = require('axios'); // 引入axios
const fetchData = require('../test15-2'); // 引入我们的fetchData函数

// 定义测试套件
describe('fetchData', () => {
  // 定义一个测试用例,测试fetchData是否能正确处理数据
  it('fetches successfully data from an API', async () => {
    const mockData = { data: 'some data' }; // 定义模拟的API响应数据
    axios.get.mockResolvedValue(mockData); // 使用mockResolvedValue来模拟axios.get方法的成功返回

    await expect(fetchData()).resolves.toEqual('some data'); // 使用resolves来测试Promise是否被成功解析,期望fetchData的结果等于'some data'
  });

  // 定义另一个测试用例,测试在API请求失败时的行为
  it('fetches erroneously data from an API', async () => {
    const errorMessage = 'Network Error'; // 定义模拟的错误消息
    axios.get.mockRejectedValue(new Error(errorMessage)); // 使用mockRejectedValue来模拟axios.get方法的失败返回

    await expect(fetchData()).rejects.toThrow(errorMessage); // 使用rejects来测试Promise是否被拒绝,并且抛出了错误消息
  });
});

在这个高级示例中,我们首先使用jest.mock来告诉Jest我们想要模拟axios模块。这样,当我们在测试中调用axios.get时,实际上调用的是一个Jest提供的模拟函数,而不是真正的axios.get。这使得测试既快速又独立于外部系统。

通过mockResolvedValuemockRejectedValue,我们可以控制模拟的axios.get方法在被调用时返回一个成功的Promise或一个失败的Promise,从而测试我们的fetchData函数在不同情况下的行为。

这种方式非常适合测试依赖于异步数据获取的函数,无需担心网络延迟或服务不可用的问题,同时也能确保测试的准确性和可重复性。

运行测试

在这里插入图片描述

总结

通过上述步骤,我们学习了如何在Node.js项目中使用Jest进行单元测试和集成测试。单元测试帮助我们验证各个独立模块的功能,而集成测试确保这些模块能够协同工作。Jest是一个功能强大的测试框架,它提供了丰富的API来编写和运行测试用例。通过这些测试,我们可以提高代码的质量和稳定性。

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

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

相关文章

ISIS接口明文认证实验简述

默认情况下,ISIS接口认证通过在ISIS协议数据单元(PDU)中添加认证字段,例如:一个密钥或密码,用于验证发送方的身份。 ISIS接口认证防止未经授权的设备加入到网络中,并确保邻居之间的通信是可信的…

智慧城市:提升城市治理能力的关键

目录 一、智慧城市的概念及特点 二、智慧城市在提升城市治理能力中的应用实践 1、智慧交通:提高交通治理效率 2、智慧政务:提升政府服务水平 3、智慧环保:加强环境监测与治理 4、智慧安防:提高城市安全水平 三、智慧城市在…

【计算机视觉】Gaussian Splatting源码解读补充

本文旨在补充gwpscut创作的博文学习笔记之——3D Gaussian Splatting源码解读。 Gaussian Splatting Github地址:https://github.com/graphdeco-inria/gaussian-splatting 论文地址:https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/3d_gauss…

基于nodejs+vue班级管理系统的设计与实现-flask-django-python-php

随着电子技术的普及和快速发展,线上管理系统被广泛的使用,有很多事业单位和商业机构都在实现电子信息化管理,班级管理系统也不例外,由比较传统的人工管理转向了电子化、信息化、系统化的管理。随着互联网技术的高速发展&#xff0…

STM32编写ADC功能,实现单路测量电压值(OLED显示)

先来看看本次实验的结果吧:stm32点电压测量范围为0-3.3V,数值为:0-4095 来看看这个工程的文件布局吧: 实现ADC功能总共分为六步: 第一步:开始RCC时钟,包括ADC和GPIO的时钟,ADCCLK的…

六、C#快速排序算法

简介 快速排序是一种常用的排序算法,它基于分治的思想,通过将一个无序的序列分割成两个子序列,并递归地对子序列进行排序,最终完成整个序列的排序。 其基本思路如下: 选择数组中的一个元素作为基准(pivot…

SQL server服务连接失败,通过端口1433连接到主机 localhost的 TCP/IP 连接失败

SQL server服务连接失败,通过端口1433连接到主机 localhost的 TCP/IP 连接失败 出现这个错误的时候,首先确保sql的服务正常启动 通常来说正常安装的SQL server之后,会自带一个软件 打开:SQL server配置管理器 确认一下红框内的…

GitHub Copilot+ESP开发实战-串口

上篇文章讲了GitHub Copilot在应用中可能遇到的问题,接下来小启就简单介绍下GitHub Copilot在ESP32开发中C语言实现串口功能,感兴趣的可以看看。 一、向Copilot提问: 1. ESP32用C语言实现串口初始化; 2.配置uart为1&#xff0c…

【STM32嵌入式系统设计与开发】——6矩阵按键应用(4x4)

这里写目录标题 一、任务描述二、任务实施1、SingleKey工程文件夹创建2、函数编辑(1)主函数编辑(2)LED IO初始化函数(LED_Init())(3)开发板矩阵键盘IO初始化(ExpKeyBordInit())&…

QT配置libtorch(一步到位!!!防止踩坑)

QT配置libtorch Qt下载QT配置MSVCQT配置Libtorch Qt下载 Qt点击下载 Qt的安装选择MSVC2017 64-bit(一定要安装,这关乎后面的配置!!!),其他的根据自己的选择进行安装 QT配置MSVC Visual Studio点击安装 这里需要安装VS以…

Flutter-实现扫描线移动效果

效果 唠叨 在许多应用中,我们经常会看到扫描线的动画效果,比如二维码扫描、条形码扫描等。在Flutter中,我们可以通过自定义控件来实现这种扫描线移动的效果。本文将介绍如何使用Flutter创建一个扫描线移动的控件,并分析其实现思路…

HarmonyOS NEXT应用开发之Navigation实现多设备适配案例

介绍 在应用开发时,一个应用需要适配多终端的设备,使用Navigation的mode属性来实现一套代码,多终端适配。 效果图预览 使用说明 将程序运行在折叠屏手机或者平板上观看适配效果。 实现思路 本例涉及的关键特性和实现方案如下&#xff1a…

学习总结1

算法 这两天对搜索(主要是dfs)进行了复习,写了四道题目. 解题思路 这道题我用dfs进行解题,这道题比起其他的只多了一个Z轴也就是多了两个方向. 代码 #include <string.h> #include <stdio.h> char g[31][31][31]; int ne[7][3]{{1,0,0},{-1,0,0},{0,1,0},{0,-1…

React状态管理库快速上手-Redux(一)

基本使用 安装 pnpm install reduxjs/toolkit react-redux创建一个仓库 定义state createSlice相当于创建了一个模块仓库&#xff0c;initialState存放状态&#xff0c;reducers存放改变状态的方法。 import { createSlice } from reduxjs/toolkitexport const counterSli…

2024.3.19

思维导图 模拟面试 1.友元的作用 答&#xff1a;通过关键字friend&#xff0c;可以让一些函数或者类&#xff0c;可以访问一个类中的私有数据成员。 2.匿名对象的作用 答&#xff1a;匿名对象就是没有名字的对象&#xff0c;是用来给有名对象进行初始化工作的。 3.常成员函…

使用Vscode连接云进行前端开发

使用Vscode连接云进行前端开发 1、ssh连接腾讯云 本人使用的是腾讯云。 然后vscode,用最新版&#xff0c;插件选择remote ssh&#xff0c;或者remote xxx下载过来。 然后点击远程资源管理器&#xff0c;选择SSH通道 然后输入命令如下。 ssh rootip然后输入密码 腾讯云应该…

Java使用itextpdf往pdf中插入图片

引入maven依赖 <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.9</version> </dependency>java代码 import cn.hutool.extra.qrcode.QrCodeUtil; import com.itextpdf.text.*; i…

nodejs 使用express插件multer文件上传,接收不到文件的bug

把路径改成绝对路径即可 改成 temp是你想上传到文件夹的路径&#xff0c;一般是在项目根目录下

未来汽车EE架构趋势

多种趋势推动着电动汽车&#xff08;EV&#xff09;、混合动力电动汽车&#xff08;HEV&#xff09;和插电式混合动力电动汽车&#xff08;PHEV&#xff09;的发展。城市化和可持续发展的压力促使各国政府出台支持性法规&#xff0c;使制造商从中受益&#xff0c;而税收优惠政策…

C#,图论与图算法,计算无向连通图中长度为n环的算法与源代码

1 无向连通图中长度为n环 给定一个无向连通图和一个数n,计算图中长度为n的环的总数。长度为n的循环仅表示该循环包含n个顶点和n条边。我们必须统计存在的所有这样的环。 为了解决这个问题,可以有效地使用DFS(深度优先搜索)。使用DFS,我们可以找到特定源(或起点)的长度…
最新文章