前端自动化测试——vue单元测试vue-test-utils

2023-11-10

自动化测试分类

单元测试

单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。简单来说,单元就是人为规定的最小的被测功能模块,可能是一个单一函数或方法、一个完整的组件或类。

单元测试是最小巧也是最简单的测试——它们通过隔离单个组件的每一个部分,来在最小工作单元上进行断言。

单元测试侧重:检验函数的输出结果

e2e测试

e2e (端到端) 测试,致力于确保组件的一系列交互是正确的。它们是更高级别的测试,例如可能会测试用户是否注册、登录以及更新他们的用户名。这种测试运行起来会比单元测试和快照比对测试慢一些。

e2e测试侧重:从用户视角,对真实系统的访问行为进行仿真

快照比对测试

快照比对测试(snapshot testing)会保存你的 Vue 组件的标记,然后比较每次新生成的测试运行结果。如果有些东西改变了,开发者就会得到通知,并决定这个改变是刻意为之 (组件更新时) 还是意外发生的 (组件行为不正确)。

自动化测试框架

Jest、Mocha、Jasmine、sinon、chai、Karma、vue-test-utils都是什么?

名词 类型 名词
Jest 测试框架 Jest由Facebook开发,用于测试JavaScript代码(尤其是使用React JS开发的应用程序
集成了断言、JSDom、覆盖率报告等,是一款几乎零配置的测试框架
提供snapshot功能
Mocha 测试框架 基于JavaScript的自动化测试框架,用于测试使用Node.js运行的应用程序
比较年老的测试框架,在JavaScript界使用更广泛,可参考文献更多
Jasmine 测试框架 主要用于异步测试,是一个功能丰富的JavaScript自动化测试框架
Jasmine需要很多配置
sinon 测试框架 用于 JavaScript 的测试监视(spy)、桩(stub)和仿制(mock)功能。不依赖其他类库,兼容任何单元测试框架
chai 断言库 一套TDD(测试驱动开发)/BDD(行为驱动开发)的断言库
expect/should库
Karma 运行器 不是测试框架,也不是断言库,是允许你的JavaScript代码在复杂的浏览器运行的工具(抹平浏览器障碍)
vue-test-utils 单元测试工具库 vue官方提供的,专门为测试单文件组件而开发

为什么使用 vue-test-utils

vue-test-utils是vue官方的单元测试框架,提供了一系列非常方便的工具,使我们更轻松地为vue构建的应用来编写单元测试。主流的JavaScript测试运行器有很多,但vue-test-utils都能支持。它是测试运行器无关的。

为什么选择jest

因为 jest 包含了 karma + mocha + chai + sinon 的所有常用功能,零配置开箱即用

Vue官方是这样描述的:

Jest 是功能最全的测试运行器。它所需的配置是最少的,默认安装了 JSDOM,内置断言且命令行的用户体验非常好。不过你需要一个能够将单文件组件导入到测试中的预处理器。我们已经创建了 vue-jest 预处理器来处理最常见的单文件组件特性,但仍不是 vue-loader 100% 的功能。

vue-test-utils在Vue和Jest之间提供了一个桥梁,暴露出一些接口,让我们更加方便地通过Jest为Vue应用编写单元测试

安装

通过vue-cli创建模板脚手架时,可以选择是否启用单元测试,并且选择单元测试框架,这样Vue就帮助我们自动配置好了Jest

#1.运行命令,创建vue项目
vue create [project-name]

#2.选择"Manually select features" 和 "Unit Testing",以及 "Jest" 作为测试运行器。

#3. 安装完成,cd 进入项目目录中并运行
npm run test:unit

运行成功之后可以看到
在这里插入图片描述

demo介绍

在这里插入图片描述

为什么以spec.js命名

spec是specification(基准)的缩写,vue-test-uitls会默认找tests/unit下面的所有以spec后缀命名的js文件,跑文件里的测试脚本

单元测试的三个步骤

  1. 安排(Arrange):为测试做好设置。在我们的用例中,是渲染了组件
  2. 行动(Act):对系统执行操作
  3. 断言(Assert):确保真实的结果匹配你的期望,我们需要断言以确保组件运行正确(断言就是比较,判断正不正确,1+1是不是等于2,就是一个最简单的断言)
import { shallowMount } from "@vue/test-utils"
import FormSubmitter from "@/components/FormSubmitter.vue"
 
describe("FormSubmitter", () => {
  it("reveals a notification when submitted", async () => {
    //安排
    const wrapper = shallowMount(FormSubmitter) 
 
    //行动
    wrapper.find("[data-username]").setValue("alice")
    wrapper.find("form").trigger("submit.prevent")
    await wrapper.vm.$nextTick()
 
    //断言
    expect(wrapper.find(".message").text())
      .toBe("Thank you for your submission, alice.")
  })
})

上面代码中的describe块称为“测试套件”,表示一组相关的测试。它是一个函数,第一个参数是测试套件的名称,第二个参数是实际执行的函数,分组让测试用例代码结构化,易于维护

it块称为“测试用例”,表示一个单独的测试,是测试的最小单位

expect是断言,它接受一个参数就是运行测试内容的结果,返回一个对象,这个对象来调用匹配器(toBe) ,匹配器的参数就是我们的预期结果,这样就可以对结果和预期进行对比了,也就可以判断对不对了,比如expect(1+1).toBe(2)

Vue 组件单元测试的一般思路:渲染这个组件,然后断言这些标签是否匹配组件的状态。

测试Props

//SubmitButton.vue
<template>
  <div>
    <span v-if="isAdmin">Admin Privileges</span>
    <span v-else>Not Authorized</span>
    <button>{{ msg }}</button>
  </div>
</template>

<script>
    export default {
        name: "SubmitButton",
        props: {
            msg: {
                type: String,
                required: true
            },
            isAdmin: {
                type: Boolean,
                default: false
            }
        }
    }
</script>

<style scoped>
</style>


//SubmitButton.spec.js
import SubmitButton from "../../src/components/SubmitButton";
import {shallowMount} from "@vue/test-utils";

const msg = 'submit';
const factory = (propsData)=>{
    return shallowMount(SubmitButton,{
        //测试从父组件中接受属性(props)的组件
        propsData:{
            msg,
            ...propsData
        }
    })
}

describe('does not have admin privileges', () => {
    it('renders a message', () => {

        const wrapper = factory()

       expect(wrapper.find("span").text()).toBe('Not Authorized')
       expect(wrapper.find("button").text()).toBe('submit')
    })
})

describe('has admin privileges', () => {
    it('renders a message', () => {

        const wrapper = factory({isAdmin: true})

        expect(wrapper.find("span").text()).toBe('Admin Privileges')
        expect(wrapper.find("button").text()).toBe('submit')
    })
})

参考

2019年最流行的五大JavaScript自动化测试框架

https://vue-test-utils.vuejs.org/zh/

vue测试指南

Jest单元测试入门

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

前端自动化测试——vue单元测试vue-test-utils 的相关文章

  • Android导出aar时嵌套引用的那些坑

    http www jianshu com p 7a532de0b111 最近写了个Android SDK工程 在代码 测试统统完成后 居然在导出的一步折腾了两三天 在此总结下查找资料的过程和结果 引以借鉴 首先 这次趟坑解决了以下问题 导出
  • 替换word中手动换行(软回车)为段落标记(硬回车)

    在字处理软件中 由Enter键按下去导致一行文字换行的叫硬回车 程序自动换行的叫做软回车 软回车是用 Shift Enter 产生的 它换行 但是并不换段 即前后两段文字在 Word 中属于同一 段 word中遇到网页粘贴过来的内容会有大量
  • Unity背景移动特效

    每日一句 嘴角上扬的时候 任何事物都变得可爱起来了 第一步 确保所要滚动的图像 Wrap Made Repeat 第二步 画布下滚动图像使用 Raw Image组件 可以访问UV 第三步 创建脚本ScrollControl挂载在滚动图像上

随机推荐

  • 增强型pmos电路符号_MOS管:管脚判定与符号画法

    MOS管是我们在电路设计中经常用的一种无源器件 下面介绍下MOS管在原理图 PCB以及实物PCBA上如何辨别其各个管脚 方便调试 管脚判定 1 MOS管GSD在原理图和PCB上怎样判别 G极 gate 栅极 不用说比较好认 封装上左下角为G
  • 【EMC笔试题】N个整数中找出三个数,使其和的绝对值最小

    题目描述 给定包含N个数的无序数组S 可能包含负数 0 正数 求三个数A B C 使其和的绝对值最小 例如 S 9 0 1 3 6 A 9 B 3 C 6 MIN 0 算法解析 解法一 枚举3个数 O N N N 解法二 对S排序后枚举其中
  • Java中如何实现动态代理

    想要实现Java中的动态代理首先应 动态生成接口实现类 interface 接口不能实例化 但是 interface 类型的引用 可以指向任何一个实现类对象实例 但前提是 在编译期必须存在该接口的实现类 如果在编译期无法编写或提供实现类 而
  • 【深度学习】利用tensorflow2.0卷积神经网络进行卫星图片分类实例操作详解

    本文的应用场景是对于卫星图片数据的分类 图片总共1400张 分为airplane和lake两类 也就是一个二分类的问题 所有的图片已经分别放置在2 class文件夹下的两个子文件夹中 下面将从这个实例的详细拆解中 理解tensorflow2
  • spark+项目总结

    做项目基本流程 1 梳理数据流程 2 解决关键性问题 3 串联整个流程过程即标准化以及正式上线 解决关键性问题 对比差异点 数据的文件组织形式不同 数据的格式不同 相同点 数据流程一样 数据目标也是一样 曝光 Exposure 广告领域专业
  • python读写文本老是报错?codecs模块统一编码 一行代码搞定py字符读写

    在python程序中 经常要用到字符文本的读和写 用py自带的 读read 写write 定义字符编码比较麻烦 而用第三方 codecs 模块 在读写字符文本时 可以指定字符编码 就好用很多 下面 我用 codecs 模块 自己编写了一个d
  • 强化学习笔记-13 Policy Gradient Methods

    强化学习算法主要在于学习最优的决策 到目前为止 我们所讨论的决策选择都是通过价值预估函数来间接选择的 本节讨论的是通过一个参数化决策模型来直接根据状态选择动作 而不是根据价值预估函数来间接选择 我们可以定义如下Policy Gradient
  • 2013电商“三国杀”

    2013电商 三国杀 本周 DCCI发布了 Forecast2013 中国电子商务蓝皮书 蓝皮书预测 2013年 淘宝 京东和腾讯将成为电商三甲 纵观中国电商的2012年 高调的京东 霸气的淘宝和默默耕耘的腾讯 似乎正在勾画着未来中国电商行
  • python time.sleep(t) t为秒

    睡眠5秒 import time time sleep 5
  • location.href 与 location.search

    document location href 返回完整的 URL 如 http www cftea com foo asp p 1 引用 location search是从当前URL的 号开始的字符串 如 http www 51js com
  • 《计算机视觉中的多视图几何》笔记(2)

    2 Projective Geometry and Transformations of 2D 本章主要介绍本书必要的几何知识与符号 文章目录 2 Projective Geometry and Transformations of 2D
  • 元素和小于等于阈值的正方形的最大边长

    LeetCode 1292 元素和小于等于阈值的正方形的最大边长 给你一个大小为 m x n 的矩阵 mat 和一个整数阈值 threshold 请你返回元素总和小于或等于阈值的正方形区域的最大边长 如果没有这样的正方形区域 则返回 0 示
  • QT 信号发送多个参数

    你可以把多个参数包装为一个类发送 实测是可以的
  • DBUS及常用接口介绍

    1 概述 1 1 DBUS概述 DBUS是一种高级的进程间通信机制 DBUS支持进程间一对一和多对多的对等通信 在多对多的通讯时 需要后台进程的角色去分转消息 当一个进程发消息给另外一个进程时 先发消息到后台进程 再通过后台进程将信息转发到
  • Caused by: java.lang.ClassNotFoundException: org.springframework.core.KotlinDetector

    Exception in thread main java lang IllegalArgumentException Cannot instantiate interface org springframework context App
  • win下从NUMA节点分配内存

    微软官网链接 https docs microsoft com zh cn windows win32 memory allocating memory from a numa node redirectedfrom MSDN 示例代码 d
  • Java高级教程

    Java高级教程 Java11文档 Java数据结构 Java工具包提供了强大的数据结构 在Java中的数据结构主要包括以下几种接口和类 枚举 Enumeration 位集合 BitSet 向量 Vector 栈 Stack 字典 Dict
  • Error loading workspace: You are outside of a module and outside of $GOPATH/src. If you are using mo

    1 描述 如果你使用vsCode去编译 go 项目的时候 出现这个错误 那么并不是你的go moudle 除了问题 同时你会发现执行Run Code也是执行失败的 2 原因 你的工作区默认是项目根目录 但你单开的文件并不是项目根目录 3 解
  • lvgl8.2 img 图片显示

    1 lvgl 图片显示源 为了提供良好的图片显示灵活性 所以显示图像的来源可以是以下三种 代码中的一个变量 一个带有像素颜色数据的 C 数组 存储在外部的文件 比如 SD 卡 带有符号的文本 2 内部图片 对于源码内部图片 将图片转换为图片
  • 前端自动化测试——vue单元测试vue-test-utils

    自动化测试分类 单元测试 单元测试 unit testing 是指对软件中的最小可测试单元进行检查和验证 简单来说 单元就是人为规定的最小的被测功能模块 可能是一个单一函数或方法 一个完整的组件或类 单元测试是最小巧也是最简单的测试 它们通