使用karma+mocha+chai为vue组件库做单元测试

前言

单元测试,这一环节对我们的应用的重要性不言而喻,它能很大程度确保我们项目运行的健壮性。因此,前一段时间,笔者公司要求现有的vue搭建的npm组件库做单元测试。之前,笔者对单元测试做过了解,一直想做,正好借此机会向老大要了这个任务过来。下面就是笔者此次单元测试的分享。

单元测试

单元测试就是对一段代码做隔离测试。这一段代码的选择,不是固定的,而是自己去把握。

测试框架选择

如何去选择呢?

笔者认为,可以从三个方面去衡量一个框架(或者说一个测试相关的技术栈)值不值得应用。

  • 运行环境的限制(一般为node环境和浏览器环境)
  • 运行性能的高低
  • 测试报告生成

以上三个点不一定正确,纯属笔者个人观点。

框架选择

市面上有很多成熟的测试框架,比如JestMocha等。但我们对框架的选择一定要契合我们自己的项目需求。
笔者的项目是vue搭建的npm组件库,vue官方文档对vue相关的测试也是有介绍的。因此,就去了解了一番。
综合对比了下后,笔者选择了Running Vue Test Utils with Karma

karma测试搭建

安装
npm install --save-dev @vue/test-utils karma karma-chrome-launcher karma-mocha karma-sourcemap-loader karma-spec-reporter karma-webpack mocha
karma.conf.js文件配置

首先,karma的默认配置文件是karma.conf.js。当运行时,可直接执行脚本命令karma start。如果是自己另起的文件名,比如my.conf.js,则应该 karma start my.conf.js
下面直接给出笔者的文件配置,重点地方加以说明:

// karma.conf.js
const webpackConfig = require('./build/webpack.test');

module.exports = function(config) {

  const configuration = {
    frameworks: ['mocha', 'chai', 'webpack'], // 此处的配置,将框架全局变量声明为全局

    files: ['test/**/*.spec.js'],

    preprocessors: { // 预处理器
      'test/**/*.spec.js': ['webpack', 'sourcemap'] // webpack预编译处理;sourcemap映射到源码
    },

    webpack: webpackConfig,

    reporters: ['spec'],

    browsers: ['ChromeHeadless'] // 填入本地存在的正确的浏览器名称,karma会自动打开。
  };

  config.set(configuration);
};

  • frameworks:该字段所需的框架,是需要通过npm下载安装的。放置测试框架名,断言库名,webpack等。
  • files:填入你需要测试的文件。
  • preprocessors:预处理器。可配置源码的编译,及映射等功能。
  • webpack:配置测试所需的webpack编译功能。

注:光有测试框架还不行,我们还需要安装断言库,这里我们选择chai。所谓断言,就是判断源码的执行结果和预期是否一致。

配置运行karma脚本命令

这里笔者配置了两种命令,放在package.json中:

"test": "karma start karma.conf.js --single-run",
"test:watch": "karma start karma.conf.js"

第一个命令:一次性运行所有测试文件就结束了。
第二个命令:运行测试文件,并监听文件是否改动,改动了则运行。跟webpack的watch类似。

遇到的问题

1.断言库chai的expect变量,如何在全局文件中使用呢?

在这里插入图片描述
解决方案:
在这里插入图片描述

2.如何监听测试文件

在这里插入图片描述
注意:–single-run和watch这两个命令选项的功能是相斥的,二者只能有一个。

3.测试文件出错,如何找到源码行数?

安装npm install karma-sourcemap-loader --save-dev,配置文件中如下配置:
在这里插入图片描述
注意:切忌在webpack配置中打开devtool选项,否则,无法映射到源码。

4.describe函数来自mocha框架,我在配置文件中的frameworks字段写入了mocha,但eslint报undefined。

在eslint配置文件中,在env字段中加入mocha: true

5.expect函数来自chai框架,我在配置文件中的frameworks字段写入了chai,但eslint报undefined。

这时候我们是在eslint配置文件中加入如下字段:

 globals: {
    expect: true
  }

总结

好了,以上就是笔者给现有npm组件库做单元测试的经历。如有问题,欢迎大家指正~~~


版权声明:本文为qq_40713392原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。