简介

日常我们都忙于写bug,有时候不妨停下脚步,找找bug。测试广义上分为黑盒测试和白盒测试。单元测试属于后者,是在知道程序运行逻辑的基础上,设计测试用例,确保程序模块行为与我们预期一致。

前端做单元测试的不多,但是并不代表不必要,对于一些复杂的数据处理、公共类库等,单元测试是非常有必要的,代码只要有修改,就是有风险的,检验代码正确与否,最安全的方法就是通过设计的所有测试用例。通过本文,你将会收获以下内容:

  1. Node.js中如何做单元测试,如何生成测试报告与测试覆盖率
  2. vue.js单文件组件如何从零开始搭建单元测试环境

Node.js单元测试

巧妇难为无米之炊,在做单元测试前,我们需要借助一款测试框架与一个断言库,测试框架是辅助我们编写测试用例,而断言主要是用来判断预期输出与实际输出是否一致。本文测试框架选用mocha,断言采用expect.js。

CommonJS与ES6模块化区别

现在前端开发环境几乎都运行在Node.js中,只是最后打包成静态资源文件。所以单纯只想针对单纯项目中JavaScript文件进行单元测试,会因为模块化的差异而执行失败,因为ES6中使用的是import/export,而CommonJS中使用的require/module.exports,想了解Node.js 如何处理 ES6 模块,可以参考阮老师文章。本文推荐一个第三方类库esm,仅需两步就能实现Node.js加载ES6 module。使用流程如下:

  • 安装
npm install esm -D
  • 使用
const $require = require('esm')(module)
// 注意:如果是export default,导入的模块需要通过.default获取
const TestModule = $require('ES6Module.js')

测试代码

以下为测试代码,主要测试加法运算及函数柯里化处理过程是否正确。

class Calc {constructor() {this.add = this.addFun()}// 函数柯里化addFun () {let args = []let calcFun = function (...params) {args = args.concat(params)return args.reduce((total, current) => {return total + current}, 0)}calcFun.clear = function () {args = []}return calcFun}
}export default = Calc

编写测试用例

测试框架采用mocha,一般编写单元测试用例,离不开describe和it。describe类似于开发中的class,是一类测试用例的集合;it相当于普通function,是一个具体测试用例实现。如下为简单的测试用例,简单罗列了普通测试与异步测试的基本使用,更多使用方法可以参考mocha官网

