你们公司的前端在做有单元测试吗?

发表于:2022-3-22 10:13

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:谭光志    来源:知乎

  小公司,前端团队只有三人。目前只有长期项目才做单元测试,短期项目不做。
  如果说得更具体一点的话,就是业务页面不做测试,因为需求变更比较频繁。只有工具函数和公共组件还有比较稳定的业务页面才做测试。
  测试的好处相信大家都知道了,但不是所有公司都有这个条件去写测试。有些公司是没有这种要求,纯靠人用手点点点来测试;有些公司甚至连测试都没有;还有的则是没时间。
  我建议大家面试时最好问问面试官他们团队怎么做测试的,如果面试官能说出个道道来,说明至少靠谱一点。对于只有人力测试和没有测试的公司,就需要谨慎考虑。
  对于个人来说,除了单元测试,我建议最好把端到端测试也掌握一下。你可以不写,但你必须得会。
  有网友评论不懂单元测试,所以我在此补充一下关于单元测试的内容。
  单元测试
  单元测试是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。在前端来说,就是对一个函数、一个组件、一个类做的测试,它针对的粒度比较小(推荐使用 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),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号