单元测试怎么做
单元测试是软件开发中非常重要的一部分,能够确保代码的正确性、可靠性和可维护性。对于 Vue 项目来说,单元测试主要关注的是测试组件及其相关功能是否正常。下面是如何在 Vue 项目中进行单元测试的详细步骤,包括测试框架的选择、测试工具的配置、如何写测试用例等。
1. 选择单元测试框架
在 Vue 项目中,常用的单元测试框架有以下几种:
Jest:Jest 是一个非常流行的 JavaScript 测试框架,适用于 Vue 项目,提供了简单易用的 API,支持快照测试、模拟、异步测试等功能。
Mocha:Mocha 是一个灵活的 JavaScript 测试框架,配合 Chai 断言库和 Sinon 模拟库使用。
Karma:Karma 是一个测试运行器,通常与 Jasmine 配合使用。
2. 安装和配置 Jest
以 Jest 为例,下面是如何在 Vue 项目中安装和配置 Jest 来进行单元测试。
2.1 安装 Jest 和相关依赖
首先,你需要安装 Jest、Vue Test Utils(Vue 的官方测试工具)以及一些配套的依赖:
npm install --save-dev jest vue-jest @vue/test-utils babel-jest
这些依赖的作用是:
jest: Jest 测试框架本身。
vue-jest: 用于处理 .vue 文件,使 Jest 可以理解并测试 Vue 组件。
@vue/test-utils: Vue 官方的测试工具,提供了一些 API 来挂载组件并进行操作。
babel-jest: 让 Jest 支持 Babel 编译,支持 ES6/JSX 语法。
2.2 配置 Jest
在项目根目录下创建一个 jest.config.js 文件,配置 Jest 相关选项:
module.exports = {transform: {'^.+\\.vue$': 'vue-jest', // 处理 .vue 文件'^.+\\.js$': 'babel-jest', // 处理 JavaScript 文件},moduleFileExtensions: ['js', 'vue', 'json'], // 支持的文件扩展名testEnvironment: 'jsdom', // 适用于浏览器环境的测试
};
2.3 配置 Babel
如果你使用了 ES6/JSX 或 Vue 3 特性,需要确保 Babel 配置正常。创建一个 .babelrc 或 babel.config.js 文件:
{"presets": ["@babel/preset-env"]
}
2.4 配置 package.json 中的测试脚本
在 package.json 中添加 Jest 的测试命令:json
{"scripts": {"test": "jest" // 运行 Jest 测试}
}
3. 编写单元测试
3.1 测试 Vue 组件
Vue Test Utils 提供了对 Vue 组件进行单元测试的基本 API。你可以通过 mount() 或 shallowMount() 来挂载组件,并对组件进行断言。
例如,假设有一个简单的 HelloWorld.vue 组件:
<template><div><h1>{{ message }}</h1><button @click="changeMessage">Change Message</button></div>
</template><script>
export default {data() {return {message: 'Hello, World!'};},methods: {changeMessage() {this.message = 'Hello, Vue!';}}
};
</script>
可以使用 Jest 和 Vue Test Utils 来为该组件编写单元测试:
import { shallowMount } from '@vue/test-utils';
import HelloWorld from '@/components/HelloWorld.vue';describe('HelloWorld.vue', () => {it('renders props.message when passed', () => {const wrapper = shallowMount(HelloWorld);expect(wrapper.text()).toContain('Hello, World!');});it('changes message when button is clicked', async () => {const wrapper = shallowMount(HelloWorld);await wrapper.find('button').trigger('click');expect(wrapper.text()).toContain('Hello, Vue!');});
});
3.2 解释代码
shallowMount:Vue Test Utils 提供的一个方法,用于挂载组件并返回一个 wrapper 对象。shallowMount 不会渲染子组件,这样可以提高测试速度。如果需要渲染子组件,可以使用 mount()。
wrapper.text():获取组件渲染后的文本内容。
wrapper.find(‘button’):查找组件中的按钮元素。
trigger(‘click’):模拟按钮的点击事件。
3.3 异步测试
如果组件有异步操作,可以使用 async/await 或 done() 来处理异步逻辑。例如,假设有一个组件发起异步请求:
<template><div><p v-if="message">{{ message }}</p><button @click="fetchMessage">Fetch Message</button></div>
</template><script>
export default {data() {return {message: null,};},methods: {async fetchMessage() {const response = await fetch('https://api.example.com/message');this.message = await response.json();}}
};
</script>
相应的单元测试:
import { shallowMount } from '@vue/test-utils';
import HelloWorld from '@/components/HelloWorld.vue';global.fetch = jest.fn(() =>Promise.resolve({json: () => Promise.resolve('Hello, Async World!'),})
);describe('HelloWorld.vue', () => {it('fetches message when button is clicked', async () => {const wrapper = shallowMount(HelloWorld);await wrapper.find('button').trigger('click');await wrapper.vm.$nextTick(); // 等待 Vue 更新 DOMexpect(wrapper.text()).toContain('Hello, Async World!');});
});
在这个测试中,使用了 jest.fn() 来模拟 fetch 方法的行为,并通过 async/await 等待异步操作完成。
4. 运行单元测试
完成单元测试编写后,可以通过以下命令运行测试:
npm run test
Jest 会自动查找项目中的所有测试文件(默认情况下,测试文件以 .test.js 或 .spec.js 结尾)并执行测试。运行完毕后,Jest 会输出测试结果。
- 断言库
Jest 内置了一些常用的断言方法,如:
expect(value).toBe(expected):严格相等判断
expect(value).toContain(expected):检查字符串或数组中是否包含某个值
expect(value).toBeTruthy():判断值是否为真
expect(value).toHaveBeenCalled():检查函数是否被调用
如果你使用 Mocha + Chai,也可以使用 expect、should、assert 等不同的断言风格。
6. 测试覆盖率
Jest 还可以生成代码覆盖率报告,这对于检测哪些代码没有被测试到非常有帮助。你可以通过添加 --coverage 标志来启用覆盖率报告:
npm run test -- --coverage
- CI/CD 集成
为了确保代码质量,建议将单元测试集成到 CI/CD 流程中。在 GitHub Actions、GitLab CI 或其他 CI 工具中配置测试脚本,可以在每次代码提交或合并时自动运行测试。
总结
Vue 项目的单元测试可以通过 Jest 和 Vue Test Utils 来完成,具体步骤包括:
安装 Jest 和 Vue Test Utils。
配置 Jest 和 Babel,支持 ES6 及 Vue 组件测试。
编写单元测试,使用 shallowMount 或 mount 挂载 Vue 组件,并对组件的输出进行断言。
运行测试,确保组件功能符合预期。
可以配置 CI/CD 流程,自动运行测试,确保每次提交的代码是经过验证的。
相关文章:
单元测试怎么做
单元测试是软件开发中非常重要的一部分,能够确保代码的正确性、可靠性和可维护性。对于 Vue 项目来说,单元测试主要关注的是测试组件及其相关功能是否正常。下面是如何在 Vue 项目中进行单元测试的详细步骤,包括测试框架的选择、测试工具的配…...
移动应用开发 实验二:标准身高计算器
文章目录 准备工作一,创建Android Studio项目二,创建活动模块三,设计用户界面(一)设置页面布局(二)添加标题文本控件(三)设计体重输入框(四)设计性…...
金华迪加现场大屏互动系统 mobile.do.php 任意文件上传漏洞复现
0x01 产品描述: 金华迪加现场大屏互动系统是由金华迪加网络科技有限公司开发的一款专注于增强活动现场互动性的系统。该系统设计用于提供高质量的现场互动体验,支持各种大型活动,如企业年会、产品发布会、展览展示等。其主要功能包…...
使用 pd.ExcelWriter 创建多工作表 Excel 文件的详细教程
with pd.ExcelWriter(...) as writer 可以将多个内容写入一个 Excel 文件中。具体地说,它创建了一个Excel 文件写入器,使得我们可以在一个文件中创建多个工作表(Sheet)。 with pd.ExcelWriter("模型指标和损失值.xlsx")…...
驱动-----dht11温湿度传感器
单总线:只用一根线。 复位信号:设置为输出模式,低电平20ms,然后再拉高30us。然后设置为输入模式,dht11会先拉低80us,然后拉高80us表示对接成功 数据0:开始先拉低50us,然后拉高26~28u…...
Docker 基础命令简介
目录 Docker 基础命令 1. Docker 版本信息 2. 获取 Docker 帮助 3. 列出所有运行中的容器 4. 运行一个新的容器 5. 查看容器日志 6. 停止容器 7. 启动已停止的容器 8. 删除容器 9. 列出所有镜像 10. 拉取镜像 11. 构建镜像 12. 删除镜像 13. 执行命令 14. 查看容…...
嵌入式开发之静态库和共享库
静态库 静态库的特点: 默认执行库链接的时候,检索的是Linux的/lib、/usr/lib目录下,如果指定gcc -c .... -L 指定路径 -l指定库文件;c语言分为预编译、编译、汇编、链接四个步骤。链接的时候是把依赖库文件函数的代码拷贝到程序里面,即便是删除库文件。拷贝后的程序依旧…...
关于npm源的切换及相关操作
要查看当前配置的 npm 源(registry),可以使用以下命令: 查看 npm 源 npm config get registry这个命令会返回目前被设置的 npm registry URL,通常情况下是 https://registry.npmjs.org/。 列出所有 npm 配置项 如果…...
vue前端sku实现
this.value.skuStockList [];let skuList this.value.skuStockList;//只有一个属性时if (this.selectProductAttr.length 1) {let attr this.selectProductAttr[0];for (let i 0; i < attr.values.length; i) {skuList.push({spData: JSON.stringify([{key:attr.name,v…...
使用Vue3和Vue2进行开发的区别
使用Vue3和Vue2进行开发的区别 笔者虽然老早就是用vue3进行开发了,但是上次有人问道使用vue3进行开发跟使用vue2进行开发的区别有哪些这个问题的时候,回答的还是有些琐碎,干脆今天专门整理一下,做个记录。 一、再也不用set了 众所…...
爬虫入门urllib 和 request(二)
文章目录 1、urllib介绍2、urllib的基本方法介绍2.1 urllib.Request2.2 response.read() 3、urllib请求百度首页的完整例子4、小结 1、urllib介绍 除了requests模块可以发送请求之外, urllib模块也可以实现请求的发送,只是操作方法略有不同! urllib在python中分为urllib和url…...
【大数据学习 | HBASE】hbase的整体架构
hbase的region存储原理图 首先我们看到hbase的组成分为两个大的部分,分别是hmaster和hregionserver,主节点用于协调数据,regionserver用于真正的去管理表,其中regionserver存在多个,他们共同协调管理全有的表ÿ…...
群控系统服务端开发模式-应用开发-个人资料
群控系统服务端开发模式后端基础框架现在就差个人资料、及权限验证。下面开发个人资料。 一、获取个人信息 1、添加路由 在根目录下route文件夹下面app.php文件中添加如下代码: Route::post(member/personal_data,permission.Member/personalData);// 获取个人信息…...
openssl生成加密,公钥实现非对称加密
私钥用于加密,公钥用于解密 私钥用于颁发token,公钥用于验证token,公钥不能颁发token 私钥和公钥是一对,不能单独使用,利用私钥生成公钥,利用公钥进行解密 使用openssl来生成一对私钥和公钥:ope…...
[CKS] K8S Admission Set Up
最近准备花一周的时间准备CKS考试,在准备考试中发现有一个题目关于Admission。 Whats Admission Kubernetes Admission是Kubernetes集群中一种机制,用于控制和修改集群中的资源对象。它允许您在Kubernetes资源被创建、更新或删除之前,对资源…...
前端学习Day13 CSS盒子的定位(固定定位篇“附练习”)
一、固定定位 固定定位 (position:fixed)其实是绝对定位的子类别,一个设置了 position:fixed 的元素是相对于视窗固定的,就算页面文档发生了滚动,它也会一直待在相同的地方。 ⚠️:固定定位会脱离文档流。…...
Tomcat 启动卡住,日志显示 At least one JAR was scanned for TLDs yet contained no TLDs.
现象 Tomcat 启动后,控制台输出卡在了: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JA…...
计算机网络:网络层 —— 移动 IP 技术
文章目录 IPv6IPv6 的诞生背景主要优势IPv6引进的主要变化 IPv6数据报的基本首部IPv6数据报首部与IPv4数据报首部的对比 IPv6数据报的拓展首部IPv6地址IPv6地址空间大小IPv6地址的表示方法 IPv6地址的分类从IPv4向IPv6过渡使用双协议栈使用隧道技术 网际控制报文协议 ICMPv6ICM…...
useCrudSchemas
摘要: useCrudSchemas 不是一个标准的JavaScript或数据库操作库函数,也不是一个广泛认知的术语。它可能是某个特定项目或应用程序中定义的一个自定义函数或方法,用于简化CRUD(创建、读取、更新、删除)操作。 在Web开发…...
SpringBoot3集成Junit5
目录 1. 确保项目中包含相关依赖2. 配置JUnit 53. 编写测试类4、Junit5 新增特性4.1 注解4.2 断言4.3 嵌套测试4.4 总结 在Spring Boot 3中集成JUnit 5的步骤相对简单。以下是你可以按照的步骤: 1. 确保项目中包含相关依赖 首先,确保你的pom.xml文件中…...
交换机堆灰指南:为什么你的HSRP热备切换总超15秒?从生成树到接口追踪的完整排错
交换机堆灰指南:为什么你的HSRP热备切换总超15秒?从生成树到接口追踪的完整排错 当核心交换机的HSRP切换时间超过15秒,业务中断的每一毫秒都在考验运维团队的神经。这不是简单的协议超时问题,而是网络冗余架构中多个子系统协同失效…...
终极指南:Windows免费倒计时神器Hourglass,5分钟从新手到高手
终极指南:Windows免费倒计时神器Hourglass,5分钟从新手到高手 【免费下载链接】hourglass The simple countdown timer for Windows. 项目地址: https://gitcode.com/gh_mirrors/ho/hourglass 还在为Windows系统找不到好用的倒计时工具而烦恼吗&a…...
Flash Browser终极指南:让消失的Flash世界重新回归
Flash Browser终极指南:让消失的Flash世界重新回归 【免费下载链接】CefFlashBrowser Flash浏览器 / Flash Browser 项目地址: https://gitcode.com/gh_mirrors/ce/CefFlashBrowser 还记得那些陪伴我们成长的Flash小游戏吗?🎮 那些有趣…...
Pi0大模型环境配置详解:Python 3.11+PyTorch 2.7+lerobot依赖安装
Pi0大模型环境配置详解:Python 3.11PyTorch 2.7lerobot依赖安装 1. 项目概述 Pi0是一个创新的视觉-语言-动作流模型,专门设计用于通用机器人控制任务。这个项目最大的亮点是提供了一个直观的Web演示界面,让用户能够通过简单的操作体验先进的…...
Phi-3-mini-128k-instruct低资源部署效果:4GB显存流畅运行实测
Phi-3-mini-128k-instruct低资源部署效果:4GB显存流畅运行实测 最近在折腾一些边缘设备上的AI应用,发现一个挺有意思的现象:很多开发者手头只有一些“古董级”的显卡,比如GTX 1650或者移动端的MX系列,显存也就4GB左右…...
Unity 2022 LTS 实战:用NavMesh Agent和OffMesh Link,5分钟搞定一个会‘跳’会‘绕’的智能敌人AI
Unity 2022 LTS 实战:用NavMesh Agent和OffMesh Link打造智能敌人AI 在3D动作游戏中,一个只会直线追击的敌人往往会让玩家感到乏味。想象一下,当玩家精心设计的陷阱被敌人轻松绕过,或是敌人突然从高处跳下发动突袭时,游…...
MCP协议实战踩坑:当Claude Desktop遇上n8n 1.93.0的混合通信
MCP协议深度解析:从混合通信模型看AI Agent生态兼容性挑战 当Claude Desktop与n8n 1.93.0的MCP协议实现相遇时,表面上的连接故障背后隐藏着AI Agent通信架构的深层设计哲学差异。本文将带您穿透现象看本质,揭示不同MCP实现方案背后的技术权衡…...
PyTorch张量操作实战:从基础运算到高效数据处理
1. PyTorch张量基础:从零开始理解多维数组 第一次接触PyTorch张量时,我完全被这个看似复杂的概念搞懵了。直到有一天,我把张量想象成俄罗斯套娃,突然就豁然开朗了。最外层的套娃是最高维度,每打开一层就降一个维度&…...
自动驾驶中的路径规划实战:手把手教你用Python复现RRT与RRT*算法(含动态演示)
自动驾驶路径规划实战:Python实现RRT与RRT*算法全解析 从理论到实践的路径规划探索 在自动驾驶技术快速发展的今天,路径规划作为核心算法之一,直接决定了车辆能否安全高效地完成行驶任务。想象一下,当你驾驶车辆进入一个复杂的停车…...
从‘Hello World’到物联网:用Hi3861点灯程序,带你理解鸿蒙轻量级设备开发的核心流程
从‘Hello World’到物联网:用Hi3861点灯程序,带你理解鸿蒙轻量级设备开发的核心流程 在物联网设备开发领域,鸿蒙系统(OpenHarmony)正以其轻量级、高并发的特性吸引着越来越多的开发者。对于初学者而言,一个…...
