从0开始学习JavaScript--JavaScript 单元测试

news2024/11/18 7:28:34

JavaScript单元测试是保障代码质量和可维护性的关键步骤之一。通过编写和运行单元测试,开发者可以确保代码在不断迭代的过程中依然具有正确的行为。本文将深入探讨JavaScript单元测试的核心概念、工具使用和最佳实践,并通过丰富的示例代码演示其实际应用。

1. 单元测试的基本概念

1.1 什么是单元测试?

单元测试是对代码中最小可测试单元进行验证的过程。这个最小单元通常是函数、方法或类中的一个功能。单元测试旨在保证每个单元的功能是正确的,当进行修改时,能够快速检测到潜在的问题。

1.2 为什么需要单元测试?

  • 保证代码质量: 单元测试可以捕捉潜在的错误,确保每个功能单元都按照预期工作。

  • 提高可维护性: 单元测试作为代码文档的一部分,帮助开发者理解和维护代码。

  • 支持重构: 在重构代码时,单元测试可以确保修改不会破坏现有的功能。

2. 单元测试工具

2.1 Jest

Jest是一个由Facebook开发的JavaScript测试框架,具有简单易用、高度集成、性能优越等特点。

# 安装 Jest
npm install --save-dev jest
// package.json
{
  "scripts": {
    "test": "jest"
  }
}

2.2 Mocha

Mocha是一个灵活的JavaScript测试框架,可以在浏览器和Node.js环境中运行。

# 安装 Mocha
npm install --save-dev mocha
// package.json
{
  "scripts": {
    "test": "mocha"
  }
}

3. 编写和运行测试用例

3.1 Jest 示例

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

module.exports = { add };
// math.test.js
const { add } = require('./math');

test('adds 1 + 2 to equal 3', () => {
  expect(add(1, 2)).toBe(3);
});
# 运行 Jest 测试
npm test

3.2 Mocha 示例

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

module.exports = { add };
// math.test.js
const { add } = require('./math');
const assert = require('assert');

describe('Math', () => {
  it('should return 3 when adding 1 and 2', () => {
    assert.strictEqual(add(1, 2), 3);
  });
});
# 运行 Mocha 测试
npm test

4. 常用的断言库

4.1 Jest 断言

Jest内置了强大的断言库,其中最常用的是expect

// Jest 示例
test('adds 1 + 2 to equal 3', () => {
  expect(add(1, 2)).toBe(3);
  expect(add(1, 2)).toEqual(3);
  expect(add(1, 2)).not.toBeFalsy();
});

4.2 Mocha 断言

Mocha并不内置断言库,通常结合使用Node.js内置的assert库或其他第三方库,如chai

// Mocha 示例(使用 assert)
const assert = require('assert');

describe('Math', () => {
  it('should return 3 when adding 1 and 2', () => {
    assert.strictEqual(add(1, 2), 3);
    assert.notStrictEqual(add(1, 2), 4);
  });
});
// Mocha 示例(使用 chai)
const { expect } = require('chai');

describe('Math', () => {
  it('should return 3 when adding 1 and 2', () => {
    expect(add(1, 2)).to.equal(3);
    expect(add(1, 2)).to.not.equal(4);
  });
});

5. 测试异步代码

5.1 Jest 异步测试

Jest提供了多种处理异步代码的方式,例如使用async/await、`.

then().catch()`等。

// Jest 异步测试示例
test('async test', async () => {
  const result = await asyncFunction();
  expect(result).toBe('resolved value');
});

5.2 Mocha 异步测试

Mocha同样支持异步测试,可以使用done回调、async/await等方式。

// Mocha 异步测试示例
it('async test', (done) => {
  asyncFunction().then((result) => {
    expect(result).to.equal('resolved value');
    done();
  });
});

6. Mocking 和 Spying

6.1 Jest Mocking 和 Spying

Jest提供了强大的Mocking和Spying功能,可以方便地模拟函数的行为。

// Jest Mocking 和 Spying 示例
const mockFn = jest.fn();
mockFn.mockReturnValue(42);
mockFn.mockResolvedValue(42);

test('mocking and spying', () => {
  mockFn(1, 2, 3);
  expect(mockFn).toHaveBeenCalledWith(1, 2, 3);
  expect(mockFn).toHaveBeenCalledTimes(1);
  expect(mockFn()).toBe(42);
});

6.2 Mocha Mocking 和 Spying

在Mocha中,通常结合使用sinon库进行Mocking和Spying。

