#学习分享#开发基础知识之前端测试(一)

摘要:
基本概念测试的概念:测试是检查应用程序代码是否按预期执行的过程。前端测试根据测试范围主要分为单元测试和端到端测试。前端单元测试前端单元测试:这是一种基于单元的测试。该工具的主要功能是在各种主流Web浏览器中运行项目进行测试。如果测试结果与断言相同,则测试通过。

前言:本文用于2018/1/30晚内部分享。

主题:前端单元测试

正文:

一、思考

我的目标是,如何浅入本次的主题,让愿意接收陌生信号的“对象”快速简单的get到信号,并且对本次分享产生一个小兴趣。

#学习分享#开发基础知识之前端测试(一)第1张

二、What

    本章节主要讲述前端单元测试做什么,vue单元测试做什么。

  (1) 基础概念

  • 测试的概念:测试是检测你的应用代码(也叫“生产代码”)是否按预期执行的过程。测试可以手动测试,也可用自动测试(用编写好的代码代替人工做检测的工作),本文主要围绕后者展开。
  • 测试的分类:测试按照不同标准分类很多,不属于同一次元不能作比较。前端测试根据测试范围分类主要分为单元测试和端到端测试(E2E测试)。

  (2) 前端单元测试(Unit Test)

  •  前端单元测试:是以单元为单位进行的测试。
  •  单元:可以是一个函数、一个模块、一个包或者一个类,甚至是一个对象,在不同编程语言中定义不一样。
  •  为什么需要单元测试:使代码健壮,质量高(减少 QA 测试报告的反馈),兼容各种临界点,保证代码的整洁清晰。通俗的说,就是降低返工率,减少QA在开发者已投入其他开发工作时反馈bug从而打断当前的工作进度的现象。

 (3) vue单元测试

      vue单元测试也是单元测试,它的“单元”泛指vue组件,简单来说就是以vue组件为单位进行的单元测试。

三、HOW

     本章节主要从理论层面讲述如何实现vue的单元测试。

 (1)测试框架:

     vue-cli 自带了测试框架:jest(Javascript单元测试工具)、karma and Mocha、e2e(nightwatch)等。单元测试框架选用karma+mocha+chai。

  • Karma:一个测试运行器,用于启动浏览器,运行测试案例并将结果报告给我们。该工具的主要作用是将项目运行在各种主流Web浏览器进行测试。
  • Mocha:一个测试框架。可结合chai断言库使用。
  • Chai:一个测试断言库,提供了更好的断言语法。所谓断言,就是对组件做一些操作,并预言产生的结果。如果测试结果与断言相同则测试通过。

 (2) 运行过程 

#学习分享#开发基础知识之前端测试(一)第2张

  karma的配置文件中,可以配置files参数,即引入测试脚本,测试运行时会扫描到这些测试脚本,运行其中的测试case,得到测试报告。

四、Use

     本章节主要讲述vue单元测试的具体实施,包括测试环境搭建、配置简述、测试脚本编写、测试运行。

    (1)  测试环境搭建

       创建一个vue项目,init 时 “Set up unit tests”选择yes 、"Pick a test runner"选择Karma即可。vue-cli 会自动生成karma配置文件(karma.conf.js)。

      #学习分享#开发基础知识之前端测试(一)第3张

   (2) 配置简述

    /test/unit/karma.conf.js:

// This is a karma config file. For more details see
//   http://karma-runner.github.io/0.13/config/configuration-file.html
// we are also using it with karma-webpack
//   https://github.com/webpack/karma-webpack

var webpackConfig = require('../../build/webpack.test.conf')           // 引入webpack配置

module.exports = function karmaConfig (config) {                       // 设置karma配置
  config.set({
    // to run in additional browsers:
    // 1. install corresponding karma launcher
    //    http://karma-runner.github.io/0.13/config/browsers.html
    // 2. add it to the `browsers` array below.
// 设置默认打开的浏览器 browsers: ['PhantomJS'],
// 测试框架 frameworks: ['mocha', 'sinon-chai', 'phantomjs-shim'],
// 设置测试覆盖率输出插件 reporters: ['spec', 'coverage'],
// 测试文件入口 files: ['./index.js'],
// 预处理器--用webpack解析,同时显示测试文件路径 preprocessors: { './index.js': ['webpack', 'sourcemap'] },
// 引入webpack webpack: webpackConfig,
// 是否打印[webpack]打包信息
webpackMiddleware: { noInfo: true },
//karma-coverage配置,配置测试覆盖率的输出目录及格式
    coverageReporter: {
      dir: './coverage',
      reporters: [
        { type: 'lcov', subdir: '.' },
        { type: 'text-summary' }
      ]
    }
  })
}

 

test/unit/index.js

import Vue from 'vue'

Vue.config.productionTip = false

// require all test files (files that ends with .spec.js)
// 加载所有的测试脚本 const testsContext = require.context('./spec', true, /.spec$/) testsContext.keys().forEach(testsContext) // require all src files except main.js for coverage. // you can also change this to match only the subset of files that // you want coverage for.
// 加载所有的资源文件,及src目录下的除了main.js文件的所有文件,即要覆盖所有的代码 const srcContext = require.context('../../src', true, /^./(?!main(.js)?$)/) srcContext.keys().forEach(srcContext)

 

package.json:

   应当包含这样的script:

