单元测试实战解析,写单元测试不再遥不可及!
2023-12-18 02:01:26
一直以来,听到最多的声音就是前端项目不支持单元测试,或者前端根本不需要单元测试。这些声音真的会对前端单元测试的发展和推广造成很大的影响,造成很多从业者根本不了解前端单元测试。
今天就借这个机会用小实例为大家聊聊前端单元测试到底应该怎么测!
单元测试的本质和价值
编写单元测试的目的是为了在产品上线前验证我们的代码是否符合预期。编写单元测试并不是用来保证我们的代码永远不会出问题,而是为了保证我们的代码在预期边界内工作。
当我们遇到代码问题的时候,比如说前端的某个组件存在一个bug,这时我们就可以打开单元测试,让单元测试来执行这个组件的业务逻辑,看下我们之前写的单元测试会不会报错。
单元测试最大的价值就是能够提高项目的质量,让我们的项目更加健壮。
单元测试的种类
白盒测试和黑盒测试
单元测试分为白盒测试和黑盒测试,黑盒测试就是根据组件的业务逻辑,去测试这个组件的输出是否符合预期。白盒测试就是指通过测试这个组件的源代码,来判断这个组件是否符合预期。
白盒测试的具体方法包括代码覆盖率和断言。白盒测试我们可以通过工具来收集测试覆盖率。测试覆盖率的高低是衡量单元测试效果的一个重要指标。
黑盒测试的具体方法就是测试组件的输入和输出,判断输出结果是否符合预期,如果符合预期,那么这个组件就是通过了测试。
单元测试框架
使用单元测试框架可以更轻松的编写单元测试,单元测试框架有 Jest、Mocha 等。Jest 是 Facebook 发布的,Mocha 是 Airbnb 发布的。
如果大家要问我应该使用哪一个单元测试框架呢?我建议大家使用 Jest。因为 Jest 具有以下几个优点:
- Jest 是一款基于 JavaScript 的测试框架,它是为 JavaScript 代码而设计的,所以它与 JavaScript 非常兼容。
- Jest 是一款零配置的测试框架,我们可以直接使用它来编写单元测试,而不需要进行任何配置。
- Jest 是一款支持快照测试的测试框架,我们可以通过快照测试来比较组件的输出是否符合预期。
断言
断言是单元测试中非常重要的一个概念,断言就是用来验证我们的预期是否成立,断言的类型有很多,比如:
- 等于(toBe)
- 不等于(not.toBe)
- 大于(toBeGreaterThan)
- 小于(toBeLessThan)
- 大于或等于(toBeGreaterThanOrEqual)
- 小于或等于(toBeLessThanOrEqual)
- 为真(toBeTruthy)
- 为假(toBeFalsy)
- 为 null(toBeNull)
- 为 undefined(toBeUndefined)
- 包含(toContain)
- 不包含(not.toContain)
模拟、桩、存根
模拟、桩、存根都是单元测试中常用的技术。
- 模拟:模拟是指创建一个假的对象,这个对象的行为和真实的组件一样,但是我们可以控制这个对象的行为。
- 桩:桩是指创建一个假的函数,这个函数的行为和真实的函数一样,但是我们可以控制这个函数的行为。
- 存根:存根是指创建一个假的对象,这个对象的行为和真实的组件不一样,但是我们可以控制这个对象的行为。
模拟、桩、存根都可以用来隔离我们的组件,以便我们可以独立地测试我们的组件。
单元测试覆盖率报告
我们使用单元测试框架来编写单元测试,单元测试框架会生成单元测试覆盖率报告,单元测试覆盖率报告可以帮助我们了解我们的单元测试覆盖了多少代码。
如何编写单元测试
编写单元测试时,我们需要注意以下几点:
- 编写单元测试时,我们应该使用 TDD(测试驱动开发)的方式来编写单元测试。
- 编写单元测试时,我们应该编写尽可能多的单元测试,以便覆盖尽可能多的代码。
- 编写单元测试时,我们应该编写独立的单元测试,以便我们可以独立地测试我们的组件。
- 编写单元测试时,我们应该编写可读的单元测试,以便其他人可以理解我们的单元测试。
常见问题
- 单元测试会降低开发效率吗?
不会,单元测试可以帮助我们发现代码中的错误,从而提高开发效率。
- 单元测试会增加代码量吗?
不会,单元测试是独立于代码的,单元测试不会增加代码量。
- 单元测试会增加项目成本吗?
不会,单元测试可以帮助我们发现代码中的错误,从而减少项目成本。