Karma 自动化测试框架搭建文档

2023-11-11

一.前言

此文档为前端自动化单元测试框架 Karma 的搭建以及使用文档。

二.准备环境

先列出我们此次搭建测试框架 Karma 必须的环境和包。

 1. node.js (node 引擎)
 2. npm (node 包管理器)
 3. cnpm(可选) (淘宝镜像)
 4. karma (提供 web 服务和浏览器适配)
 5. mocha   (单元测试框架)
 6. chai    (断言库)
 6. requirejs    (提供非commonjs规范的模块加载)
 7. karma-mocha karma-chai   karma-requirejs  (karma 中对应的包)
 8. karma-chrome-launcher  karma-ie-launcher  (karma 中的浏览器适配包)
 9. karma-mocha-reporter (karma 中的 mocha 终端测试报告)
 10. karma-htmlfile-reporter (karam 生成 html 格式的测试报告文件)

三.安装步骤

1. 安装 nodenpm

进入node官网,根据你的操作系统选择对应的安装包。安装时记得添加选择默认添加环境变量和安装npm

安装完成后打开gitbash输入以下命令测试是否安装成功:

$ node -v
v10.14.1

$ npm -v
6.4.1

2. 安装 cnpm

此为npm的淘宝镜像,为了解决npm下载包网速过慢的问题。请在gitbash中输入以下命令:

$ npm install -g cnpm --registry=https://registry.npm.taobao.org

完成后输入以下命令测试cnpm是否安装成功:

cnpm -v

3.初始化 package.json

首先,在项目内新建一个文件夹 /test。(与static,templates平级)。此时我们有以下目录结构:

在这里插入图片描述

由于这是我已经配置好的目录结构,各位可以先不用关心细节,我们从空的/test文件夹开始。

gitbash 中进入 /test 目录,然后输入命令:

$ npm init -y

会出现一个名为 package.jsonjson 文件,文件内容如下:

在这里插入图片描述

4. 安装 karmakarma-cli

什么是 karma 这种问题大家可以自行去Karma官网自行查看。

我们回到刚刚那个 gitbash 目录,输入以下命令:

$ cnpm install karma-cli -g
$ cnpm install karma -D

安装好之后输入 karma --version 来查看是否安装成功。

5.安装 package.json 中的依赖

打开你的 package.json 文件,此时它的内容如下:

{
  "name": "test",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "karma": "^4.0.0"
  }
}

devDependencies 中是你的依赖包,现在你要做的就是用下面这个 json 中的内容去替换你的 package.json 内容。

{
  "name": "test-project2",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "chai": "^4.2.0",
    "karma": "^4.0.0",
    "karma-chai": "^0.1.0",
    "karma-chrome-launcher": "^2.2.0",
    "karma-htmlfile-reporter": "^0.3.7",
    "karma-ie-launcher": "^1.0.0",
    "karma-mocha": "^1.3.0",
    "karma-mocha-reporter": "^2.2.5",
    "karma-requirejs": "^1.1.0",
    "mocha": "^5.2.0",
    "requirejs": "^2.3.6"
  }
}

替换完了后,回到 gitbash 中输入:

$ cnpm install

安装完成后即可。

5.初始化 karma.conf.js 配置文件

现在我们需要配置一下 karma 的配置文件:

$ karma init

然后 karma 会让我们配置一些选项,你可以按下面这张图来配:

在这里插入图片描述

完成后我们可以在 /test 文件夹根目录里看到一个 karma.conf.js 文件。

注意,在 windows操作系统下使用 gitbash 进行 karma init 时会报以下错误:

在这里插入图片描述

这时你切换到 windows 的默认终端来执行命令就好。

由于不同的项目文件目录的配置不同,所以提供一个标准的 karma.conf.js 配置不是一件现实的事情,它需要对 karma.conf.js 文件中的 files 属性进行一些改变。下面我提供一个控制中心 RC2 版本的 karma.conf.js 配置:

// Karma configuration
// Generated on Mon Jan 28 2019 14:56:31 GMT+0800 (GMT+08:00)

