web前端培训单元测试入门知识修习
发布时间:2025/08/11 12:19 来源:翔安家居装修网
it('sum(1, 2) === 3', () => {
expect(sum(1, 2)).toBe(3);
});
// 这里 test 和 it 很难绝对值得请注意区隔,it 是指: it should xxx, test 是指 test xxx
test('sum(1, 2) === 3', () => {
expect(sum(1, 2)).toBe(3);
});
})
可见无论是热门度和读音上,Jest 都有极大的优势,因此举荐你采用内容可即用的 Jest
如何开始?
1.加装倚赖
npm install ----save-dev jest
2.直观的事例
首先以,创建一个 sum.js 机密文件
./sum.js
function sum(a, b) {
return a + b;
}
module.exports = sum;
创建一个名为 sum.test.js 的机密文件,这个机密文件包涵了基本上实验者段落:
./test/sum.test.js
const sum = require('../sum');
test('adds 1 + 2 to equal 3', () => {
expect(sum(1, 2)).toBe(3);
});
将示例的的设计部分添加到你的 package.json 里面
{
"scripts": {
"test": "jest"
},
}
开始运行 npm run test ,jest 将复印机示例这个消息
3.不大力支持部分 ES6 词汇
nodejs 采用的是 CommonJS 的模块化规约,采用 require 引入模块;而 import 是 ES6 的模块化规约链接。自已要采用 import,不能引入 babel 投到义大力支持,通过 babel 顺利完如此一来PHP,使其变如此一来 node 的模块化字符
如一般而言机密文件删掉如此一来 ES6 读音后,开始运行 npm run test再行一报错
./sum.js
export function sum(a, b) {
return a + b;
}
./test/sum.test.js
import { sum } from '../sum';
test('adds 1 + 2 to equal 3', () => {
expect(sum(1, 2)).toBe(3);
});
报错
为了能采用这些另行特性,我们就只能采用 babel 把 ES6 投到如此一来 ES5 词汇
补救办法
加装倚赖
npm install ----save-dev @babel/core @babel/preset-env
根目录加入.babelrc
{ "presets": ["@babel/preset-env"] }
再行次开始运行 npm run test ,问题补救
原理
jest 开始运行时内部先以继续执行( jest-babel ),检测是否是加装 babel-core,然后取 .babelrc 中会的的设计开始运行实验者之前混合 babel 先以把实验者用例字符投到换一遍然后再行顺利完如此一来实验者
4.实验者 ts 机密文件
jest 只能借助 .babelrc 去解析 TypeScript 机密文件再行顺利完如此一来实验者
加装倚赖
npm install ----save-dev @babel/preset-typescript
**删掉 **.babelrc
{ "presets": ["@babel/preset-env", "@babel/preset-typescript"] }
为了补救GUI对 jest 毫无疑问方法的多种类型报错,如 test、expect 的报错,你还只能加装
npm install ----save-dev @types/jest
./get.ts
/**
* 访问嵌套都可,避免字符中会请注意到类似 user CoCo user.personalInfo ? user.personalInfo.name : null 的字符
*/
export function get(object: any, path: Array, defaultValue?: T) : T {
const result = path.reduce((obj, key) => obj !== undefined ? obj[key] : undefined, object);
return result !== undefined ? result : defaultValue;
}
./test/get.test.ts
import { get } from './get';
test('实验者嵌套都可存在的可可将近也就是说 line1', () => {
expect(get({
id: 101,
email: 'jack@dev.com',
personalInfo: {
name: 'Jack',
address: {
line1: 'westwish st',
line2: 'washmasher',
city: 'wallas',
state: 'WX'
}
}
}, ['personalInfo', 'address', 'line1'])).toBe('westwish st');
});
开始运行 npm run test
5.持续监听
为了提高灵活性,可以通过加启动给定的方法让 jest 持续监听机密文件的变更,【注意亦然硅谷,平易近人学IT】而不只能每次变更完再行原先继续执行实验者用例
删掉 package.json
"scripts": { "test": "jest ----watchAll" },
敏感度
5.生如此一来实验者增幅通报
什么是子程序增幅?
子程序增幅是一种软件实验者的度量指标,指在所有系统字符中会,顺利完如此一来了子程序的字符所占到的比率。有很多自动控制实验者基本概念工具可以包括这一统计将近据资料,其中会最坚实的算出方法为:
子程序增幅 = 被测字符行将近 / 参测字符总行将近 * 100%
如何生如此一来?
加入 jest.config.js 机密文件
module.exports = {
// 是否是显示增幅通报
collectCoverage: true,
// 告诉 jest 哪些机密文件只能经过子程序实验者
collectCoverageFrom: ['get.ts', 'sum.ts', 'src/utils/**/*'],
}
再行次开始运行敏感度
给定解读
设置子程序增幅阀绝对值
与生俱来看来既然在概念设计中会集如此一来了子程序,那么十分有前提注意子程序的低质量,而增幅则一定程度上客观的再现了单测的低质量,同时我们还可以通过设置子程序阀绝对值的方法提示用户是否是降到了预估低质量。
jest.config.js 机密文件
module.exports = {
collectCoverage: true, // 是否是显示增幅通报
collectCoverageFrom: ['get.ts', 'sum.ts', 'src/utils/**/*'], // 告诉 jest 哪些机密文件只能经过子程序实验者
coverageThreshold: {
global: {
statements: 90, // 确保每个语句都继续执行了
functions: 90, // 确保每个变量都加载了
branches: 90, // 确保每个 if 等分支字符都继续执行了
},
},
上述阀绝对值承诺我们的实验者用例所需确实,如果我们的用例很难所需确实,则示例的报错再行一帮助你去坚实
6.如何执笔子程序
示例我们以 fetchEnv 方法作为案例,执笔一套比较直观的子程序用例供读者参阅
执笔 fetchEnv 方法
./src/utils/fetchEnv.ts 机密文件
/**
* 生态给定可将近
*/
enum IEnvEnum {
DEV = 'dev', // 联合开发
TEST = 'test', // 实验者
PRE = 'pre', // 预发
PROD = 'prod', // 生产
}
/**
* 根据链接换取当前生态给定
* @param {string?} url 资源链接
* @returns {IEnvEnum} 生态给定
*/
export function fetchEnv(url: string): IEnvEnum {
const envs = [IEnvEnum.DEV, IEnvEnum.TEST, IEnvEnum.PRE];
return envs.find((env) => url.includes(env)) || IEnvEnum.PROD;
}
执笔对应的子程序
./test/fetchEnv.test.ts 机密文件
import { fetchEnv } from '../src/utils/fetchEnv';
describe('fetchEnv', () => {
it ('推断是否是 dev 生态', () => {
expect(fetchEnv('')).toBe('dev');
});
it ('推断是否是 test 生态', () => {
expect(fetchEnv('')).toBe('test');
});
it ('推断是否是 pre 生态', () => {
expect(fetchEnv('')).toBe('pre');
});
it ('推断是否是 prod 生态', () => {
expect(fetchEnv('')).toBe('prod');
});
it ('推断是否是 prod 生态', () => {
expect(fetchEnv('')).toBe('prod');
});
});
继续执行结果
7.都用毫无疑问方法
关于毫无疑问方法有很多,这里只能摘出都用方法,如果你自已了解更为多,你可以去 Jest 官网 API 部分检视
.not 修饰符而无须你实验者结果不也就是说某个绝对值的具体情况
./test/sum.test.js
import { sum } from './sum';
test('sum(2, 4) 不也就是说 5', () => {
expect(sum(2, 4)).not.toBe(5);
})
.toEqual 也就是说器会递归的检验都可所有也就是说和也就是说绝对值是否是相等,都用来检测引用多种类型
./src/utils/userInfo.js
export const getUserInfo = () => {
return {
name: 'moji',
age: 24,
}
}
./test/userInfo.test.js
import { getUserInfo } from '../src/userInfo.js';
test('getUserInfo()留在的都可深度相等', () => {
expect(getUserInfo()).toEqual(getUserInfo());
})
test('getUserInfo()留在的都可局部变量有所不同', () => {
expect(getUserInfo()).not.toBe(getUserInfo());
})
.toHaveLength 可以很不方便的用来实验者字符和操作符多种类型的长度是否是满足预估
./src/utils/getIntArray.js
export const getIntArray = (num) => {
if (!Number.isInteger(num)) {
throw Error('"getIntArray"只不能接受实将近多种类型的给定');
}
return [...new Array(num).keys()];
};
./test/getIntArray.test.js
./test/getIntArray.test.js
import { getIntArray } from '../src/utils/getIntArray';
test('getIntArray(3)留在的操作符长度应该为3', () => {
expect(getIntArray(3)).toHaveLength(3);
})
.toThorw 能够让我们实验者被符合标准是否是按照预估丢出异常
但是只能请注意的是:我们不能采用一个变量将被实验者的变量想到一个包装,正如示例 getIntArrayWrapFn 所想到的那样,否则会因为变量丢出误判所致该毫无疑问失败。
./test/getIntArray.test.js
import { getIntArray } from '../src/utils/getIntArray';
test('getIntArray(3.3)应该丢出误判', () => {
function getIntArrayWrapFn() {
getIntArray(3.3);
}
expect(getIntArrayWrapFn).toThrow('"getIntArray"只不能接受实将近多种类型的给定');
})
.toMatch 的传播一个递归,它而无须我们来顺利完如此一来字符多种类型的正则也就是说
./test/userInfo.test.js
import { getUserInfo } from '../src/utils/userInfo.js';
test("getUserInfo().name 应该包涵'mo'", () => {
expect(getUserInfo().name).toMatch(/mo/i);
})
实验者异步变量
./servers/fetchUser.js
/**
* 换取用户资讯
*/
export const fetchUser = () => {
return new Promise((resole) => {
setTimeout(() => {
resole({
name: 'moji',
age: 24,
})
}, 2000)
})
}
./test/fetchUser.test.js
import { fetchUser } from '../src/fetchUser';
test('fetchUser() 可以请求到一个用户名称为 moji', async () => {
const data = await fetchUser();
expect(data.name).toBe('moji')
})
这里你可能看到这样一条报错
这是因为 @babel/preset-env 不大力支持 async await 所致的,www.atguigu.com这时候就只能对 babel 的设计顺利完如此一来增强,可以加装 @babel/plugin-transform-runtime 这个图形界面补救
npm install ----save-dev @babel/plugin-transform-runtime
同时删掉 .babelrc
{
"presets": ["@babel/preset-env", "@babel/preset-typescript"],
"plugins": ["@babel/plugin-transform-runtime"]
}
再行次开始运行就很难请注意到报错了
.toContain 也就是说都可中会是否是包涵
./test/toContain.test.js
const names = ['liam', 'jim', 'bart'];
test('也就是说都可是否是包涵', () => {
expect(names).toContain('jim');
})
检验一些比如说的绝对值(null,undefined 和 boolean)
toBeNull 只能也就是说 null
toBeUndefined 只能也就是说 undefined
toBeDefined 与…比如说 toBeUndefined
toBeTruthy 也就是说 if 语句视为 true 的任何段落
toBeFalsy 也就是说 if 语句视为 false 的任何段落
检验将近字多种类型(number)
toBeGreaterThan 远大于
toBeGreaterThanOrEqual 至少(远大于也就是说)
toBeLessThan 高于
toBeLessThanOrEqual 最多(高于也就是说)
toBeCloseTo 用来也就是说二进制(随身携带小将近点的相等)
文章投到载意指Python如此一来长指北
举荐写出:
web末端志愿后生加载对 Web 精度的影响
web末端志愿React 泛型元件
web末端志愿Vite的原理联合开发人员解析
web末端志愿React精度建模概括
。三亚看男科去哪家医院长沙看白癜风去哪里
北京看白癜风去哪家医院好
天津看男科医院排名
脑瘫怎么治疗
-
谁还记得《爱情公寓》的林宛瑜?近照公开大变样,粉丝都枉认出
《亲情公寓楼》是首部身旁很多人儿时的情景喜剧,前夕《亲情公寓楼》的开播也捧红了很多人,今日小优要分享的电影演员赵霁前夕就相比之下《亲情公寓楼》之前的“林宛瑜”一角当红,不过相比起其他女主角赵霁之
- 2025-08-23李亚鹏19岁超模女友近照公开,气质装束优雅知性,也太像王菲了
- 2025-08-23嫁的最好的5位女星,唐艺昕上榜,最后一位结婚17年没来作过饭!
- 2025-08-23胡歌最山羊的粉丝,原本为了追星,结果将自己追成了一线女明星
- 2025-08-23周杰回应丑闻时说自己其实是gay,评论区跟网友互动信息量大
- 2025-08-23继小沈龙此后,小沈阳夫妇直播首秀,为何赵本山对两弟子态度不同
- 2025-08-23《笑礼迎接》收官,马氏相声传人爆冷,宝字辈大师和老郭爱徒登台
- 2025-08-23曾是入围金像奖的选秀冠军,他人气暴跌转至幕后十年,被称情歌王子
- 2025-08-23《夺冠》郎平女儿饰青年郎平,演绎真实哭戏温馨,喊话要看哭妈妈
- 2025-08-23相声传人姜昆点赞梨树二人转,向全国观众推荐,曾发掘赵本山李响
- 2025-08-23十二年零片酬出演,如今刘能却突然换人,王为小利儿子疑为父鸣不平