// Mocha Mocking 和 Spying 示例
const sinon = require('sinon');

const spy = sinon.spy();
const mock = sinon.mock().returns(42);

it('mocking and spying', () => {
  spy(1, 2, 3);
  sinon.assert.calledWith(spy, 1, 2, 3);
  mock();
  sinon.assert.calledOnce(mock);
  sinon.assert.returned(mock(), 42);
});

7. 持续集成与覆盖率检查

7.1 持续集成

集成CI/CD(Continuous Integration/Continuous Deployment)工具,如Travis CI、Jenkins,可以在每次代码提交时运行测试,确保代码的稳定性。

7.2 代码覆盖率检查

代码覆盖率工具,如istanbulnyc,可以帮助开发者评估测试覆盖的程度,确保每个代码路径都得到了测试。

# 安装 nyc
npm install --save-dev nyc
// package.json
{
  "scripts": {
    "test": "nyc mocha"
  }
}

8. 测试最佳实践

8.1 编写独立、可重复的测试

测试应该是独立的,不依赖于其他测试的执行结果。同时,测试应该是可重复的,不论运行多少次,结果都应该保持一致。

8.2 频繁运行测试

在开发过程中,频繁运行测试可以及时发现和修复问题,保持代码的稳定性。

8.3 测试覆盖率不是唯一标准

虽然高测试覆盖率通常是好的,但并不是唯一的标准。有时候,某些复杂的代码路径可能很难覆盖到,这时需要权衡测试的成本和效益。

总结

JavaScript单元测试是确保代码质量和可维护性的关键步骤。通过使用Jest、Mocha等测试框架,结合断言库和Mocking工具,开发者可以编写独立、可重复的测试,捕捉潜在的错误,并确保每个功能单元都按照预期工作。在持续集成和代码覆盖率检查的支持下,可以构建出更加健壮和可维护的代码。在实际应用中,需要根据项目需求和团队实际情况,选择合适的工具和策略,以确保测试的效果最大化。

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

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

相关文章

mac 系统 vmware 安装centos8

选择镜像 安装系统 依次设置有告警的项目 设置用户名密码 设置root密码 重启系统 重启成功进入下面界面 勾选,点击done 点击箭头所指按钮 输入密码登录 安装成功了 设置网络 打开终端 切换root用户 输入下面指令 su root 输入root的密码 安装git

振动温度一体式传感器的工作原理及其在设备状态监测中的作用

振动温度一体式传感器是一种先进的监测设备,可以同时测量和监测目标物体的振动和温度信息。它结合了振动传感技术和温度传感技术,为工业领域提供了全面而高效的设备状态监测解决方案。在振动温度一体式传感器中,有线和无线两种类型分别在设备…

[github全教程]github版本控制最全教学------- 大厂找工作面试必备!

作者:20岁爱吃必胜客(坤制作人),近十年开发经验, 跨域学习者,目前于新西兰奥克兰大学攻读IT硕士学位。荣誉:阿里云博客专家认证、腾讯开发者社区优质创作者,在CTF省赛校赛多次取得好成绩。跨领域…

iOS简单理解区分MVC、MVP、MVVM

MVC、MVP、MVVM 前言 这篇文章简单介绍MVC、MVP和MVVM三种架构,并配上一个简单的Swift demo来区分MVC和MVVM两种架构。 MVC 传统MVC 下图是传统结构MVC,可以看到这种结构是紧耦合的,不推荐使用。 苹果的MVC 如下图,这是苹果…

【翻译】直流电动机的控制

直流电(DC)电机由于其转矩易于控制,速度控制范围广,已广泛应用于可调速驱动或可变转矩控制中。然而,直流电机有一个主要的缺点,即它们需要机械装置,如换向器和刷子来连续旋转。这些机械部件需要…

windows配置go调用python的编译环境

go是支持调用python代码的,之前写了几篇linux的部署教程,因为觉得windows的不复杂就没有写,结果今天新部署一个Windows的环境,有些步骤想不起来了,好记性不如烂笔头,还是记录一下吧。 这些是之前写的linux…

FlowJo软件的简单介绍 掌控流式细胞分析的科技巨匠 FlowJo10

FlowJo 10 for Mac是一款强大的流式细胞数据分析软件,具有以下功能: 数据导入与预处理:FlowJo 10可以轻松导入各种类型的流式细胞数据,并对数据进行预处理,包括去噪、背景校正等,以确保数据的准确性和可靠…

STM32F407-14.3.9-01输出比较模式