module.exports = function(config) {
  config.set({

    // base path that will be used to resolve all patterns (eg. files, exclude)
    basePath: '',


    // frameworks to use
    // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
    frameworks: ['mocha', 'requirejs', 'chai'],


    // list of files / patterns to load in the browser
    files: [
      { pattern: 'lib/*.js',  included: true },
      { pattern: '../static/js/common/*.js',  included: true },
      { pattern: 'unit-test/**/*.spec.js', included: false },
      './test-main.js'
    ],


    // list of files / patterns to exclude
    exclude: [
    ],


    // preprocess matching files before serving them to the browser
    // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
    preprocessors: {
    },


    // test results reporter to use
    // possible values: 'dots', 'progress'
    // available reporters: https://npmjs.org/browse/keyword/karma-reporter
    reporters: ['mocha', 'html'],

    mochaReporter: {
      output: 'autowatch'
    },

    htmlReporter: {
      outputFile: 'reproter/units.html',
            
      // Optional
      pageTitle: 'Unit Tests',
      subPageTitle: 'A sample project description',
      groupSuites: true,
      useCompactStyle: true,
      useLegacyStyle: true
    },

    // web server port
    port: 9877,


    // enable / disable colors in the output (reporters and logs)
    colors: true,


    // level of logging
    // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
    logLevel: config.LOG_INFO,


    // enable / disable watching file and executing tests whenever any file changes
    autoWatch: true,


    // start these browsers
    // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
    browsers: ['Chrome',  'IE'],


    // Continuous Integration mode
    // if true, Karma captures browsers, runs the tests and exits
    singleRun: true,

    // Concurrency level
    // how many browser should be started simultaneous
    concurrency: Infinity
  })
}

6.设置 requirejs 入口文件

通常来说我们需要在 A.js 中引入 B.js 中的一个函数,需要这样:

const add = require('./B.js');
add(1,2)  // logs 3

B.js中的内容应该如下:

exports.add = function(){
    var sum = 0;
    for(let i = 0; i < arguments.length; i++){
        sum += arguments[i];
    }
    return sum;
}

具体规则大家可以自行去查阅commonJS规范

但是我们现在不具备这个条件,前端代码并不是commonjs 格式,所以我们需要引入requirejs 来解决这个问题。

/test 文件夹下新建 test-main.js 文件,内容如下:

var TEST_REGEXP = /(spec|test)\.js$/i;
var allTestFiles = [];

// Get a list of all the test files to include
Object.keys(window.__karma__.files).forEach(function(file) {
  if (TEST_REGEXP.test(file)) {
    // Normalize paths to RequireJS module names.
    // If you require sub-dependencies of test files to be loaded as-is (requiring file extension)
    // then do not normalize the paths
    var normalizedTestModule = file.replace(/^\/base\/|\.js$/g, '');
    allTestFiles.push(normalizedTestModule);
  }
});

require.config({
  // Karma serves files under /base, which is the basePath from your config file
  baseUrl: '/base',

  // example of using a couple of path translations (paths), to allow us to refer to different library dependencies, without using relative paths
  paths: {
   
  },

  // example of using a shim, to load non AMD libraries (such as underscore)
  shim: {
    'underscore': {
      exports: '_'
    }
  },

  // dynamically load all test files
  deps: allTestFiles,

  // we have to kickoff jasmine, as it is asynchronous
  callback: window.__karma__.start
});

7.进行简单的 unit test

我以控制中心RC2的目录结构为例,在 /webui/static/js/common下有个datahandle.js文件,我们取其中的一个dataHandle.cutLargeNum()函数来进行测试。

首先看下目前 /test 的目录结构:

在这里插入图片描述

/reporter是生成测试报告的文件夹,这个在后面再说。

注意这个 /unit-test 文件夹,这个文件夹名字并非是固定的,只要你能把它和 karma.conf.jsfiles 的路径名称对应起来。

我们在 /unit-test 文件夹下创建 index.spec.js文件,注意,以后此文件夹下所有的测试用例文件都应该以 **.spec.js 结尾,应该我们在 karma.conf.jstest-main.js 文件中都做了正则限制。

index.spec.js 文件内容如下:

var expect = chai.expect;

describe('unit test', function(){
    it('dataHandle.cutLargeNum(1000) = 1.00万',function(){
        expect(dataHandle.cutLargeNum(10000)).to.equal('1.00万');
    })
})

chai为断言库,文中使用的是 BDD 风格的 expect 断言。
我们在 gitbash 中输入 $ karma start 运行测试,有以下输出结果:

