zoukankan      html  css  js  c++  java
  • #学习分享#开发基础知识之前端测试(一)

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

    主题:前端单元测试

    正文:

    一、思考

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

    二、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) 运行过程 

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

    四、Use

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

        (1)  测试环境搭建

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

          

       (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

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

     在浏览器查看测试报告:

     

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

    五、Resource

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

       (1) 官网:

       (2) 社区:

       (3) openSource:

       (4) 其他:

  • 相关阅读:
    AutoCAD快速开发框架之菜单Menu
    AutoCAD快速开发框架之插件Plugin
    探秘AutoCAD中的阵列
    Developing Associative Functionality in AutoCAD(转)
    Getting Block Name from Associative Array(转)
    Developing associative features in AutoCAD(转)
    外部文件创建块
    AutoCAD支持的.NET SDK以及.NET Framework版本
    Flutter异步获取网络数据
    swift使用google admod的横幅,插页式,激励式广告示例
  • 原文地址:https://www.cnblogs.com/vae860514/p/8384283.html
Copyright © 2011-2022 走看看