如何使用jest

最近在研究单元测试,虽说前端如果不是大且的项目不必要加,但至少得会,因此花了些时间研究,以下是我总结jest的使用。

jest是什么?

Jest是 Facebook 的一套开源的 JavaScript 测试框架, 它自动集成了断言、JSDom、覆盖率报告等开发者所需要的所有测试工具,是一款几乎零配置的测试框架。它能支持很多框架,比如 Babel、TypeScript、Node、React、Angular、Vue 等诸多框架。

vue中的jest的安装

执行安装命令

vue中使用jest,其实并没有我们想象的那么复杂,之前我使用jest的时候,查了较多资料,也配置了许多设置,繁忙且繁琐,直到最后我才发现,原来仅仅只需要执行一句指令即可。

vue add @vue/cli-plugin-unit-jest

这个命令会帮我们把相关的配置都配好,相关的依赖都装好,还会帮我们生成一个jest.config.js文件。

jest中常用的一些配置项的介绍

module.exports = {"moduleFileExtensions": [ //不需要配置"js","json",// 告诉 Jest 处理 `*.vue` 文件"vue"],testMatch: [ //test文件所在位置'**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)'],"transform": {  //不需要配置// 用 `vue-jest` 处理 `*.vue` 文件".*\\.(vue)$": "<rootDir>/node_modules/vue-jest",// 用 `babel-jest` 处理 js"^.+\\.js$": "babel-jest"},"moduleNameMapper": { //不需要配置"^@/(.*)$": "<rootDir>/src/$1"},"collectCoverage": true,  //是否创建报告"collectCoverageFrom": ["**/*.{js,vue}", "!**/node_modules/**"], //创建报告的文件来源"coverageReporters": ["html", "text-summary"]   //报告的格式                "coveragePathIgnorePatterns":"[]"   //生成报告需要忽略的文件,默认值为 node_modules    "globals":{ //配置全局变量,此处我配置了一个全局变量VUE_APP_DATA,也可以在setup file中配置,如下说的lodash      "VUE_APP_DATA": {siteENV:'DEV'}} setupFiles: ['<rootDir>/src/jest-setup.js'] //启动jest需要的文件
};

在项目目录中创建tests文件,再创建unit文件,在其中文件命名的话,就以 xxx.spec.js命名(这个执行命令的时候,已经给我们创建了)

import { shallowMount } from '@vue/test-utils'
import explame from '@/components/Explame'describe('Explame .vue', () => {it('renders props.msg when passed', () => {const msg = 'new message'const wrapper = shallowMount(Explame , {propsData: { msg }})expect(wrapper.text()).toMatch(msg)})
})

在package.json 中添加启动命令,然后通过在控制台执行npm run test:unit ,进行测试

Scripts配置:

"test:unit": "vue-cli-service test:unit"

jest的基本语法规则

Jest 支持三种方式写测试代码

  • .spec.js
  • .test.js
  • 放在 __tests__文件夹下

测试结构

  • describe: 将几个相关的测试放到一个组中,非必须
  • test :(别名it)测试用例,是测试的最小单位
  • expect:提供很多的matcher 来判定你的方法返回值是否符合特定条件
describe('add的方法测试',()=>{test('2+3应该等于5',()=>{expect(add(2,3)).toBe(5)})})

mock方法和处理

  • Jest的mock方式 (Jest.fn()、Jest.spyOn()、Jest.mock())
  • 预处理和后处理
    • beforeAll / afterAll : 对测试文件中所有的用例开始前/ 后 进行统一的预处理
    • beforeEach/ afterEach : 在每个用例开始前 / 后 进行预处理

覆盖率指标

在package.json中 设置 --coverage 即可 测试覆盖率

 "test:unit": "vue-cli-service test:unit --coverage"

image.png

  • %stmts是语句覆盖率(statement coverage):是不是每个语句都执行了?
  • %Branch分支覆盖率(branch coverage):是不是每个if代码块都执行了?
  • %Funcs函数覆盖率(function coverage):是不是每个函数都调用了?
  • %Lines行覆盖率(line coverage):是不是每一行都执行了?

配置好后,会生成一个coverage文件,然后打开里面的index.html 里面会有详细的信息展示

三种颜色分别代表不同比例的覆盖率(<50%红色,50%~80%灰色, ≥80%绿色)

旁边显示的1x代表执行的次数

好的测试覆盖率标准:80%以下不及格,90%以上可以使用,95%以上优秀

常用的方法

  • –mount: 创建一个包含被挂载和渲染的 Vue 组件的 wrapper,它仅仅挂载当前实例

  • —shallowMount:和 mount 一样,创建一个包含被挂载和渲染的 Vue 组件的 Wrapper,只挂载一个组件而不渲染其子组件 (即保留它们的存根),这个方法可以保证你关心的组件在渲染时没有同时将其子组件渲染,避免了子组件可能带来的副作用(比如Http请求等)

  • —shallowMount和mount的区别:在文档中描述为"不同的是被存根的子组件",大白话就是shallowMount不会加载子组件,不会被子组件的行为属性影响该组件。

  • —单元测试的重点在"单元"二字,而不是"测试",想测试子组件再为子组件写对应的测试代码即可

  • —Wrapper:常见的有一下几种方法

  • —Wrapper:常见的有一下几种方法

    • Wrapper:Wrapper 是一个包括了一个挂载组件或 vnode,以及测试该组件或 vnode 的方法。
    • Wrapper.vm:这是该 Vue 实例。你可以通过 wrapper.vm 访问一个实例所有的方法和属性。
    • Wrapper.classes: 返回是否拥有该class的dom或者类名数组。
    • Wrapper.find:返回第一个满足条件的dom。
    • Wrapper.findAll:返回所有满足条件的dom。
    • Wrapper.html:返回html字符串。
    • Wrapper.text:返回内容字符串。
    • Wrapper.setData:设置该组件的初始data数据。
      • Wrapper.setProps:设置该组件的初始props数据。 (这是使用了,但没有效果)
    • Wrapper.trigger:用来触发事件。
<template><div class="jest"><div class="name">{{name}}</div><div class="name">{{name}}{{text}}</div><div class="text" @click="add">{{text}}</div></div>
</template>
<script src="./script.js">
export default {name:"Foo",props:{name:{type: String,default: '啦啦啦'}},data() {return {text: 123}},methods:{add(){this.text += 1}}
}
</script>

开始测试

import { shallowMount } from '@vue/test-utils'
import Foo from './Foo.vue'describe('Foo', () => {const wrapper = shallowMount(Foo)console.log(Wrapper.classes())	//['jest']console.log(Wrapper.classes('jest'))	//trueconsole.log(Wrapper.find('.name').text())	// 切记如果是类的话,要加点  : 啦啦console.log(Wrapper.findAll('.name'))	//返回dom数组  WrapperArray { selector: '.name' }console.log(Wrapper.findAll('.name').at(0))	//取dom数组中的第一个Wrapper.setData({text : 3})   //  设置一个值 console.log(Wrapper.vm.text)	// 3Wrapper.setProps({name : "拉拉"})console.log(Wrapper.vm.name)	//这个结果仍 为 啦啦啦Wrapper.find('.text').trigger("click")console.log(Wrapper.vm.text) // 4
})

也可以初始化某些数据

import { shallowMount } from '@vue/test-utils'
import Foo from './Foo.vue'const wrapper = shallowMount(Foo,{data() {return {bar: 'lala'}},propsData:{message: 'dd'},mocks: {$route: {query: {aaa: '1',}},$router: {push: jest.fn(),replace: jest.fn(),}} 
})

Jest-Api(使用不同匹配器可以测试输入输出的值是否符合预期)toBe:判断是否相等

  • toBeNull:判断是否为null
  • toBeUndefined:判断是否为undefined
  • toBeDefined:与上相反
  • toBeNaN:判断是否为NaN
  • toBeTruthy:判断是否为true
  • toBeFalsy:判断是否为false
  • toContain:数组用,检测是否包含
  • toHaveLength:数组用,检测数组长度
  • toEqual:对象用,检测是否相等
  • toThrow:异常匹配

describe('Foo', () => {expect(2 + 2).toBe(4)expect(null).toBeNull()expect(undefined).toBeUndefined()let a = 1;expect(a).toBeDefined()a = 'ada';expect(a).toBeNaN()a = true;expect(a).toBeTruthy()a = false;expect(a).toBeFalsy()a  = [1,2,3];expect(a).toContain(2)expect(a).toHaveLength(3)a = {a:1};expect(a).toEqual({a:1})
})

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

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

相关文章

【重拾C语言】六、批量数据组织(一)数组(数组类型、声明与操作、多维数组;典例:杨辉三角、矩阵乘积、消去法)

目录 前言 六、批量数据组织——数组 6.1 成绩统计——数组类型 6.1.1 数组类型 6.1.2 数组声明与操作 6.1.3 成绩统计 6.2 统计多科成绩——多维数组 6.3 程序设计实例 6.3.1 杨辉三角形 6.3.2 矩阵乘积 6.3.3 消去法 6.4 线性表——分类与检索 前言 ChatGPT C语…

Hadoop作业篇(一)

一、选择题 1. 以下哪一项不属于Hadoop可以运行的模式__C____。 A. 单机&#xff08;本地&#xff09;模式 B. 伪分布式模式 C. 互联模式 D. 分布式模式 C. 互联模式 不属于Hadoop可以运行的模式。 Hadoop主要有四种运行模式&#xff1a; A. 单机&#xff08;本地&#xf…

基于SpringBoot的桂林旅游景点导游平台

目录 前言 一、技术栈 二、系统功能介绍 用户信息管理 景点类型管理 景点信息管理 线路推荐管理 用户注册 线路推荐 论坛交流 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实…

FreeRTOS学习笔记(一)

一、基础知识思维导图 vtaskdelay函数会开启中断&#xff0c;所以在临界区不能用vtaskdelay 二、任务的创建与删除 2.1、任务的动态创建与删除 ........#define START_TASK_PRIO 1 #define START_TASK_STACK_SIZE 128 TaskHandle_t start_task_handler; void …

UNIQUE VISION Programming Contest 2023 Autumn(AtCoder Beginner Contest 323)

A - Weak Beats 链接 : A - Weak Beats 思路 : 模拟即可,如果在偶数位上出现了非0得元素&#xff0c;直接输出"No"后返回即可&#xff0c;循环顺利结束的话&#xff0c;就直接输出"Yes"; 代码 : #include<bits/stdc.h> #define IOS ios::sy…

WebSocket介绍及部署

WebSocket是一种在单个TCP连接上进行全双工通信的协议&#xff0c;其设计的目的是在Web浏览器和Web服务器之间进行实时通信&#xff08;实时Web&#xff09;。 WebSocket协议的优点包括&#xff1a; 1. 更高效的网络利用率&#xff1a;与HTTP相比&#xff0c;WebSocket的握手…

Flutter AI五子棋

前言 在上一篇文章中&#xff0c;讲解了如何实现双人在本地对战的五子棋&#xff0c;但是只有一个人的时候就不太好玩&#xff0c;同时博主也没有把五子棋相关的文章写过瘾。那么这篇文章&#xff0c;我们来实现一个功能更加丰富的五子棋吧&#xff01;在设计五子棋的算法方面&…

docker搭建Jenkins及基本使用

1. 搭建 查询镜像 docker search jenkins下载镜像 docker pull jenkins/jenkins启动容器 #创建文件夹 mkdir -p /home/jenkins_home #权限 chmod 777 /home/jenkins_home #启动Jenkins docker run -d -uroot -p 9095:8080 -p 50000:50000 --name jenkins -v /home/jenkins_home…

【Qt】三种方式实现抽奖小游戏

简介 本文章是基本Qt与C实现一个抽奖小游戏&#xff0c;用到的知识点在此前发布的几篇文章。 下面是跳转链接&#xff1a; 【Qt控件之QLabel】用法及技巧链接&#xff1a; https://blog.csdn.net/MrHHHHHH/article/details/133691441?spm1001.2014.3001.5501 【Qt控件之QPus…

Matlab论文插图绘制模板第118期—进阶气泡图

之前的文章中&#xff0c;分享过Matlab气泡图的绘制模板&#xff1a; 图虽说好看&#xff0c;但有一个缺点&#xff1a;需要手动调节两个图例的位置。 为了解决这一问题&#xff0c;我们不妨结合前段时间分享的紧凑排列多子图的绘制模板&#xff1a; 从而达到自动对齐排列的效…

【版本控制工具一】Git 安装注册及使用

文章目录 一、Git 、Github、Gitee1.1 概述1.2 码云 相对于 github 的优势 二、Github 或 Gitee注册2.1 注册2.2 创建仓库 三、Git下载与安装四、创建本地仓库 一、Git 、Github、Gitee 1.1 概述 Git 是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或小或…

Multi-Grade Deep Learning for Partial Differential Equations

论文阅读&#xff1a;Multi-Grade Deep Learning for Partial Differential Equations with Applications to the Burgers Equation Multi-Grade Deep Learning for Partial Differential Equations with Applications to the Burgers Equation符号定义偏微分方程定义FNN定义PI…

网络流量安全分析-工作组异常

在网络中&#xff0c;工作组异常分析具有重要意义。以下是网络中工作组异常分析的几个关键点&#xff1a; 检测网络攻击&#xff1a;网络中的工作组异常可能是由恶意活动引起的&#xff0c;如网络攻击、病毒感染、黑客入侵等。通过对工作组异常的监控和分析&#xff0c;可以快…

(Qt5Gui.dll)处(位于 xxx.exe 中)引发的异常: 0xC0000005: 读取位置 XXXXXXXX 时发生访问冲突

最新在处理opencv的时候遇到(Qt5Gui.dll)处(位于 xxx.exe 中)引发的异常: 0xC0000005: 读取位置 XXXXXXXX 时发生访问冲突,导致上位机崩溃严重影响开发的效率。 简要代码: void show() {QImage img = QImage(data,width,height,bytePerLine,QImage::Format_RGB888); emit im…

Git基础

1、本地版本控制系统、集中式版本控制系统与分布式版本控制系统 文档&#xff1a; Git - 关于版本控制 1. 本地版本控制系统&#xff08;Local Version Control System&#xff09;&#xff1a; 本地版本控制系统是最简单的版本控制系统&#xff0c;它基于文件的复制…

域名抢注和域名注册

随着互联网的发展&#xff0c;域名已经成为了企业和个人在网络上展示自己的重要标志。如何获得一段好记、易拼写、有意义的域名&#xff0c;是很多人都面临的问题。本文将介绍域名抢注和域名注册的相关内容&#xff0c;并推荐ym.qqmu.com这个可靠的域名注册平台。 一、什么是域…

Vue-2.1scoped样式冲突

默认情况&#xff1a;写在组件中的样式会全局生效->因此很容易造成多个组件之间的样式冲突问题 1.全局样式&#xff1a;默认组件中的样式会作用到全局 2.局部样式&#xff1a;可以给组件加上scoped属性&#xff0c;可以让样式只作用于当前组件 <style scoped> <…

轻松实现时间录入自由!如何在Microsoft Word中轻松插入格式化的日期和时间

在文档中插入当前日期和时间有几个原因。你可能希望将其插入信函或页眉或页脚中。无论是什么原因&#xff0c;Word都可以轻松地将日期和时间插入文档。 如果希望在打开或打印文档时自动更新日期和时间&#xff0c;可以将其作为自动更新的字段插入。该字段也可以随时手动更新。…

springboot项目静态资源映射

1. springboot项目静态资源映射 import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.context.annotation.Bean; import

H5逆向之远程RPC

引言前一讲说过H5 怎么去抓包,逆向分析。其中说到RPC。这一节详细讲一下。有一种情况,JS 比较复杂,混淆的厉害。 这个时候就用到RPC。原理就是,hook web 浏览器,直接调用js 里边的方法。 Node 服务。为什么用到Node 服务,先来看下这架构 Node 对外提供各种接口,外部可以…