持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情
跟着然叔学习单元测试第一天
🚩 学习目标
- 了解单元测试与自动化测试的概念
- 掌握jsest的基本用法、断言、mock
- 掌握Vitest完成组件的单元测试
单元测试的必要性
单元测试是白盒测试,是确保代码质量的,而配置项测试和系统测试是黑盒测试,是验证整体软件的功能是否正确。单元测试的作用不可能被配置项测试和系统测试所取代。
单元测试的重要性体现在以下几个方面:
- 进行单元测试可以节约很多时间
如果做好单元测试,去除了代码中潜在的设计错误,那么后续的测试级别(集成测试、配置项测试、系统测试等)就会节约很多时间。反之,如果没有做单元测试或者单元测试做的不好、敷衍了事,那么在进行后续的测试级别时,总会遇到那些本该在单元测试就能发现的问题,而且这些问题往往还是很难发现的。这会使后续的测试周期远超计划,不断延迟。
- 进行单元测试可以提升测试绩效
首先,单元测试是测试阶段的基础。只有做好单元测试,才会使得后续的集成测试、配置项测试、系统测试等更加容易。其次,单元测试是白盒测试,在单元测试过程中能够发现一些深层次的,在系统测试(黑盒测试)当中很难发现的问题。最好,单元测试不仅仅能够验证代码做了些什么,更重要的是了解代码是如何做的,以及是否做了它应该做的事情和没有做它不该做的事情。
- 进行单元测试可以降低测试成本
代码中的一些设计错误,在单元测试的时候很容易发现,纠正成本也比较低;但是,如果这些错误直到后期的系统测试的时候才发现,再要纠正这个问题,所需要的成本就成几何倍数的上升。
- 进行单元测试可以提升产品质量
进行单元测试可以去除代码中的设计错误,提升代码的质量。而如果不进行单元测试,后续的配置项测试、系统测试又很难发现这些错误,那么这些错误就被隐藏在交付的软件中,这样交付软件的质量就难以得到保证。
单元测试的特点
- 必要性:JavaScript缺少类型检查,编译期间无法定位到错误,单元测试可以帮助你测试多种异常情况。
- 正确性:测试可以验证代码的正确性,在上线前做到心里有底。
- 自动化:通过console虽然可以打印出内部信息,但是这是一次性的事情,下次测试还需要从头来过,效率不能得到保证。通过编写测试用例,可以做到一次编写,多次运行。
- 保证重构:互联网行业产品迭代速度很快,迭代后必然存在代码重构的过程,那怎么保证代码的质量呢?有测试用例做后盾,就可以大胆进行重构。
Jest完成一个单元测试
Jest是Facebook开源的一套JavaScript测试框架,它集成了断言、JSDom、覆盖率报告等开发者所需要的所有测试工具。
npm i jest -g
测试加法程序
add.js
const add = (a,b) => a+b
module.exports = add
测试程序
目录结构
- src目录中创建__tests__文件夹
- tests_文件夹下创建与需要测试文件一样名字的xx.spec.js文件
- 书写xx.spec.js
const add = require('../add')
// 测试单元
describe('测试add函数',()=>{
// 1+2
test('add(1,2) === 3',()=>{
// 断言
expect(add(1,2)).toBe(3)
})
// 2+2
test('add(2,2) === 4',()=>{
// 断言
expect(add(2,2)).toBe(4)
})
})
将如下代码添加到 package.json 中:
{
"scripts": {
"test": "jest"
}
}
最后,运行 npm run test ,Jest 将输出如下信息:
PASS src/__tests__/add.spec.js
测试add函数
✓ add(1,2) === 3 (2 ms)
✓ add(2,2) === 4
Test Suites: 1 passed, 1 total
Tests: 2 passed, 2 total
Snapshots: 0 total
Time: 0.321 s, estimated 1 s
在此测试中,使用了
expect和toBe来检测两个值是否完全相同。