如何测试javascript代码_单元测试和集成测试的区别是什么
发布时间 - 2026-01-13 00:00:00 点击率:次JavaScript单元测试与集成测试需协同使用:前者隔离依赖验证单个函数逻辑(如add(2,3)===5),后者验证多模块协作(如按钮点击触发fetch并更新DOM),二者缺一不可且不可混淆。
JavaScript 单元测试和集成测试不是“选一个用”,而是解决不同层次的问题:单元测试验证 add 函数输入 2 和 3 是否返回 5;集成测试验证点击按钮后,fetch 请求是否发出、响应数据是否正确更新了 DOM。两者缺一不可,但混淆它们会导致测试脆弱或漏检。
单元测试:只测单个函数或组件的内部逻辑
单元测试的核心是隔离——用 mocks/stubs 切断外部依赖,只聚焦被测单元的行为是否符合预期。它快、稳定、定位问题直接。
- 典型场景:
calculateTotal(cartItems)是否对空数组返回0?对含税项是否正确累加? - 必须 mock 的东西:
fetch、localStorage、第三方库(如moment)、父组件传入的回调函数 - 常见错误:没 mock
fetch,导致测试实际发请求——网络波动会让 CI 随机失败;或者 mock 了但没校验调用参数(比如没检查fetch是否用了正确的 URL) - 推荐工具组合:
Jest(开箱 mock 能力强) +@testing-library/(测 React 组件时专注用户行为,不依赖实现细节)
react
test('calculates total correctly', () => {
const items = [{ price: 10, qty: 2 }, { price: 5, qty: 1 }];
expect(calculateTotal(items)).toBe(25);
});
集成测试:验证多个模块协作是否正常
集成测试不 mock 大部分依赖,允许真实模块间通信,目标是发现接口不匹配、数据流断裂、副作用遗漏等问题。它比单元测试慢,但更贴近真实运行环境。
- 典型场景:React 中点击“加载用户”按钮 → 触发
getUserById(123)→ 成功后渲染用户名和邮箱 - 关键点:保留真实
fetch(或用msw拦截并返回预设响应),不 mock 父子组件通信,允许状态管理库(如zustand或Redux)参与流程 - 容易踩的坑:把集成测试写成“端到端测试”——比如真打开浏览器、等动画、查元素位置;其实只需在 JSDOM 环境中验证 DOM 更新和事件链即可;过度 mock 又会退化成单元测试
- 推荐方式:用
@testing-library/react的render+userEvent+server.use(配合msw)
test('loads and displays user after button click', async () => {
server.use(
rest.get('/api/users/123', (req, res, ctx) =>
res(ctx.json({ id: 123, name: 'Alice', email: 'a@b.com' }))
)
);
render( );
await userEvent.click(screen.getByText('Load User'));
expect(await screen.findByText('Alice')).toBeInTheDocument();
expect(screen.getByText('a@b.com')).toBeInTheDocument();
});
什么时候该写哪种测试?看改动影响范围
改一行工具函数逻辑?补单元测试;加一个新 API 调用链?先写集成测试;重构组件结构但不改行为?单元测试应全过,集成测试可辅助确认 UI 流程没断。
- 单元测试覆盖率建议重点覆盖:纯函数、状态计算逻辑(如
filterItems(searchTerm, items))、自定义 Hook 内部逻辑 - 集成测试优先覆盖:用户核心路径(登录→列表→详情→提交)、跨模块交互(表单提交触发通知 + 跳转 + 数据缓存)
- 别为“能测”而测:比如给一个只做
console.log的函数写单元测试,意义不大;但若它调用了navigator.geolocation.getCurrentPosition,那就需要集成测试来确认权限提示和坐标处理是否连贯
真正难的是边界判断——比如某个 Hook 同时封装了 fetch 和本地缓存逻辑,它算单元还是集成?答案是:按你最想保护的契约来定。如果重点是“相同输入永远返回相同输出”,就 mock 掉 fetch 和 localStorage 做单元测试;如果重点是“首次加载走网络、重复加载走缓存”,就必须让两者真实协作,用集成测试验证整个生命周期。
# react
# javascript
# java
# js
# json
# 浏览器
# 回调函数
# 工具
# ai
# 邮箱
# 区别
# 表单提交
# red
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
晋江文学城电脑版官网 晋江文学城网页版直接进入
Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率
LinuxShell函数封装方法_脚本复用设计思路【教程】
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
长沙企业网站制作哪家好,长沙水业集团官方网站?
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
Python自动化办公教程_ExcelWordPDF批量处理案例
Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案
Laravel如何与Inertia.js和Vue/React构建现代单页应用
如何在服务器上配置二级域名建站?
如何在景安服务器上快速搭建个人网站?
瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口
深入理解Android中的xmlns:tools属性
焦点电影公司作品,电影焦点结局是什么?
linux top下的 minerd 木马清除方法
Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验
Android仿QQ列表左滑删除操作
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
,南京靠谱的征婚网站?
Laravel怎么实现微信登录_Laravel Socialite第三方登录集成
Laravel如何配置任务调度?(Cron Job示例)
JavaScript中如何操作剪贴板_ClipboardAPI怎么用
JavaScript如何实现音频处理_Web Audio API如何工作?
如何在阿里云完成域名注册与建站?
Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】
WordPress 子目录安装中正确处理脚本路径的完整指南
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询
昵图网官网入口 昵图网素材平台官方入口
Laravel如何实现文件上传和存储?(本地与S3配置)
香港服务器部署网站为何提示未备案?
Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧
百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧
Laravel如何处理表单验证?(Requests代码示例)
Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程
三星网站视频制作教程下载,三星w23网页如何全屏?
php打包exe后无法访问网络共享_共享权限设置方法【教程】
夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化
HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】
如何正确下载安装西数主机建站助手?
UC浏览器如何设置启动页 UC浏览器启动页设置方法
如何快速搭建支持数据库操作的智能建站平台?
桂林网站制作公司有哪些,桂林马拉松怎么报名?
如何安全更换建站之星模板并保留数据?
Python高阶函数应用_函数作为参数说明【指导】
laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法
HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】
Laravel Seeder填充数据教程_Laravel模型工厂Factory使用
WEB开发之注册页面验证码倒计时代码的实现
Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】


react