在这里插入图片描述

我们还可以修改 karma.conf.js 中的 singleRun 属性为 false

  // Continuous Integration mode
  // if true, Karma captures browsers, runs the tests and exits
    singleRun: false,

然后再运行 $ karma start,此时你再修改 /static/js/common 下的任何一个 js 文件, karma 都会自动重新运行 /unit-test 下的测试用例。

8.生成测试报告

生成测试报告的模块我选择的是 karma-htmlfile-reporter,相应需要做的配置我已经加在之前的 karma.conf.js 文件中了。

我们只需要执行 $ karma start --reporter html ,就可以发现 /test 目录多了一个 /reporter 文件夹,里面放着我们的测试报告 units.html

大概长这样:

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Karma 自动化测试框架搭建文档 的相关文章

  • 软件测试/测试开发/全日制/测试管理丨Python深拷贝与浅拷贝

    深拷贝和浅拷贝是两种不同的拷贝方式 它们在处理可变对象 如列表 字典 时有着不同的行为 以下是深拷贝和浅拷贝的主要区别 1 浅拷贝 Shallow Copy 创建方式 浅拷贝通过复制原始对象 创建一个新对象 但对于原始对象中的可变对象 如列
  • Selenium小技巧!

    Chrome DevTools 简介 Chrome DevTools 是一组直接内置在基于 Chromium 的浏览器 如 Chrome Opera 和 Microsoft Edge 中的工具 用于帮助开发人员调试和研究网站 借助 Chro
  • 微信小程序的自动化测试框架

    微信发布了小程序的自动化测试框架Minium 提供了多种运行验证方式 其特点 支持一套脚本 iOS Android 模拟器 三端运行 提供丰富的页面跳转方式 看不到也能去得到 可以获取和设置小程序页面数据 让测试不止点点点 可以直接触发小程
  • 测试用例评审流程优化

    测试用例 评审是QA日常工作流程中的关键一环 是QA同学完善测试用例 交流测试经验的好机会 负责组内测试用例建设以来 作者对于评审流程做了一些优化工作 本文作者将整个优化过程中的心得体会做了一个总结 希望能给大家带来帮助 01 原始流程 1
  • 软件测试|深入了解Python中的super()函数用法

    简介 Python中的super 函数是一种强大的工具 用于在子类中调用父类的方法 它在面向对象编程中非常有用 可以让你轻松地扩展和重用现有的类 本文将详细介绍super 函数的用法 并提供一些示例来帮助你更好地理解它的功能 什么是supe
  • 软件测试|SQLAlchemy环境安装与基础使用

    简介 SQLAlchemy 是一个强大的 Python 库 用于与关系型数据库进行交互 它提供了高度抽象的对象关系映射 ORM 工具 允许使用 Python 对象来操作数据库 而不必编写原生SQL查询 本文将介绍如何安装 SQLAlchem
  • HTML概述、基本语法(表格整理、标签、基本结构)

    一 HTML概述 HTML指的是超文本标记语言 超文本 是指页面内可以包含图片 链接 声音 视频等内容 标记 标签 通过标记符号来告诉浏览器页面该如何显示 我们可以打开浏览器 右击页面 点击 查看网页源代码 来方便了解HTML标签通过浏览器
  • 点击存储到固定时间清除存储

    这段代码 无意间想到的 随便写了下来 运行 根据点击之后传递一个参数 将他存入本地存储 方便测试为10秒 10秒后触发下一个事件 清除本地存储 结束
  • 如何写好一个错误报告

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读2 3k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • Vue3 和Vue2的区别,以及钩子函数的使用

    Vue js 3 和 Vue js 2 是两个主要版本的流行前端框架 它们之间有很多区别 包括性能优化 新特性和改进的API等 以下是一些Vue 3与Vue 2之间的主要区别 以及一些示例代码来说明这些差异 1 性能优化 响应式系统 Vue
  • 摸爬滚打多年的打工人,总结了三条职场真理,绝不假大空!

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读2 3k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • 低代码配置-列表页组件设计

    保存 表单属性存放 bill 筛选项配置存放 filterLayout 列表按钮存放 buttonLayout 列表布局存放 listLayout api存放 api 数据结构 layout 存放表单基础配置 bill 存放按钮基础配置 b
  • 低代码配置-属性配置面板设计

    模块设计 tab项切换 组件基础属性 组件数据属性 组件事件属性 表单属性 模块输出函数设计 tab切换函数 列表表单属性 数据来源 调用接口时一次赋予 无需使用selectItem 如需使用 归入基础属性 列表标题 是否展示筛选区域
  • 软件测试中的白盒测试,这些技巧你知道吗?

    对于很多刚开始学习软件测试的小伙伴来说 如果能尽早将黑盒 白盒测试弄明白 掌握两种测试的结论和基本原理 将对自己后期的学习有较好的帮助 今天 我们就来聊聊黑盒 白盒测试的相关话题 1 黑盒测试的方法和小结 最常见黑盒测试方法包括 边界值 等
  • 月薪2W的软件测试工程师,到底是做什么的?

    在生活中 我们常常会遇到以下几种窘迫时刻 准备骑共享单车出行 却发现扫码开锁半天 车子都没有反应 手机导航打车 却发现地图定位偏差很大 司机总是跑错地方 买个水 却遭遇自动售货机吐币 或者不找零钱 好不容易休息打个游戏 却一直出现卡顿 闪退
  • Python常用的自动化小脚本!

    一 list转json string转json 可以使用Python内置的 json 模块将列表 List 和字符串 String 转换成JSON格式 List转JSON假设我们有一个列表 List my list apple banana
  • chrome浏览器无法在地址栏输入内容搜索问题解决--图文

    关于日常遇到的小问题解决记录一下 1 导航栏录入信息后跳转错误 2 解决办法 默认百度搜索引擎地址错误 百度正确的搜索格式是 http www baidu com s wd s chrome浏览器中百度的搜索格式是 http www bai
  • 一文让你了解UI自动化测试

    测试都起什么作用 是项目的保险 但不是项目的救命草 测试无实际产出 但作用远大于实际产出 测试是从项目维度保证质量 而不是测试阶段 UI自动化 下面简称自动化 基于UI进行自动功能测试 以Web端作为例子 一般的UI功能自动化都是基于HTM
  • 深入解析 YAML 配置文件:从语法到最佳实践

    一 认识YAML YAML YAML Ain t Markup Language 是一种人类可读的数据序列化语言 它的设计目标是使数据在不同编程语言之间交换和共享变得简单 YAML采用了一种简洁 直观的语法 以易于阅读和编写的方式表示数据结
  • 【前端】canvas图片加文字

    注释标记了操作步骤 import React Component createRef from react class CertifyImgRender extends Component bgRef createRef