const Calc = require('../class/calc.js')
const expect = require('expect.js')const calcInstance = new Calc()
describe('Test calc add operation', function () {it('should 1 + 2 === 3', function () {expect(calcInstance.add(1, 2)).to.be(3)});it('should summary + 2 === 4', function () {expect(calcInstance.add(2)).to.be(5)});it('should 1 + 2 === 3 after clear', function () {// 指定当前测试用例超时时间this.timeout(0)calcInstance.add.clear()// 异步测试return new Promise(resolve => {setTimeout(() => {resolve()}, 2000)}).then(() => {expect(calcInstance.add(1, 2)).to.be(3)})});
})

单元测试指标

覆盖率简述

覆盖率是单元测试核心指标,又细分为语句覆盖率(Statements)、分支覆盖率(Branches)、函数覆盖率(Functions)、行覆盖率(Lines)。一个比较好的单元测试用例,要保证被测试代码的关键逻辑都被测试用例覆盖到。如下为Calc类的单元测试覆盖率情况。

单元测试覆盖率统计

开源组件nyc可以帮助我们统计覆盖率情况。

  • 安装
npm install nyc -D
  • 配置文件
// nyc.config.js
module.exports = {all: true,include: [ // 包含测试文件"web/src/lib/**.js",".electron/class/**.js","web/src/**/*.js","web/src/**/*.vue"],exclude: [ // 排除测试文件"web/test/*.spec.js",".electron/test/*.spec.js"],checkCoverage: false, // 测试基准覆盖率reporter: ['text', 'html'] // 测试报告格式
}
  • 使用
// package.json
"test-add": "nyc mocha .electron/test/calc.spec.js"

可视化单元测试报告

mocha官方推荐使用mochawesome用于生成可视化测试报告,使用非常简单。

  • 安装
npm install mochawesome -D
  • 使用
// package.json
"test-add-reporter": "mocha .electron/test/calc.spec.js --reporter mochawesome --reporter-options reportDir=mochaReporter,reportFilename=addReporter"

注意事项
编写单元测试用例时,不仅要考虑测试覆盖率,还要考虑测试用例设计。合格的测试用例不仅要包含正常情况输入输出,也要包含异常情况输入输出的判断,不能以开发的思维去编写测试用例。

vue组件的单元测试

vue单文件组件测试官方脚手架也有集成,但是还是要抱着试一试的态度,去学习下如何从零开始搭建一个vue单文件组件测试环境。

.vue文件并不能直接执行,需要对其进行打包编译,转换成浏览器能识别的静态资源文件才行。目前有开源的工具mochapack可以提供这种能力。见名知意,普通mocha测试用例是可以直接执行的,但是遇到非javascript语法,就会执行报错。mochapack主要功能是在测试用例执行前利用webpack对测试用例进行编译转换,这样就不用担心执行出错。具体配置如下:

// 基础配置
{"test-vue-sfc": "mochapack  --webpack-config ./build/webpack.test.config.js --require ./web/test/setup.js web/test/demo.spec.js"
}
  • –webpack-config 指定webpack配置文件
  • –require 指定环境依赖状态,如nodejs中不存在dom,需要引入js-dom
  • web/test/demo.spec.js 需要执行的测试用例

vue测试用例编写

测试用例是用nodejs执行,并没有浏览器环境,所以我们借助官方提供的测试工具@vue/test-utils对组件进行模拟挂载、点击等。使用方法也比较简单,以下为简单的测试用例。

import Vue from 'vue'
import ElementUI from 'element-ui'
import TestDemo from '../src/components/test-demo.vue'
import { shallowMount } from '@vue/test-utils'Vue.use(ElementUI)describe('Test test-demo.vue', function () {this.timeout(0)const wrapper = shallowMount(TestDemo)wrapper.vm.count = 1it('should summary === 1', function () {expect(wrapper.vm.summary).to.be(1)});
})

结语

对于通用性、处理逻辑复杂等模块单元,做单元测试收益会很大的,至少每次改动的对错,都能有一个较明显的反馈。单元测试不仅要注意一定程度的覆盖率,也要注意测试用例设计的合理性。完整代码可以参考electron-demo,这个项目是electron开发demo,里面是本人日常开发中常见的坑点,有兴趣的可以关注下。

最后: 可以关注公众号:伤心的辣条 ! 进去有许多资料共享!资料都是面试时面试官必问的知识点,也包括了很多测试行业常见知识,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。


好文推荐

转行面试,跳槽面试,软件测试人员都必须知道的这几种面试技巧!

面试经:一线城市搬砖!又面软件测试岗,5000就知足了…

面试官:工作三年,还来面初级测试?恐怕你的软件测试工程师的头衔要加双引号…

什么样的人适合从事软件测试工作?

那个准点下班的人,比我先升职了…

测试岗反复跳槽,跳着跳着就跳没了…

【干货】前端单元测试入门相关推荐

  1. 【前端单元测试入门03】Sinon

    前端测试存在的问题 在讲Sinon之前,我们得先讲一下在学习了Mocha.chai以及enzyme之后,我们的前端测试还存在的一些问题. 比如前台测试需要与后台交互,获取后台数据后再根据相应数据进行测 ...

  2. 前端单元测试到底要怎么写?看这一篇就够了

    本文因未标注原创,如需转载,请顶部标注来源本公众号. 简介 随着 Web 应用的复杂程度越来越高,很多公司越来越重视前端单元测试.我们看到的大多数教程都会讲单元测试的重要性.一些有代表性的测试框架 a ...

  3. eclipese web前端开发教学_Web 前端怎样入门?

    写在前面的话,不想看的可以直接拉到原答案- 本篇文章持续更新--你们的赞数越多我更新越快 最近思考了很久,也看了下前端方面的资料,发现市面上免费的前端教程质量真的很参差不齐,所以准备尽最大的努力的把这 ...

  4. web前端开发入门学习线路图详解-2019升级版

    现如今,Web前端工程师已经成为各大互联网公司不可或缺的热门职位,从业者队伍日渐庞大,这其中不乏零基础学习者和转行人士.为了方便大家系统而全面的掌握前端基础知识,千锋小编特意整理了web前端开发入门学 ...

  5. Node.js前端工程师入门速成-姜威-专题视频课程

    Node.js前端工程师入门速成-11129人已学习 课程介绍         随着"大前端战略"的技术革新,前端工程师的项目领域也变得异常宽广,从客户体验的设计层面,延伸到流畅性 ...

  6. 数字IC前端设计入门----之环境搭建

    数字IC前端设计入门----环境搭建 今天开始学习IC设计,需要的都学可以一起来哦.作者小白一个,欢迎多多交流. 在某宝上花了79元买套学习资料,但是基本都是视频,应该是翻版的资料.我这里拿出来无偿给 ...

  7. openresty 前端开发入门五之Mysql篇

    2019独角兽企业重金招聘Python工程师标准>>> openresty 前端开发入门五之Mysql篇 这章主要演示怎么通过lua连接mysql,并根据用户输入的name从mysq ...

  8. Web前端开发入门之网页制作三要素!

    Web前端开发是由网页制作演变而来的,主要由HTML.CSS.JavaScript三大要素组成.专业的Web前端开发入门知识也一定会包含这些内容,今天小千就给大家简单介绍一下. HTML,超文本标记语 ...

  9. angular语言前端开发_web前端开发入门全套学习方法路径,兼职在家做网站也能月入上万...

    前端学习路径 1.WEB前端快速入门 在本阶段,我们需要掌握 HTML 与 CSS 基础,当然,也包含 H5 和 C3 的新特性.这个部分内容非常简单,而且非常容易掌握.相信你也更愿意学习这个部分,毕 ...

最新文章

  1. 三、openstack安装之Glance篇
  2. storm_常用命令
  3. Android 多媒体------相机
  4. 教小学妹学算法:诺基亚引出的动态规划问题
  5. 试论软件工程学科的交叉性_海外大学所有学科梳理(超大工程,建议收藏)-大学下的硕士一二级学科...
  6. Servlet中防止盗链的代码
  7. CSS: SASS用法指南 (附视频)
  8. 史上最全的并发编程学习目录
  9. 使用主题来自动包装控件样式
  10. ORB_SLAM2之Pangolin的安装与问题处理
  11. 微型计算机中的存储容量1TB等于,自考计算机应用基础_通关宝典
  12. 【MySQL建表语句转PostgreSQL建表语句】MySQL建表语句转PostgreSQL建表语句 接上一篇
  13. 交通规划软件功能分析
  14. 安装python时系统找不到指定的路径_系统找不到指定的路径【操作步骤】
  15. .NET报表设计器ActiveReports入门:操作界面详解
  16. ssm+boot+thymeleaf博客系统完成总结
  17. Mac系统验证文件的MD5/SHA1/SHA256
  18. 中国乳制品行业消费品牌形势与竞争格局展望报告2022版
  19. 玩乐|杭州夏季纳凉好去处
  20. [《考驾照》闲笔记事集]2012年8月28日

热门文章

  1. Python爬虫学习框架介绍
  2. 语言软件生成outsid_常用的C语言开发工具有哪些
  3. java搭建环境配置_JAVA开发环境的搭建(配置JAVA开发环境)
  4. OpenCV自适应阈值分割函数:adaptiveThreshold()介绍
  5. vue npm run dev 报错 semver\semver.js:312 throw new TypeError('Invalid Version: ' + version)
  6. python 在windows下的 虚拟环境
  7. VS2010大左括号置新行及代码批量格式化
  8. 使用 powershell 的 grep 过滤文本
  9. Codeforces Round 212 Div 2 报告(以前没写完,现在也没心情补了,先就这样吧)
  10. JQuery中each方法实现