"unit": "jest --config test/unit/jest.conf.js --coverage",

   (3) 测试脚本编写与运行

   1、 基础知识:

  • 测试脚本都要放在 test/unit/specs/ 目录下。
  • 脚本命名方式为 [组件名].spec.js。 
  • 所谓断言,就是对组件做一些操作,并预言产生的结果。如果测试结果与断言相同则测试通过。 
  • 单元测试默认测试 src 目录下除了 main.js 之外的所有文件,可在 test/unit/index.js 文件中修改。 
  • Chai断言库中,to be been is that which and has have with at of same 这些语言链是没有意义的,只是便于理解而已。 
  • 测试脚本由多个 descibe 组成,每个 describe 由多个 it 组成。 

    2、describe 的钩子(生命周期)

describe('hooks', function() {

  before(function() {
    // 在本区块的所有测试用例之前执行
  });

  after(function() {
    // 在本区块的所有测试用例之后执行
  });

  beforeEach(function() {
    // 在本区块的每个测试用例之前执行
  });

  afterEach(function() {
    // 在本区块的每个测试用例之后执行
  });

  // test cases
});

 3、简单的测试脚本:

测试对象:/Src/components/HelloWorld.vue

     就是vue创建项目时生成的文件,没有做任何改动,以下是抽取出来的主要代码:

<template>
  <div class="hello">
    <h1>{{ msg }}</h1>
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  data () {
    return {
      msg: 'Welcome to Your Vue.js App'
    }
  }
}
</script>  

测试脚本:/test/unit/specs/HelloWorld.spec.js

    仍然没有做任何改动,只增加了注释:

import Vue from 'vue'
import HelloWorld from '@/components/HelloWorld'

// 一个 describe 代表一个测试套件,可以有多个 it块 describe('HelloWorld.vue', () => {
// 一个it块代表一个 测试case it('should render correct contents', () => {
// 获取组件实例 const Constructor = Vue.extend(HelloWorld)
// 将实例挂载到 DOM 上 const vm = new Constructor().$mount()
// 断言实际结果与预期结果一致 ———— 断言“hello”class内的 “h1” 标签文本内容等于‘Welcome to Your Vue.js App’ expect(vm.$el.querySelector('.hello h1').textContent) .to.equal('Welcome to Your Vue.js App') }) })

  

运行单元测试:#npm run unit

#学习分享#开发基础知识之前端测试(一)第4张

查看测试报告(覆盖率):报告自动写入该目录 /test/unit/coverage/lcov-report/ ....

#学习分享#开发基础知识之前端测试(一)第5张

 在浏览器查看测试报告:
#学习分享#开发基础知识之前端测试(一)第6张

#学习分享#开发基础知识之前端测试(一)第7张 

下次将深入组件测试,编写运行更为复杂的测试脚本。

五、Resource

     本章节分享本人在学习过程收集的资料,以供感兴趣者继续深入学习。

   (1) 官网:

   (2) 社区:

   (3) openSource:

   (4) 其他:

免责声明:文章转载自《#学习分享#开发基础知识之前端测试(一)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Android开发 BottomNavigationView学习【西瓜书】周志华《机器学习》学习笔记与习题探讨(一)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

vue之$nextTick详解

将回调延迟到下次 DOM 更新循环之后执行。在修改数据之后立即使用它,然后等待 DOM 更新。它跟全局方法 Vue.nextTick 一样,不同的是回调的 this 自动绑定到调用它的实例上。 场景解释: <template> <div> <input v-show="bState" type="text" p...

sklearn中的数据集的划分

sklearn数据集划分方法有如下方法: KFold,GroupKFold,StratifiedKFold,LeaveOneGroupOut,LeavePGroupsOut,LeaveOneOut,LeavePOut,ShuffleSplit,GroupShuffleSplit,StratifiedShuffleSplit,PredefinedSplit,...

VUE学习笔记--基础标签

本笔记仅用作学习vue过程中的知识记录,亦用作知识温习查询的纲要。 a、一些称呼 函数-方法:一般在上下文直接定义的function叫做函数,而在对象中定义的叫方法。即方法是附属于某个实例的,而函数是一个声明。通常,这个并不严格定义区分,更多是习惯约定。 1、options的主要属性 const obj = { counter: 0, messag...

【前端开发】vue项目日程表12月平铺(日历)vue-material-year-calendar插件的使用教程

前言 项目中需要一个12个月平铺能按年份切换的日历功能,找了好多没找到好用的,最后找了个相似的改了下,效果如下  步骤 // 安装依赖 yarn add vue-material-year-calendary 源码 <template> <div class="weekdays-pages"> <div clas...

webpack安装&amp;amp;指定版本安装&amp;amp;遇到的问题

1.安装nodejs,安装完成,cmd命令行中输入node -v 查看版本号,版本号显示则说明安装成功2.npm包管理器是集成在node中的,输入 npm -v,显示npm版本号3.创建package.json文件,输入命令 npm init,工程目录下就会生成一个package.json文件(全局安装webpack) 4.安装webpack,输入命令 n...

我想写一个前端开发工具(一):在npm发布模块

有必要说说我为什么要开始写这个,正文从下面的第一条开始 我最近忙于公司的项目,一直没有抽出时间来写文章。本来想每个月写一片文章,保质保量,无奈上个月没有坚持。 这段时间有点忙,主要是由于公司业务调整,我从原来的广告项目中调整到新业务线的前台页面开发了,和以前一样,还是带着3、4个兄弟姐妹。不同的是以前的项目周期普遍偏长,可以让每个同学有时间从头到尾的把项目...