新闻中心

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

2025-12-04
浏览次数:
返回列表
测试驱动开发遵循红-绿-重构循环:先写失败测试(红),再实现代码通过测试(绿),最后优化代码结构。使用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单元测试编写指南的详细内容,更多请关注其它相关文章!


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


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: sublime如何配置Python开发环境_将sublime打造成轻量级Python IDE  如何在 Windows 11 中启动游戏手柄设置  2025AO3夸克浏览器通道_AO3手机HTTPS安全入口分享  妖精漫画网页版登录入口免费_妖精漫画官网主页直接阅读漫画  4399免费游戏网址入口 4399小游戏免费入口点开即玩  php源码怎么看淘宝客系统_看php源码淘宝客系统技巧  Go语言JSON解析深度指南:动态访问与结构体映射实践  J*aScript教程:根据元素文本内容动态设置背景色  护手霜蹭到袖口上了如何清洗? 怎样避免留下一圈油印?  Adobe PDF表单中利用J*aScript解析与格式化日期组件的教程  mc.js游戏直达 mc.js网页免下载版本秒进地址  EMS快递官网app_中国邮政速递物流手机客户端  192.168.1.1管理中心入口 192.168.1.1路由器网页设置平台  2025年云电脑操作系统体验 | 无需本地硬件,随时随地使用高性能PC  百度浏览器字体显示异常偏小_百度浏览器字体渲染修复方案  外媒分析《GTA6》定价:卖100美元可以但真没必要!  QQ邮箱官网登录入口 QQ邮箱网页版邮箱快速登录  qq游戏跨平台入口_qq游戏多设备同步登录  QQ邮箱网页版登录入口 QQ邮箱官方在线使用平台  在Typer应用中优雅地处理和重组任意命令行参数  Yandex官网搜索引擎免登录_俄罗斯Yandex一键直达入口  TikTok网页版直接登录 TikTok网页端官方平台入口  现代化 SciPy 一维插值:interp1d 的替代方案与最佳实践  Win11 BitLocker密码忘了怎么办 Win11找回BitLocker恢复密钥方法【解决】  电脑IP地址怎么查 查看本机IP地址的几种方法  Eclipse怎么运行工程_Eclipse工程运行配置说明  邮编格式怎么匹配地址_根据邮编格式快速匹配详细地址的技巧  如何为你的Composer包编写自动化测试_集成PHPUnit到Composer的scripts工作流  ACG动漫视频网入口 ACG动漫*免费正版观看地址  初次安装JDK时环境变量如何正确配置_J*A_HOME与PATH设置规则讲解  Golang如何使用bytes.Split分割字节切片_Golang bytes切片分割方法  PHP表单数据传递:如何通过隐藏输入字段获取动态ID  Golang并发任务中错误如何聚合_Golang goroutine error收集方式  CSS如何设置hover状态颜色_hover伪类调整背景或文字颜色  c++如何实现一个简单的ECS框架_c++数据驱动设计与游戏开发  字由网在线版登录地址 字由网网页版安全入口  照顾宝贝2小游戏点击立即在线玩  俄罗斯Yandex免登录入口_Yandex搜索引擎官网一键直达  理解J*aScript Promise的微任务队列与执行顺序  批改网学生版PC登录 批改网官网登录系统入口  汽水音乐在线解析 汽水音乐在线解析入口  微博网页版首页入口 微博电脑端官网登录链接  优化 Python 函数中的条件逻辑:解决 if-else 嵌套与参数选择问题  必由学官方登录入口 必由学教师学生账号快速访问  PySpark中高效提取字符串右侧可变长度数字:使用regexp_extract  印象笔记如何设离线包出差查阅_印象笔记设离线包出差查阅【离线阅读】  Go调试环境为何无法启动_Go调试器启动失败原因与解决策略  解决Django多数据库/多Schema环境下外键迁移问题  内存疯狂猛猛涨价:主板销量直接腰斩!  一加 Nord 5 隐私权限异常_一加 Nord 5 系统安全优化 

搜索