如何使用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语…

基于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 …

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;可以快…

Git基础

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

Vue-2.1scoped样式冲突

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

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

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

H5逆向之远程RPC

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

AVS3:DMVR

AVS3中引入了解码端运动矢量修正&#xff08;DMVR,Decoder side Motion Vector Refinement&#xff09;技术&#xff0c;AVS3中的DMVR技术和G.266/VVC类似&#xff0c;它可以在解码端生成运动参数从而减少传输运动参数的码率开销。它的基本思想是将skip/direct模式生成的前后向…

Swagger使用详解

目录 一、简介 二、SwaggerTest项目搭建 1. pom.xml 2. entity类 3. controller层 三、基本使用 1. 导入相关依赖 2. 编写配置文件 2.1 配置基本信息 2.2 配置接口信息 2.3 配置分组信息 2.3.1 分组名修改 2.3.2 设置多个分组 四、常用注解使用 1. ApiModel 2.A…

IDEA的使用(三)Debug(断点调试)(IntelliJ IDEA 2022.1.3版本)

编程过程中如果出现错误&#xff0c;需要查找和定位错误时&#xff0c;借助程序调试可以快速查找错误。 编写好程序后&#xff0c;可能出现的情况&#xff1a; 1.没有bug。 使用Debug的情况&#xff1a; 2.运行后&#xff0c;出现错误或者异常信息&#xff0c;但是通过日志文件…

go的面向对象学习

文章目录 面向对象编程(上)1.问题与解决思路2.结构体1》Golang语言面向对象编程说明2》结构体与结构体变量(实例/对象)的关系的示意图3》入门案例(using struct to solve the problem of cat growing) 3.结构体的具体应用4.创建结构体变量和访问结构体字段5.struct类型的内存分…

vue3 组件v-model绑定props里的值,修改组件的值要触发回调

很早之前就写了&#xff0c;一直没写篇博客记录下 <select v-model"typeVal" />const emit defineEmits([update:type]); const props defineProps({type: { type: String, default: }, });const typeVal computed({get() {return props.type;},set(value…

Docker-compose创建LNMP服务并运行Wordpress网站平台

一、部署过程 1.安装Docker #关闭防火墙 systemctl stop firewalld.service setenforce 0#安装依赖包 yum install -y yum-utils device-mapper-persistent-data lvm2 #设置阿里云镜像源 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/d…