小公司,前端团队只有三人。目前只有长期项目才做单元测试,短期项目不做。
如果说得更具体一点的话,就是业务页面不做测试,因为需求变更比较频繁。只有工具函数和公共组件还有比较稳定的业务页面才做测试。
测试的好处相信大家都知道了,但不是所有公司都有这个条件去写测试。有些公司是没有这种要求,纯靠人用手点点点来测试;有些公司甚至连测试都没有;还有的则是没时间。
我建议大家面试时最好问问面试官他们团队怎么做测试的,如果面试官能说出个道道来,说明至少靠谱一点。对于只有人力测试和没有测试的公司,就需要谨慎考虑。
对于个人来说,除了单元测试,我建议最好把端到端测试也掌握一下。你可以不写,但你必须得会。
有网友评论不懂单元测试,所以我在此补充一下关于单元测试的内容。
单元测试
单元测试是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。在前端来说,就是对一个函数、一个组件、一个类做的测试,它针对的粒度比较小(推荐使用 Jest 测试框架)。
它应该怎么写呢?
1、根据正确性写测试,即正确的输入应该有正常的结果。
2、根据异常写测试,即错误的输入应该是错误的结果。
对一个函数做测试
例如一个取绝对值的函数 abs(),输入 1,2,结果应该与输入相同;输入 -1,-2,结果应该与输入相反。如果输入非数字,例如 "abc",应该抛出一个类型错误。
对一个类做测试
假设有这样一个类:
class Math {
abs() {
}
sqrt() {
}
pow() {
}
...
}
单元测试,必须把这个类的所有方法都测一遍。
对一个组件做测试
组件测试比较难,因为很多组件都涉及了 DOM 操作。
例如一个上传图片组件,它有一个将图片转成 base64 码的方法,那要怎么测试呢?一般测试都是跑在 node 环境下的,而 node 环境没有 DOM 对象。
我们先来回顾一下上传图片的过程:
1、点击 <input type="file" />,选择图片上传。
2、触发 input 的 change 事件,获取 file 对象。
3、用 FileReader 将图片转换成 base64 码。
这个过程和下面的代码是一样的:
document.querySelector('input').onchange = function fileChangeHandler(e) {
const file = e.target.files[0]
const reader = new FileReader()
reader.onload = (res) => {
const fileResult = res.target.result
console.log(fileResult) // 输出 base64 码
}
reader.readAsDataURL(file)
}
上面的代码只是模拟,真实情况下应该是这样使用:
document.querySelector('input').onchange = function fileChangeHandler(e) {
const file = e.target.files[0]
tobase64(file)
}
function tobase64(file) {
return new Promise((resolve, reject) => {
const reader = new FileReader()
reader.onload = (res) => {
const fileResult = res.target.result
resolve(fileResult) // 输出 base64 码
}
reader.readAsDataURL(file)
})
}
可以看到,上面代码出现了 window 的事件对象 event、FileReader。也就是说,只要我们能够提供这两个对象,就可以在任何环境下运行它。所以我们可以在测试环境下加上这两个对象:
// 重写 File
window.File = function () {}
// 重写 FileReader
window.FileReader = function () {
this.readAsDataURL = function () {
this.onload
&& this.onload({
target: {
result: fileData,
},
})
}
}
然后测试可以这样写:
// 提前写好文件内容
const fileData = 'data:image/test'
// 提供一个假的 file 对象给 tobase64() 函数
function test() {
const file = new File()
const event = { target: { files: [file] } }
file.type = 'image/png'
file.name = 'test.png'
file.size = 1024
it('file content', (done) => {
tobase64(file).then(base64 => {
expect(base64).toEqual(fileData) // 'data:image/test'
done()
})
})
}
// 执行测试
test()
通过这种 hack 的方式,我们就实现了对涉及 DOM 操作的组件的测试。我的 vue-upload-imgs 库就是通过这种方式写的单元测试,有兴趣可以了解一下。
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理