输出比较模式 此功能用于控制输出波形,或指示已经过某一时间段。 当捕获/比较寄存器与计数器之间相匹配时,输出比较功能: ● 将为相应的输出引脚分配一个可编程值,该值由输出比较模式(TIMx_CCMRx 寄存器中的 OCxM⑦…

[网鼎杯 2020 青龙组]singal 1

前言 在主函数中找到了一个vm的译码器,译码器主要是解释传入的opcode,然后对我们输入的字符操作,这里我们发现他是单字节比较的,方法很多可以使用单字节映射,也可以是使用符号化执行,当然也可以硬着头皮去…

Docker 环境中 Spring Boot 应用的 Arthas 故障排查与性能优化实战

🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🌺 仓库主页: Gitee 💫 Github 💫 GitCode 💖 欢迎点赞…

EasyExcel两行表头

例子: 代码: StorageService localStorageService storageFactory.getLocalStorageService();String path "";// 文件信息String dateTime DateUtils.formatTimestampToString(new Date());String title "xxx统计";String fil…

TZOJ 1379 C语言合法标识符

答案&#xff1a; #include <stdio.h> #include <string.h> int main() {char arr[60];int n 0, i 0, num 0, flag;scanf("%d", &n);getchar(); //读取回车键while (n--) //循环N次{gets(arr);num strlen(arr); //num为字符串长度flag 1; …

Echarts大屏可视化_05 折线图的定制开发

继续跟着pink老师学习Echarts相关内容&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 折线图1 1.引入 折线图选取示例地址 标题没有用到就给他删了 直接引入 注意这里是line下面的chart 获取dom元素一定不…

java餐饮刀削面快餐店点餐服务系统springboot+jsp

网上点餐省去了客户很多不必要的时间和麻烦&#xff0c;给商家带来更多利益。同时&#xff0c;网上点餐可以辅助餐饮企业营销。传统的点餐是需要配备一个专业的服务员负责菜品介绍并记录顾客点单&#xff0c;确认后上交至后台厨房&#xff0c;厨房根据菜品种类安排做菜顺序最终…

Spring 多数据源搭建

目录 前言 正文 1.Druid 介绍和使用 2.其他多数据源解决方案 总结 前言 对于复杂的业务和项目&#xff0c;可能在一个单体项目中存在需要连接多个数据库的情况。这时&#xff0c;就会使用到多数据源&#xff0c;实际中遇到的可能性比较大。 正文 如果一个项目中需要连…

Unity Image - 镜像

1、为什么要使用镜像 在游戏开发过程中&#xff0c;我们经常会为了节省 美术图片资源大小&#xff0c;美术会将两边相同的图片进行切一半来处理。如下所示一个按钮 需要 400 * 236&#xff0c;然而美术只需要切一张 74*236的大小就可以了。这样一来图集就可以容纳更多的图片。…

Centos7使用阿里云镜像加速服务安装Docker

文章目录 一、前提说明二、安装docker1、创建docker文件夹2、安装所需的软件包3、设置Docker仓库4、安装docker5、启动验证使用阿里云镜像加速服务 三、卸载docker 一、前提说明 需要先安装好虚拟机&#xff0c;可以查看这篇https://blog.csdn.net/qq_36433289/article/detail…

Docker的常用基本命令(基础命令)

文章目录 1. Docker简介2. Docker环境安装Linux安装 3. 配置镜像加速4. Docker镜像常用命令列出镜像列表搜索镜像下载镜像查看镜像版本删除镜像构建镜像推送镜像 5. Docker容器常用命令新建并启动容器列出容器停止容器启动容器进入容器删除容器&#xff08;慎用&#xff09;查看…

Java-easyExcel入门教程

文章目录 前言一、简介二、使用步骤1. 引入依赖2. 前提准备3. 实现导出4. 实现导入 三、我所遇到的问题四、总结 前言 在日常开发中经常会遇到一些 excel 表导入导出的需求&#xff0c;以往会使用 POI 封装成工具类来处理这些导入导出的需求&#xff0c;但是 POI 在导入大文件…

WSL2+tensorflow-gpu 2.3.0 C++ 源码编译

wsl2已有gcc 版本为9.4.0&#xff0c;但tensorflow2.3.0需对应gcc7.3.1 tensorflow与cuda cudnn python bazel gcc版本对应关系 故需下载一个低版本的gcc&#xff0c;但同时还想保留较高版本的gcc&#xff0c;那么参考文章&#xff1a;深度学习环境搭建(二): Ubuntu不同版本g…