背景
单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。
对于后端开发来说,编写单元测试并不陌生,它能在一定程度上发现bug,减少bug的产生;同时对于代码的重构也能提供必要的支持。那么问题来了,对于前端开发来说,有必要去编写单元测试吗?前端不仅仅是逻辑代码的编写,更多的是标记性语言和脚本语言,有渲染也有业务,该不该测试、如何测试是需要具体讨论分析的。
必要性
前端项目开发一般都会使用mvvm框架、UI组件、lodash函数库等, 相当于是站在巨人的肩膀进行开发。而这些开源的项目往往都是做了充分的单元测试的,不需要我们去操心,我们要做的只是在自己的项目中进行一系列的业务开发,此时单元测试是没必要的,个人见解,有不同意见可以讨论。
但是如果我们在开发过程中,需要自己手动去写一些公共函数或者公共组件,并作为项目底层,支撑着项目的“上层建筑”,此时就有必要对这些公共函数和公共组件进行单元测试了。
实现
1.下载单元测试插件。
npm install -D vitest @vitest/coverage-v8 @vue/test-utils
2.因为vitest和vite可以共用一套配置文件,可以在vite.config.ts文件中直接配置。
// <reference types="vitest" />
export default ({ mode, command }: { mode: any, command:any }) => {
return defineConfig({
test: {
globals: true,
environment: 'jsdom',
coverage: {
provider: 'v8',
all: true,
enabled: true,
reporter: ['lcov', 'html'], // 生产报告的格式,本地运行单元测试,可以注释该语句
extension: ['.vue'],
},
server: {
deps: {
inline: ['element-plus'],
}
},
include: ['**/test/**/*.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
passWithNoTests: true,
// 测试报告生成文件
outputFile: './coverage/junit.xml',
},
})
}
3.在package.json中添加单元测试命令。
"test:unit": "vitest run --coverage"
4.与src文件夹同级建立test文件夹,编写单元测试。建议test文件夹中的单元测试文件结构与src保持一致,方便后期查看。运行上述命令npm run test:unit即可显示覆盖率。
import { describe, expect, it } from 'vitest'
import { mount } from '@vue/test-utils'
import Button from '@/components/Button.vue'
describe('test button', () => {
it('should have class', () => {
const wrapper = mount(Button, {
props: {
type: 'primary'
}
})
expect(wrapper.classes()).toContain('button--primary')
})
})
总结
综上分析了前端单元测试是否必要及单元测试实现的具体步骤,当然项目中是否要添加单元测试需要根据项目的具体情况进行分析,在本篇文章讲述过程中如有错误或不同意见,欢迎大家及时纠正。