前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Unit Testing

Unit Testing

作者头像
离殊
发布于 2022-04-01 08:07:41
发布于 2022-04-01 08:07:41
1.3K00
代码可运行
举报
文章被收录于专栏:DingLin 随笔DingLin 随笔
运行总次数:0
代码可运行

前言

Jest 是 Facebook 推出的一种 Unit Testing 工具,当然还有很多其他类似的单元测试库,比如 mocha ava 等等

写的好的单元测试可以帮助你提升开发效率以及代码质量,并对项目的维护有莫大的帮助,例如重构。

#应该测试你的程序

其实每一个项目都应该使用单元测试,单元测试可以很好的保证你的代码不会欺骗你

世界上没有任何一个完美的程序,也更不会有完美的人可以写出没有任何问题的代码。

#配置单元测试

#安装 Jest

我们使用 yarn 来安装 Jest

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
yarn add -D jest

package.json 文件中加入测试命令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "scripts": {
    "test": "jest"
  }
}

之后只需要在 Command Line 中输入 yarn test 即可开启测试

#配置时遇到的麻烦

在我配置 Jest 时遇到了几个麻烦,让我的测试代码运行不起来,总结一下这几个小问题。

  1. 运行 Jest 测试代码时出现 Cannot use import statement outside a module

不能在其他模块使用 import 语句

出现这个问题的主要原因在于 Webpack 编译时并未转换 Jest,导致测试代码不识别 ES6 语法,需要配置一下 Jest 的 transform 字段

JS 代码,需要安装 babel-jest 包来转换代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
transform: {
  "^.+\\.js?(x)?$": "babel-jest"
}

TS 代码,需要额外安装一个 ts-jest 包来解析

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
transform: {
  "^.+\\.(ts|tsx|js)$": "ts-jest"
}
  1. 在项目中配置了别名。但是 Jest 并不认识别名

这个问题大概都会遇到吧,几乎在项目中都会有 Webpack 来做别名处理,解决那种点点引用方式,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 点点表示法
import SomeComponent from '../../../../components/SomeComponent'

// 别名表示法
// @ 代表 src/ 目录
import SomeComponent from '@/components/SomeComponent'

jest.config.js 文件中配置 moduleNameMapper 字段即可

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  moduleNameMapper: {
    '@/(.*)$': '<rootDir>/src/$1'
  }
}

