快速导航×

测试驱动开发实践_Jest单元测试编写指南2025-12-04 20:35:25
测试驱动开发遵循红-绿-重构循环:先写失败测试(红),再实现代码通过测试(绿),最后优化代码结构。使用Jest可高效编写单元测试,支持断言、异步测试、模拟和覆盖率分析,提升代码质量与可维护性。

测试驱动开发实践_jest单元测试编写指南

测试驱动开发(TDD)是一种以测试为先导的软件开发方式。在编写实际功能代码之前,先编写单元测试用例,再通过实现代码让测试通过。Jest 是一个由 Facebook 开发的 J*aScript 测试框架,因其简单易用、功能强大,广泛应用于 React 项目和 Node.js 服务中。本文将介绍如何在 TDD 实践中使用 Jest 编写高质量的单元测试。

理解 TDD 的基本流程

TDD 遵循“红-绿-重构”的循环模式:

  • 红(Red):先编写一个失败的测试用例,验证期望行为尚未实现
  • 绿(Green):编写最简代码使测试通过
  • 重构(Refactor):优化代码结构,同时确保测试仍然通过

这种流程有助于保持代码简洁、可维护,并确保每一部分都有对应的测试覆盖。

配置 Jest 环境

在项目根目录初始化 npm 并安装 Jest:

npm init -y
npm install --s*e-dev jest

package.json 中配置测试命令:

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

如果测试文件使用 ES6 模块语法(import/export),需配置 Babel 或使用 Node.js 原生支持,或改用 .cjs 扩展名。对于大多数现代项目,推荐结合 babel-jest 使用。

编写第一个单元测试

假设我们要实现一个简单的加法函数 sum(a, b)。按照 TDD 步骤,先写测试:

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

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

运行 npm test,测试会失败(红阶段)。接着创建 sum.js 文件并实现函数:

// sum.js
const sum = (a, b) => a + b;
module.exports = sum;

再次运行测试,应显示通过(绿阶段)。此时可以进入重构环节,比如增强参数校验,同时保证测试仍通过。

使用 Jest 的核心断言与匹配器

Jest 提供丰富的 expect 匹配器来验证各种结果:

  • toBe(value):严格相等(===)
  • toEqual(value):深度比较对象或数组
  • toBeDefined():检查值不为 undefined
  • toBeTruthy() / toBeFalsy():检查真假值
  • toContain(item):检查数组或字符串是否包含某项
  • toThrow():验证函数是否抛出异常

例如:

MediPro乡镇政府门户网站系统 5.1.0 UTF-8简体中文版 MediPro乡镇政府门户网站系统 5.1.0 UTF-8简体中文版

MediPro乡镇政府门户网站系统,适合乡镇政府机构创建地方门户网站,用以宣传本地资源,实现政务公开,促进乡镇基层信息化建设。本系统基于PHP+MYSQL开发,预设了乡镇风采、党政机构、政务公开、投资指南、服务导航、文件下载、公众互动、领导信箱等乡镇政府门户网站常用的栏目和测试数据,采用适合乡镇政府门户网站的专用模版,增强了系统的针对性和易用性。除了文章系统、图文系统、下载系统、社区交流、反馈表单

MediPro乡镇政府门户网站系统 5.1.0 UTF-8简体中文版 0 查看详情 MediPro乡镇政府门户网站系统 5.1.0 UTF-8简体中文版 test('object assignment', () => {
const data = { one: 1 };
data.two = 2;
expect(data).toEqual({ one: 1, two: 2 });
});

test('throws on invalid input', () => {
expect(() => sum('a', 'b')).toThrow();
});

测试异步代码

Jest 支持 Promise 和 async/await 的测试。例如有一个异步获取用户信息的函数:

// fetchUser.js
const fetchUser = () =>
Promise.resolve({ id: 1, name: 'John' });
module.exports = fetchUser;

对应的测试写法:

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

test('should resolve user data', async () => {
const user = await fetchUser();
expect(user).toEqual({ id: 1, name: 'John' });
});

也可以使用 resolves 匹配器:

return expect(fetchUser()).resolves.toEqual({ id: 1, name: 'John' });

模拟(Mocking)函数与模块

在测试中,常需要隔离外部依赖,如 API 调用、数据库操作等。Jest 提供强大的 mocking 功能。

例如,有一个函数依赖于另一个函数 getPrice()

// checkout.js
const getPrice = require('./priceUtils');

const total = (count) => getPrice() * count;
module.exports = total;

测试时可模拟 getPrice 的返回值:

// checkout.test.js
const total = require('./checkout');
const getPrice = require('./priceUtils');

jest.mock('./priceUtils'); // 自动创建 mock

test('calculates total with mocked price', () => {
getPrice.mockReturnValue(10);
expect(total(5)).toBe(50);
});

覆盖率报告

Jest 可生成测试覆盖率报告。添加配置:

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

运行后会在项目中生成 coverage 目录,打开 index.html 可查看每行代码的覆盖情况。建议设置最低阈值以保证质量:

// jest.config.js
module.exports = {
collectCoverageFrom: ['src/**/*.{js,jsx}'],
coverageThreshold: {
global: {
branches: 80,
functions: 80,
lines: 80,
statements: 80
}
}
};

基本上就这些。掌握 Jest 的基本用法并坚持 TDD 流程,能显著提升代码质量和开发效率。关键是养成“先写测试”的习惯,逐步构建稳健的应用程序。不复杂但容易忽略。

以上就是测试驱动开发实践_Jest单元测试编写指南的详细内容,更多请关注其它相关文章!


# 先写  # 上海seo服务有哪些  # 高端社群如何做营销推广  # 杭州小红书推广营销第三方公司  # 南宁老牌网站建设公司  # 抖音的seo运营  # 安吉租房网站建设需要  # 蚌埠专业的网站建设团队  # seo m  # 推广营销单机游戏  # 比亚迪广告推广营销费用  # 都有  # 是一个  # 有一个  # 政务公开  # 如何在  # react  # 简体中文版  # 重构  # 单元测试  # 门户网站  # face  # npm  # node  # json  # node.js  # js  # html  # java  # es6  # javascript 


相关栏目: 【 企业资讯168 】 【 行业动态20933 】 【 网络营销52431 】 【 网络学院91036 】 【 运营推广7012 】 【 科技资讯60970


相关推荐: python3时间如何用calendar输出?  c++如何使用std::memory_order控制原子操作顺序_c++ C++11内存模型详解  Win10系统怎么查看已安装更新_Win10卸载有问题的更新补丁  Centos/Linux 系统下安装 composer 的完整步骤  怎样更改Windows系统的默认安装路径_避免C盘爆满的终极设置【技巧】  qq游戏手机版下载安装_qq游戏移动端入口  我的世界mc.js免费游戏直接能玩 我的世界mc.js小游戏免费秒玩入口  Yandex浏览器官网在线版入口 Yandex浏览器网页版最新官网  在Qt QML中通过Python字典动态更新TextEdit内容的教程  J*aScript中高效管理与清空动态列表:避免循环陷阱  神经网络二分类模型训练异常:高损失与完美验证准确率的排查与修正  黑猫投诉统一入口官网 消费者权益保护投诉平台  c++中的std::launder有什么实际用途_c++对象生命周期与指针优化  c++如何实现一个简单的软件渲染器_c++从零开始的3D图形学  蛙漫移动版在线看 蛙漫手机浏览器直达入口  Golang如何优化CPU绑定任务分配策略_Golang CPU任务分配优化实践  Python Socket多播通信中指定源IP地址的实践指南  Golang如何安装Swagger工具_GoSwagger文档生成环境  Python中高效且防溢出的双曲正弦计算:基于对数空间的优化策略  不同用户不同价格! 索尼开启账户个性化定价测试  Yandex免登录官网入口_俄罗斯Yandex搜索引擎直达链接  韩小圈电脑版在线入口_网页版免费登录地址  如何在J*a中使用Locale处理多语言环境  VS Code初学者必知的10个基本操作  win11 arm版怎么安装 M1/M2 Mac虚拟机安装ARM win11的方法  抖音隐秘迷城小游戏入口_ 抖音冒险解谜小游戏秒玩  网页是怎么运行的HTML是什么_释网页运行与HTML概念【解析】  PrimeNG Sidebar背景色自定义指南:CSS覆盖与主题化实践  京东单号查询入口_京东快递订单追踪入口  Tabulator表格日期时间排序问题及自定义解决方案  php源码怎么看淘宝客系统_看php源码淘宝客系统技巧  c++如何使用折叠表达式(Fold Expressions)_c++17可变参数模板新技巧  精准捕获:如何在页面中监听除特定元素外的所有点击事件  天猫2025双十一0点秒杀攻略 天猫爆款抢购时间  Safari怎么安装扩展程序 浏览器插件安装与管理方法【详解】  Safari浏览器输入栏卡顿如何解决 Safari搜索建议与缓存清理  机器学习中对数变换预测结果的反向还原  Win10如何开启蓝牙功能_Windows10找不到蓝牙开关解决方法  漫蛙漫画官方主页入口 漫蛙MANWA网页直达访问链接  Win10怎么制作U盘启动盘 Win10系统安装U盘制作教程【详解】  Composer中的^和~符号代表什么_精通Composer版本号语义化约束  Win11 USB传输速度慢怎么解决 Win11 USB驱动更新与设置  小米14应用无法联网原因分析_小米14网络权限修复  天眼查企业查询官网入口 天眼查官方网页版查询  在J*a中如何实现简单的用户输入_J*aScanner类使用方法分享  zookeeper 都有哪些功能?  c++如何解决菱形继承问题_c++虚继承与虚基类详解  QQ邮箱官方网站登录入口_QQ邮箱网页版在线使用  抖音极速版最新版本 抖音极速版官方下载地址  4399体育竞技小游戏_4399小游戏赛事入口