Vue Test Utils前端单元测试

news2024/10/5 17:22:13

含义

单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。在提供了经过测试的单元的情况下,系统集成过程将会大大地简化。

流行框架

Mocha (https://mochajs.cn/)、Jest (https://www.jestjs.cn/)在这里插入图片描述
Mocha + Chai 方式
Mocha 需要引入 chai 或则其他断言库去断言, 如果你需要查看覆盖率报告你还需要安装 nyc 或者其他覆盖率工具
./test/sum.test.js

const { expect, assert } = require('chai');
const sum = require('../sum');

describe('sum', function() {
  it('adds 1 + 2 to equal 3', () => {
    assert(sum(1, 2) === 3);
  });
});

Jest 方式
Jest 默认支持断言,同时默认支持覆盖率测试
./test/sum.test.js

const sum = require('./sum');

describe('sum function test', () => {
  it('sum(1, 2) === 3', () => {
    expect(sum(1, 2)).toBe(3);
  });
  
  // 这里 test 和 it 没有明显区别,it 是指: it should xxx, test 是指 test xxx
  test('sum(1, 2) === 3', () => {
    expect(sum(1, 2)).toBe(3);
  });
})

可见无论是受欢迎度和写法上,Jest 都有很大的优势,因此推荐使用开箱即用的 Jest

Vue Test Utils

Vue.js 官方的单元测试实用工具库。
提供特定的方法,在隔离的环境下,进行组件的挂载,以及一系列的测试。被挂载的组件会返回到一个包裹器内,而包裹器会暴露很多封装、遍历和查询其内部的 Vue 组件实例的便捷的方法。

Vue Test Utils 使用

方式一:使用 Vue CLI 创建项目的时候。
方式二:在一个已有的 Vue CLI 创建的项目中配置 Jest:vue add unit-jest

以方式一为例:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

语法:

关键字:

mount()与shallowMount():

mount()会将整个组件及其所有子组件都挂载到DOM中,包括所有子组件的模板和逻辑。这意味着,如果您的组件有许多嵌套的子组件,使用mount()可能会导致渲染时间变慢,测试速度变慢。同时,如果您的组件有一些依赖于其他组件的逻辑,使用mount()可能会导致这些依赖组件的逻辑也被执行,从而增加测试复杂度和维护成本。

相比之下,shallowMount()仅将当前组件挂载到DOM中,而不会挂载其子组件。这意味着,如果您只需要测试当前组件的逻辑,或者您的组件有许多嵌套的子组件,使用shallowMount()可能更加高效。

在这里插入图片描述
在这里插入图片描述

Wrapper包裹器

Wrapper:Wrapper 是一个包括了一个挂载组件或 vnode,以及测试该组件或 vnode 的方法。
Wrapper.vm:这是该 Vue 实例。你可以通过 wrapper.vm 访问一个实例所有的方法和属性。
Wrapper.classes:返回是否拥有该class的dom或者类名数组。
Wrapper.find:返回第一个满足条件的dom。
Wrapper.findAll:返回所有满足条件的dom。===>可以搭配at()使用
Wrapper.html:返回html字符串。
Wrapper.text:返回内容字符串。
Wrapper.setData:设置该组件的初始data数据。
Wrapper.setProps:设置该组件的初始props数据。
Wrapper.trigger:用来触发事件。

describe()

创建一个分组,可以在这里面编写相应的测试计划。

It()

It 断言 他有两个参数 第一个是字符串 一般用于说明测试组件的那个内容 ,
第二个参数为一个函数 里面用于编写判断,当判断错误时可以精准的查找到错误位置

expect()

Jest为我们提供了expect函数用来包装被测试的方法并返回一个对象,
该对象中包含一系列的匹配器来让我们更方便的进行断言,上面的toBe函数即为一个匹配器

匹配器

toBe() 精准匹配toBe和toEqual同样适用于数字。
toBeNull只匹配null
toBeUndefined只匹配undefined
toBeDefine与toBeUndefined相反
toBeTruthy匹配任何if语句为真====>存在类型转换
toBeFalsy匹配任何if语句为假====>存在类型转换
expect(fn).toHaveBeenCalled() // 判断函数是否被调用
expect(fn).toHaveBeenCalledTimes(number) // 判断函数被调用次数
expect(['one','two']).toContain('one'); // 含有某个元素

toBeGreaterThan()大于
toBeGreaterThanOrEqual()大于等于
toBeLessThan()小于
toBeLessThanOrEqual()小于等于

toMatch()测试字符串,传递的参数是正则表达式

快照功能toMatchSnapshot()

it('test toMatchSnapshot ', async () => {
    await wrapper.vm.$nextTick(); // 同步获取dom元素渲染
    expect(wrapper.element).toMatchSnapshot();
})
首先在快照之前 使用nextTick是为了防有些dom元素没有渲染完成,就生成快照,会导致样式有问题
使用快照功能 可以在tests文件下生成__snapshots__文件夹,
在__snapshots__目录中产生一个xxx.test.js.snap文件 会将所测试的组件生成html结构,
方便观察元素是否成功渲染

快照过时:
在这里插入图片描述

事件测试

Trigger()

it('button click should increment the count', () => {
    wrapper.setData({
      count: 1
    })
    const button = wrapper.find('button')
    button.trigger('click')
    expect(wrapper.vm.count).toBe(2)
})

emitted()

test('msg should be changed by Emit', () => {
    const button = wrapper.findAll('button').at(1)
    button.trigger('click')
    expect(wrapper.emitted()).toHaveProperty('reset')
})

方法测试

import  { addNum, getUuid }   from '@/utils/uuid.js';
describe('测试 uuid', () => {
  it("test uuid 方法addNum", async()=>{
      const result = addNum(1,2);
      console.log(result);
      expect(result).toBe(3);
  });

  it("test uuid 方法getUuid", async()=>{
    const testContent = getUuid();
    expect(testContent).toMatch(/^[0-9a-zA-Z]{8}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{12}$/i);
 });
});
只执行某一文件:npm run test:unit --grep example.spec.js
只执行某一目录下的所有文件:npm run test:unit --grep unit
输出完整的测试报告:npm run test:unit -- --coverage

在这里插入图片描述
在这里插入图片描述

  1. Statements: 代码中被测试覆盖的语句比例为90.47%,共有2187个语句中的19个未被覆盖。
  2. Branches: 代码中被测试覆盖的分支比例为5.5%,共有81个分支中的7个未被覆盖。
  3. Functions: 代码中被测试覆盖的函数比例为100%,共有5个函数中的0个未被覆盖。
  4. Lines: 代码中被测试覆盖的行数比例为95%,共有20行中的1行未被覆盖。

接口测试(Axios Mock Adapter)

Vue Test Utils 是一个用于测试 Vue 组件的 JavaScript 库,主要用于测试组件的行为和状态。Vue Test Utils 并不是一个用于测试接口的库,但是我们可以使用其他的 JavaScript 测试库来测试接口,例如 Jest、Mocha 等。

在使用 Jest 或 Mocha 进行接口测试时,我们可以使用一些工具来模拟 HTTP 请求和响应,例如 Axios Mock Adapter、Fetch Mock 等。这些工具可以帮助我们模拟接口请求和响应,并验证我们的代码是否正确处理了它们。

下面是一个使用 Jest 和 Axios Mock Adapter 进行接口测试的示例:

javascript
import axios from 'axios';
import MockAdapter from 'axios-mock-adapter';

describe('example API test suite', () => {
  let mockAxios;

  beforeEach(() => {
    mockAxios = new MockAdapter(axios);
  });

  afterEach(() => {
    mockAxios.reset();
  });

  it('should handle a successful request', async () => {
    const responseData = { data: 'example data' };
    mockAxios.onGet('/example').reply(200, responseData);

    const response = await axios.get('/example');

    expect(response.status).toEqual(200);
    expect(response.data).toEqual(responseData);
  });

  it('should handle a failed request', async () => {
    mockAxios.onGet('/example').reply(500);

    await expect(axios.get('/example')).rejects.toThrow();
  });
});
在这个示例中,我们使用 Axios Mock Adapter 模拟了一个 GET 请求,并分别测试了请求成功和请求失败的情况。我们使用 Jest 的 expect 函数来验证请求的结果是否符合预期。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/514633.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

asp.net web api 后端服务器在调试时跨域问题的解决方案

跨域在发布时,在iis设置中 https://www.cnblogs.com/babietongtianta/p/6488985.html 在开发调试时,program.cs中添加 和各种方法,都不可以。 后来在iisexpress中设置,解决了。 在右下角iisexpress 右键 双击打开applicationho…

PCL学习十:Segmentation-分割

参考引用 Point Cloud Library黑马机器人 | PCL-3D点云 PCL点云库学习笔记(文章链接汇总) 1. 引言 点云分割是根据空间、几何和纹理等特征对点云进行划分,使得同一划分区域内的点云拥有相似的特征。点云的有效分割往往是许多应用的前提&#…

【OAI】部署5GSA独立组网网络切片例程及例程解析

文章目录 摘要引言关键技术介绍5G核心网核心网网元功能 网络切片OAIDocker官方例程详解整体介绍具体详解网络切片架构部署概览与说明1-41.预先准备5.部署OAI 5G核心网6.获取基站仿真docker镜像7.部署基站仿真8.通信测试9.分析结果10. 使用多切片的UE11. 解除部署11.1解除RAN部署…

面了一个4年经验的测试员,一问三不知还反过来怼我?

金三银四期间,我们公司也开始大量招人了,我这次是公司招聘的面试官之一,主要负责一些技术上的考核,这段时间还真让我碰到了不少奇葩求职者 昨天公司的HR小席刚跟我吐槽:这几个星期没有哪天不加班的!各种招…

(8)Qt---数据库

目录 1. Qt数据库简介 2. 连接与关闭 3. 建表 4. 增删改 5. 查询 6.银行管理系统程序代码(包含增删改查) 1. Qt数据库简介 Qt只是作为媒介去操作数据库,本身不具备数据库的功能,因此除了Qt以外,还需要在计算机中安装对应的数据库软件&#xf…

Windows 11 支持安卓应用

更改系统国家 打开windows自带的搜索,找到更改国家或地区。把地区改成美国。 开启电脑VT 不同电脑开启方式不一样,请搜索:xxx进入BIOS和xxx开启VT打开你电脑的VT。 安装子系统 电脑打开Microsoft Store直接搜是搜不到的, 点…

C/C++的内存管理

C/C的内存管理 1.C/C的内存分布2.C语言的动态内存管理方式:malloc/calloc/realloc/free3. C内存管理方式3.1. new/delete操作内置类型3.2.new和delete操作自定义类型 4.operator new与operator delete函数4.1 operator new与operator delete函数 5.new和delete的实现…

一次查找分子级Bug的经历,过程太酸爽了

“Debugging is like trying to find a needle in a haystack, except the needle is also made of hay.” Debug调试就像是在大片的干草堆中找针一样,只不过针也是由干草制成的。 在软件开发的世界里,偶尔会出现一些非常隐蔽的 Bug,这时候工…

数据结构之“树”——二叉树、红黑树、B树、B+树、B*树

这篇文章主要简单总结下二叉树、红黑树、B树、B树、B*树的基本结构和原理。 一、二叉树 二叉树就是度不超过2的树(每个结点最多有两个子结点)。 二叉树是有序树(二叉排序树),若将其左右子树颠倒,则成为另一棵不同的二叉树。 二叉…

MYSQL跨服务器访问数据库 :FEDERATED存储引擎

当想从不同服务器的数据库获取数据时,我们会想到oracle的DBLink;sqlserver的链接访问(傻瓜式操作,按照步骤配置即可),那么mysql有没有跨服务器访问的功能呢?答案自然是有的。 博主这就分享给大家…

语音识别-置信度

1.CONFIDENCE ESTIMATION FOR ATTENTION-BASED SEQUENCE-TO-SEQUENCE MODELS FOR SPEECH RECOGNITION : https://arxiv.org/pdf/2010.11428.pdf 1.引言 1).置信度的目的: 在半监督学习和主动学习中,选择较高置信度的数据来进一步提高ASR性能…

JVM学习04:类加载与字节码技术

JVM学习04:类加载与字节码技术 1、类文件结构 一个简单的 HelloWorld.java: //HelloWorld示例 public class HelloWorld {public static void main(String[] args) {System.out.println("hello world");} }执行javac -parameters -d . Hello…

生物识别技术是否会对安全产生挑战?

生物识别技术通过人体独特的生物特征来识别个人身份,包括指纹、虹膜、面部识别、声纹识别等技术。这些技术可以在安全领域得到广泛应用,例如入境控制、安全认证、金融交易等方面。但是,生物识别技术也可能带来安全挑战,具体如下: 数据泄露:生物识别技术需要收集个人生物特…

老杨说运维 | 如何成为卓有成效的管理者(关于AIOps的几点思考)

1966年,管理学领域被誉为“大师中的大师”的彼得德鲁克出版了日后被无数次再版的经典作品——《卓有成效的管理者》。 在书中他提到:管理者的使命就是“卓有成效”,但是卓有成效并非天分赋予,而是可以通过后天学习和实践获取的能力…

python 反编译

步骤1: (前置)下载pyinstxtractor.py ①将pyinstxtractor.py文件移动到想要解包的文件目录下 ②并在当前目录下输入cmd打开终端,执行>python pyinstxtractor.py 待反编译.exe eg:E:\my_decode>python pyinstxtractor.py …

单向散列函数——获取消息的 “指纹”

目录 什么是单向散列函数散列算法的特征散列算法的用途散列算法的分类密码学哈希和非密码学哈希不安全的密码学哈希算法主流的密码学哈希算法 SHA256散列算法(SHA2算法)SHA256算法过程SM3散列算法 应该使用哪种单向散列函数呢 什么是单向散列函数 单向散…

【920信号与系统笔记】第二章 连续时间系统的时域分析

连续时间系统的时域分析 2.1引言综述n阶线性系统1.数学模型2.解法古典解法近代时域法(卷积法、算子法) 叠加积分法1.本质2. 待解决问题 2.2系统方程的算子表示法算子及其运算规则1.微分算子和积分算子2.运算规则3.电容和电感的伏安特性 转移算子1.定义2.…

20230508MTCNN1

多目标检测思路 单目标检测:图片 输入到 模型,模型输出 4个值 为什么模型只能检测单个目标? 因为模型 固定输出4个值,表示 一个目标 如何实现多目标检测?思路:一个一个地数 模型要能够 认识目标&#xff…

LiangGaRy-学习笔记-Day12

1、作业回顾 1.1、判断磁盘利用率 要求: 判断磁盘的使用率,如果超过了90%就警告 [rootNode1 sh]# vim disk_check.sh #!/bin/bash #Author By LiangGaRy #2023年5月9日 #Usage:检测硬盘的使用率 ########################################### #定义一…

蓝奥声核心技术分享——用电插座的安全保护技术(安全计量插座)

1.技术背景 用电插座的安全保护技术主要针对在用电负载接入接出(即插拔)用电插座的过程,解决瞬态异常监控及安全保护问题。该项技术涉及物联网智能硬件设备与测控技术领域,尤其涉及电能信号监测与用电安全监控的技术领域。 随着…