用来匹配 @/ 都指向到 根目录/src/前文中(.*)`匹配的分组

  1. 未忽略 node_modules 文件夹下的代码

一般来说这个是默认的,Jest 默认会忽略 node_modules 文件夹下的文件和代码

  1. 无法识别 css scss 等样式文件

在我们组件当中大部分都会有 css 或者 scss 等文件,但是 Jest 并无法处理这类文件,此时需要将此类样式文件都 Mock

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  moduleNameMapper: {
    '\\.(css|scss)$': '<rootDir>/__mocks__/styleMock.js'
  }
}

<rootDir>/__mocks__/styleMock.js 文件代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
module.exports = {}
  1. 如果要使用 Enzyme 辅助库的话,需要额外配置一下

配置 setupFiles 字段,该字段的含义是在初始化运行单元测试时,需要执行的文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  setupFiles: ['<rootDir>/__mocks__/enzymeMock.js']
}

<rootDir>/__mocks__/enzymeMock.js 文件代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import Enzyme from 'enzyme'
import Adapter from 'enzyme-adapter-react-16'

Enzyme.configure({ adapter: new Adapter() })

其他配置可以参考官网的配置文档来进行进一步的配置

#如何做好单元测试

#一个好的单元测试应该遵循下面三个步骤

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// production code
const computeSumFromObject = (a, b) => {
  return a.value + b.value
}

// testing code
it('should return 5 when adding object a with value 2 and b with value 3', () => {
  // given - 准备数据
  const a = { value: 2 }
  const b = { value: 3 }

  // when - 调用被测函数
  const result = computeSumFromObject(a, b)

  // then - 断言结果
  expect(result).toBe(5)
})

Given -> When -> Then

准备输入数据、调用被测函数、断言输出结果。

#一个好的测试可以为我们带来什么

  • 安全重构已有代码 -> 当你在重构当前代码时,完全不必担心会损坏其功能
  • 保存业务原有逻辑 -> 只要 PM 没有改动需求,这个需求就应该是这样的,如果测试代码出了问题,那么一定是你出了问题
  • 快速回归 -> 当我们在开发业务的时候,例如在原有功能上添加新的功能,那么新开发的功能不会影响之前业务的逻辑,如果测试代码出了问题,那么一定是你的问题

#测试覆盖率

在真实的项目开发当中,我们其实并不会对项目中所有的代码进行测试。本来单元测试带来的收益是你在走独木桥时,他将是你的安全带。但是如果你将所有的代码都写了单元测试,那么我觉得你是把全身的安全带都绑上了,只露了一只眼睛,你的开发工作将举步难行,下面来说说单元测试应该覆盖哪些,不应该覆盖哪些

组件类型/测试内容

分支渲染逻辑

事件调用

纯 UI

展示型组件

容器型组件

通用 UI 组件

功能型组件

总结一句话就是,所有的功能型代码,都需要进行单元测试,但是像 UI 以及 css 等样式代码,就不要进行不必要的测试了,意义其实并不大,除非你要写像 Ant Design 这类的 UI 库,在日常的业务场景下是完全没有必要。

在表格中 ✅ 的,建议是在 100% 的覆盖率

#参考

  1. Jest
  2. React 测试技巧
  3. React 单元测试策略及落地
  4. 单元测试-维基百科
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-04-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
React单元测试:Jest + Enzyme(一)
前端的单元测试在很多人看来都是一个可有可无的东西,理由一般有下面几条(以下内容统一称单元测试为单测):
Dickensl
2022/06/14
1.5K0
React单元测试:Jest + Enzyme(一)
干货 | 携程租车React Native单元测试实践
琨玮,携程高级前端开发工程师,从事React Native/Web前端的开发及维护工作,喜欢研究新技术。
携程技术
2020/02/18
6.2K0
干货 | 携程租车React Native单元测试实践
2022年3月最新Eslint + Prettier + Husky + Stylelint + Jest + CI/CD 超详细前端单元测试&amp;规范工程化工作流
由于我的示例项目使用Next.js框架构建,需要在extends中额外配置"next"。 同时个人建议配置react-hooks插件
源心锁
2022/08/12
1.9K0
2022年3月最新Eslint + Prettier + Husky + Stylelint + Jest + CI/CD 超详细前端单元测试&amp;规范工程化工作流
Vue-Test-Utils + Jest 单元测试入门与实践
vs code打开项目你会发现根目录下有一目录test/unit,里面就有一个已经生成的测试用例。
用户6094182
2020/03/20
2.6K0
你不知道的 Vue 单元测试(6000字实战单元测试)
Vue-Test-Utils 是 Vue.js 官方的单元测试实用工具库,它提供了一系列的 API 来使得我们可以很便捷的去写 Vue 应用中的单元测试。
一只图雀
2020/10/26
11.6K0
你不知道的 Vue 单元测试(6000字实战单元测试)
手摸手教你封装跨项目复用的 Vue 组件库
在前端项目的开发中,往往会根据业务需求,沉淀出一些项目内的UI组件/功能模块(以下通称组件) 等;这些组件初期只在同一个项目中被维护,并被该项目中的不同页面或模块复用,此时的组件逐步被完善,是一个只聚焦于功能和健壮性的成长期。
江米小枣
2020/06/15
2.8K0
年轻时,我不写单元测试
当我们被提出这些bug的时候,我们是二脸懵逼的,因为这不符合一个程序员的预期!!! 那么我们如何能够避免以上的问题,从而将经历投入到更多的开发(写bug)中去呢? 笔者在这里试着归纳了一下解决问题的办法
2014v
2019/11/20
8880
那些年错过的React组件单元测试(上)
关于前端单元测试,其实两年前我就已经关注了,但那时候只是简单的知道断言,想着也不是太难的东西,项目中也没有用到,然后就想当然的认为自己就会了。
前端森林
2021/04/12
5K0
React单元测试:Jest + Enzyme(二)
在上一篇教程中,我们成功搭建了基于Jest和Enzyme的单元测试框架并成功地跑起来第一个单元测试,可以点击这里回顾一下。今天,我们重点讨论如何通过Jest来mock数据。
Dickensl
2022/06/14
1.5K0
React单元测试:Jest + Enzyme(二)
Jest:给你的 React 项目加上单元测试
Jest 是一款轻量的 JavaScript 测试框架,它的卖点是简单好用,由 facebook 出品。本文就简单讲讲如何使用 Jest 对 React 组件进行测试。
前端西瓜哥
2022/12/21
2.9K0
Jest:给你的 React 项目加上单元测试
使用Jest测试原生TypeScript项目
问题:我怎么才能收到你们公众号平台的推送文章呢? 最近写了一个wechat-colorpicker小项目。 主要是为了练习下TS。既然写了一个小库,我就想着顺便学下如何写测试吧,这是一件蛮有意思的事情。 从选型到搭建环境,前前后后用了近2个小时。不得不说一个合格的前端必然是一个合格的配置工程师。再次列举下,这个项目中所需要搭建配置的工具。 webpack.config 自动编译ts+css tsconfig.config ts的配置文件 tslint.json tslint的配置文件 jest.config
企鹅号小编
2018/02/09
2.9K0
使用Jest测试原生TypeScript项目
前端接入单元测试(Node+React)
假如要重构一个老前端框架,并根据其开发一个向后兼容的新框架。此时老框架针对其内部API函数,写了充分的单侧用例。在开发新框架时,直接运行老前端框架的单侧用例,如果所有测试用例都通过,则可快速保证内部api的一致性,快速验证所有功能。
kiki.
2022/09/29
3.4K0
前端接入单元测试(Node+React)
Jest 单元测试快速上手指南
执行 yarn jest 或者 yarn jest test/plus.spec.js 运行测试用例
木子星兮
2020/08/25
3.4K0
Jest 单元测试快速上手指南
前端单元测试那些事
Jest 是 Facebook 开源的一款 JS 单元测试框架,它也是 React 目前使用的单元测试框架,目前vue官方也把它当作为单元测试框架官方推荐 。 目前除了 Facebook 外,Twitter、Airbnb 也在使用 Jest。Jest 除了基本的断言和 Mock 功能外,还有快照测试、实时监控模式、覆盖度报告等实用功能。 同时 Jest 几乎不需要做任何配置便可使用。
树酱
2020/07/03
4.5K0
前端单元测试那些事
JavaScript测试教程–part 4:模拟 API 调用和模拟 React 组件交互[每日前端夜话0xEA]
今天,我们进一步测试 React 组件。它涉及模拟组件交互和模拟 API 调用。你将学到两种方法,开始吧!
疯狂的技术宅
2019/11/25
3.8K0
JavaScript测试教程–part 4:模拟 API 调用和模拟 React 组件交互[每日前端夜话0xEA]
vue单元测试-Jest
顾翔老师开发的bugreport2script开源了,希望大家多提建议。文件在https://github.com/xianggu625/bug2testscript,
顾翔
2019/12/12
1.1K0
vue单元测试-Jest
【干货分享】微信小程序单元测试攻略
导语 本文作者是腾讯社交增值产品部高级前端工程师林毅雄,对前端开发领域颇有研究。接下来,本文将从测试框架、实战、覆盖率、踩坑等方面分享一下微信小程序的单元测试经验,希望能帮到大家。 01 写作初衷 大家先看看A公司与B公司的数据对比: 从上图可以看出,B公司的单元测试做的比较好,每百行error数也比A公司的项目低。 总体来说,单元测试有以下一些好处: 1,及早发现代码错误,提高代码质量和可维护性。 2,代码变更时可以快速进行检查。 然而要做好测试也有一定的困难: 1,花费时间长。 2,被测代码
WeTest质量开放平台团队
2021/12/17
2.9K0
对 React 组件进行单元测试
前端开发的一个特点是更多的会涉及用户界面,当开发规模达到一定程度时,几乎注定了其复杂度会成倍的增长。
江米小枣
2020/06/16
4.3K0
Migrate From Vue-cli to Vite
[译] 原文地址:https://medium.com/nerd-for-tech/from-vue-cli-to-vitejs-648d2f5e031d
皮小蛋
2021/05/08
5.2K1
Migrate From Vue-cli to Vite
前端单元测试那些事
Jest 是 Facebook 开源的一款 JS 单元测试框架,它也是 React 目前使用的单元测试框架,目前vue官方也把它当作为单元测试框架官方推荐 。 目前除了 Facebook 外,Twitter、Airbnb 也在使用 Jest。Jest 除了基本的断言和 Mock 功能外,还有快照测试、实时监控模式、覆盖度报告等实用功能。 同时 Jest 几乎不需要做任何配置便可使用。
树酱
2020/10/15
1.6K0
相关推荐
React单元测试:Jest + Enzyme(一)
更多 >
LV.0
高德
作者相关精选
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文