随机推荐

  • 途客圈创业记--读书笔记

    一 初创公司股权结构 2011年6月公司创立 自筹启动资金50万 1 陈天和Alex 每人出资25万元 总计50万元 作为启动资金 2 陈天 CTO兼董事长 股份60 因为是想法的发起人 且在实现这个想法的过程中 Alex CEO 股份40
  • 【C++学习第三讲】C++语句

    目录 C 语句 一 引入 二 声明语句和变量 1 为什么变量必须声明 三 赋值语句 四 cout新花样 五 cout和printf 六 其他C 语句 1 使用cin 2 使用cout进行拼接 七 类简介 一 引入 C 程序是一组函数 而每个
  • Qt::FramelessWindowHint无边框化,移动,大小调整

    QT工作笔记壹 导读 开发环境 QT界面无边框 方法1 方法2 引用 导读 最近工作一个项目需要用QT设计一个UI 看了一下目前主流商业化UI 例如扣扣 微信 网易云音乐 结合个人审美 本人非美术专业 但游戏经验丰富 对人机交互界面有个人看
  • 为什么有了uwsgi 还要 nginx 服务器

    相信每一个使用nginx uwsgi django部署过的人 都感到非常复杂 到底为什么一个项目的发布要经过这么多层级 他们每一层有什么理由存在 这就带大家宏观地看待一下 首先nginx 是对外的服务接口 外部浏览器通过url访问nginx
  • MyBatis 的执行流程

    前言 MyBatis可能很多人都一直在用 但是MyBatis的SQL执行流程可能并不是所有人都清楚了 那么既然进来了 通读本文你将收获如下 1 Mapper接口和映射文件是如何进行绑定的 2 MyBatis中SQL语句的执行流程 3 自定义
  • Js Vue 获取当月第一天、最后一天、当天

    new Date 效果 2023 06 12 注 本文示例以获取当天为例 一 new Date 在vue中使用new Date 获取当月第一天 最后一天 当天 二 使用步骤 1 定义方法 代码如下 示例 param type 0 第一天 1
  • 如何在Gephi中可视化多层网络

    要借助一个插件实现 Isometric Layout 感谢插件作者对gephi社群提供的贡献 作者网页的图片 下载 url https gephi org plugins plugin isometric layout 点击这儿下载再在Ge
  • centos8.5.111安装mysql8.0

    修改网络源 Connecting to 192 168 182 154 22 Connection established To escape to local shell press Ctrl Alt Activate the web c
  • 关于CSS3:justify-self,justify-items和justify-content之间的区别

    这篇文章应该能帮到你 https www codenong com 48535585 总结 flex布局 这三个属性中 只能用justify content属性 1 justify content 2 justify items 3 jus
  • LeetCode: 高频树结构题目总结 - Python

    LeetCode 高频树结构题目总结 问题描述 LeetCode 98 验证二叉搜索树 根据中序遍历 判断大小 LeetCode 99 恢复二叉搜索树 搜索二叉树有两个节点搞错了 恢复好 LeetCode 100 相同的树 LeetCode
  • MyCobot六轴机械臂(六)--Myblockly模块简介

    1 Logic模块 如图3 11所示 表示if 条件 do 程序1 else 程序2 若满足条件则执行程 序1 否则执行程序2 所表示方法的详细讲解可查看图1 2下方的文字讲解 所表示的逻辑判断 返回值为true或者false 可以点击 中
  • spring源码研究之IoC容器在web容器中初始化过程

    前段时间在公司做了一个项目 项目用了spring框架实现 WEB容器是Tomct 5 虽然说把项目做完了 但是一直对spring的IoC容器在web容器如何启动和起作用的并不清楚 所以就抽时间看一下spring的源代码 借此了解它的原理 我
  • 经典SQL题目-求第N高的薪水的解法汇总及知识点复习

    这几天在看Leetcode的时候逐步开始留意SQL题目 不做不知道 一做才感觉自己的SQL太弱了 因此将一道经典题目 求第N高的薪水的解法进行汇总 MySQL 相关解法的原文链接已标注在文末 题目的链接为 第N高的薪水 一 题干 第N高的薪
  • [云原生专题-45]:Kubesphere云治理-基于Kubernetes 构建的企业级容器平台简介与总体架构

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 122905834 目录 前言 第1章
  • pip换源+更改默认安装位置

    本文档创建于2023年3月9日 本文记录了pip换源和更改默认安装位置的操作 主要用于pip的一些配置 方便下载和文件管理 pip换源 使用pip安装库时 如果用默认的库经常会遇到连接不上或下载慢的问题 更换为国内的库下载会更快 临时换源
  • 使用TCP方式拉取Canal数据

    1 Canal对接Kafka联调 1 1 配置修改 canal properties 修改 zk canal zkServers 10 51 50 219 2181 instance properties 开启配置项 canal mq dy
  • 1056 组合数的和

    给定 N 个非 0 的个位数字 用其中任意 2 个数字都可以组合成 1 个 2 位的数字 要求所有可能组合出来的 2 位数字的和 例如给定 2 5 8 则可以组合出 25 28 52 58 82 85 它们的和为330 输入格式 输入在一行
  • Springboot3 + SpringSecurity + JWT + OpenApi3 实现认证授权

    Springboot3 SpringSecurity JWT OpenApi3 实现双token 目前全网最新的 Spring Security JWT 实现双 Token 的案例 收藏就对了 欢迎各位看友学习参考 此项目由作者个人创作 可
  • 即使失业,也要把第二个一万小时坚持下去

    这个月打的我有点懵逼 不知所措了 所以 在此写贴 即使失业 也要把第二个一万小时坚持下去 每天8小时学习 反正已经非工资收入九千了 基本上可以活下去了
  • Karma 自动化测试框架搭建文档

    一 前言 此文档为前端自动化单元测试框架 Karma 的搭建以及使用文档 二 准备环境 先列出我们此次搭建测试框架 Karma 必须的环境和包 1 node js node 引擎 2 npm node 包管理器 3 cnpm 可选 淘宝镜像