javascript测试如何做_怎样编写单元测试和集成测试?

发布时间 - 2025-12-26 00:00:00    点击率:
JavaScript测试需分层:单元测试隔离验证函数/类输入输出,用Jest或Vitest;集成测试验证模块协作,用@testing-library/react模拟用户行为;测试应聚焦业务逻辑、精准断言、避免实现细节,并持续维护。

JavaScript 测试的核心是分层验证:单元测试聚焦单个函数或类的行为,集成测试检查多个模块协作是否符合预期。关键不是“写不写”,而是“测什么”和“怎么断言”。

单元测试:从最小可测单元开始

单元测试的目标是隔离被测代码,用可控输入验证输出或副作用。推荐使用 Jest(开箱即用)或 Vitest(轻量、Vite 生态友好)。

  • 每个测试文件对应一个源文件(如 utils.jsutils.test.js),命名清晰
  • describe 分组逻辑相关测试,用 it/test 描述具体行为(建议用“should”句式,如 “should return true when input is positive number”
  • 避免测试实现细节(比如内部变量名、私有方法),只测公开接口的输入/输出、异常、边界情况
  • 对有副作用的函数(如调用 API、修改 DOM、发事件),用 mock 替换依赖。例如:fetch 可 mock 成返回固定 Promise;React 组件中调用的 hook 可用 jest.mock 或自定义 render + act 模拟

集成测试:验证模块组合是否协同工作

集成测试不追求完全隔离,而是把几个紧密耦合的单元(如一个 React 组件 + 它使用的自定义 Hook + 对应的 API Service)一起运行,看整体流程是否通。

  • 常见场景:组件渲染后用户点击、输入、等待异步加载完成,再断言 UI 状态变化(如按钮变灰、列表出现数据、错误提示显示)
  • 工具上,Jest + @testing-library/react 是主流组合。它鼓励“像用户一样测试”:查文本、找按钮、触发事件,而不是访问组件实例或 state
  • 真实 API 调用在集成测试中通常仍需 mock(用 jest.mock 或 MSW 拦截请求),但 mock 的粒度比单元测试粗——比如 mock 整个 service 模块,而非单个 fetch 调用
  • 注意异步等待:用 await waitFor 等待状态更新或 DOM 变化,不用 setTimeout 或盲目 await new Promise(resolve => setTimeout(resolve, 100))

测试结构要简洁,断言要精准

一个测试用例最好只验证一个关注点。避免在一个 it 块里塞多个 expect,尤其不要混合不同行为(比如既测成功又测失败)。

  • 输入 → 动作 → 断言,三步清晰。例如:render 组件 → fireEvent.click 按钮 → expect(screen.getByText("Loading...")) 存在
  • 断言优先选语义化查询:screen.getByRole、getByText、getByLabelText,比 getByTestId 更健壮(不依赖开发添加的 test-id)
  • 对错误边界,用 expect(() => fn()).toThrow()await expect(fetchData()).rejects.toThrow() 明确捕获异常

让测试可持续的关键习惯

测试不是一次性的文档,而是活的保障。维护成本低的测试才有长期价值。

  • 每次修复 bug,先补一个复现该 bug 的测试用例,再改代码——防止回归
  • 重构前确保已有测试覆盖,重构后测试全绿,才说明行为未变
  • 定期删掉过时、重复、无法描述业务意图的测试(比如只测 console.log 输出)
  • CI 中强制跑测试,且设置覆盖率阈值(如行覆盖率 ≥80%),但不过度追求 100%,重点在核心路径和分支逻辑


# react  # javascript  # java  # js  # vite  # 工具  # ai  # 异步加载  # 组件渲染 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: html5如何实现懒加载图片_ intersectionobserver api用法【教程】  网站建设整体流程解析,建站其实很容易!  Laravel路由怎么定义_Laravel核心路由系统完全入门指南  Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录  UC浏览器如何设置启动页 UC浏览器启动页设置方法  Laravel如何使用Passport实现OAuth2?(完整配置步骤)  浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】  Internet Explorer官网直接进入 IE浏览器在线体验版网址  Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区  高端企业智能建站程序:SEO优化与响应式模板定制开发  HTML 中动态设置元素 name 属性的正确语法详解  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框  Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】  青岛网站建设如何选择本地服务器?  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  网站建设要注意的标准 促进网站用户好感度!  网站制作免费,什么网站能看正片电影?  如何在宝塔面板中修改默认建站目录?  Bootstrap整体框架之JavaScript插件架构  Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  如何在阿里云服务器自主搭建网站?  MySQL查询结果复制到新表的方法(更新、插入)  Python数据仓库与ETL构建实战_Airflow调度流程详解  Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转  Python正则表达式进阶教程_复杂匹配与分组替换解析  javascript如何操作浏览器历史记录_怎样实现无刷新导航  悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音  如何用已有域名快速搭建网站?  Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程  DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解  Python高阶函数应用_函数作为参数说明【指导】  如何快速完成中国万网建站详细流程?  昵图网官网入口 昵图网素材平台官方入口  图册素材网站设计制作软件,图册的导出方式有几种?  如何在云主机快速搭建网站站点?  如何在局域网内绑定自建网站域名?  如何用好域名打造高点击率的自主建站?  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  微信小程序制作网站有哪些,微信小程序需要做网站吗?  悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】  Laravel怎么使用artisan命令缓存配置和视图  Laravel如何操作JSON类型的数据库字段?(Eloquent示例)  PythonWeb开发入门教程_Flask快速构建Web应用  Laravel怎么实现验证码(Captcha)功能  在Oracle关闭情况下如何修改spfile的参数  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案