【测试与自动化】介绍-框架-Jest-覆盖率-异步代码-e2e-Vue测试

article/2025/10/17 2:38:19

测试与自动化

  • 软件测试和自动化测试介绍
  • 前端自动化测试框架
  • 使用Jest编写单元测试
  • 统计测试覆盖率
  • 使用Jest测试异步代码
  • 使用Cypress进行e2e测试
  • 测试 Vue 项目


软件测试和自动化测试介绍

了解什么是软件测试,以及自动化方式的测试

什么是软件测试?

定义:

在规定的条件下对程序进行操作,以发现程序错误,衡量软件质量,并对其是否能满足设计要求进行评估的过程。

目的:

促进目标鉴定软件的正确性、完整性、安全性和质量。

本质:

其实是对软件的 ”预期输出“ 与 ”实际输出“ 之间的比较过程

常用测试方法:

  1. 黑盒测试:主要以用户的视角来测试程序的功能,所以也称功能测试

  2. 白盒测试:主要测试程序的代码逻辑,所以也称代码测试

什么是自动化测试?

早先的软件测试工作大都由人来手工完成,其过程极度重复、枯燥、易出错。

而自动化测试则利用程序来模拟人工操作,有效规避了以上问题。

自动化测试的分类:

  1. 单元测试:属于一种白盒测试,即编写代码来对项目中的小部件代码进行测试(比如一个函数)

  2. 集成测试:属于一种白盒测试,即在单元测试基础上,将模块按设计要求组装为子系统或完整系统进行测试

  3. e2e测试:属于一种黑盒测试,即编写自动化脚本模拟用户操作,检测界面间通信、数据传递等是否如预期

  4. 快照测试:属于一种黑盒测试,即事先准备好理想中的参考文件(参考照片),然后再去访问程序并记录当前界面内容(临场拍照),最后比对两者内容是否一致


前端自动化测试框架

了解目前流行的几个用于前端的自动化测试框架

完整的自动化测试框架应包含以下 3 个部分:

  1. 断言库(Assertion Library):用于比对 ”预期输出“ 和 ”实际输出“,并抛出错误
  2. 模拟库(Mock Library):用于模拟数据对象、网络接口等
  3. 测试运行器(Test Runner):用于运行测试代码

一、常用前端单元测试框架:

  1. Jest(完整测试框架)

    • 一个由 Facebook 开源的测试框架,比较新而且目前也比较火
    • 功能全面
    • 零配置
  2. Mocha(核心测试框架)

    • 一个比较成熟的测试框架,社区很大
    • 功能单一但非常灵活,能轻易与其他库结合,比如:Chai(断言库)、Karma(测试运行器)
    • 对异步代码的测试支持的非常好

二、常用的e2e测试框架:

  1. Cypress.io

  2. Puppeteer
    在这里插入图片描述


使用Jest编写单元测试

使用 Jest 框架来编写单元测试的基本用法

核心内容:

  1. jest 的基本用法

Jest会自动识别和执行项目中所有以.test.js为后缀的测试代码文件。

具体步骤:

  1. 新建项目并安装 jest
npm i jest --save-dev
  1. 编写一些功能代码(先使用 CommonJS 模块,因为用 ESM 需要借助 Babel,后面会举例)

src/util.js

function toUpperCase(str) {return str ? str.toUpperCase() : ""
}module.exports = {toUpperCase
}
  1. 编写用于测试以上代码的 jest 测试代码

jest 提供的常用测试函数:

  • test():创建测试用例,代表一个要测试的场景
  • expect():创建匹配器,并利用 .toBe().toEqual() 等方法进行数据比对

src/util.test.js

// 导入要测试的模块
const { toUpperCase } = require('./util')// 测试用例1:传入参数 'hello',返回 'HELLO'
test('hello to HELLO', () => {expect(toUpperCase('hello')).toBe('HELLO')
})// 测试用例2:传入参数 null,返回 ''
test('null to whitespace', () => {expect(toUpperCase(null)).toBe('')
})
  1. 执行测试
npx jest

运行结果:
在这里插入图片描述

如果目标代码使用了 ESM 模块化,那测试代码也需用 ESM。这时需要安装配置 Babel 进行支持:

  1. 安装 babel
npm i babel-jest @babel/core @babel/preset-env --save-dev
  1. 创建 babel.config.js
module.exports = {presets: [['@babel/preset-env', {targets: {node: 'current'}}]],
};
  1. 在测试代码中使用 import 导入目标测试代码
import { toUpperCase } from './util'

统计测试覆盖率

了解测试覆盖率的含义和功能

测试覆盖率,也叫代码覆盖率,指的是被测试的目标代码中至少被执行了一次的条目数占所有条目数的百分比。

它是衡量测试的充分性和完整性的重要指标。

在这里插入图片描述

覆盖率根据统计条目的类型,细分为:

  • 语句覆盖率:以代码语句为最小单位
  • 路径覆盖率:以逻辑路径为最小单位
  • 函数覆盖率:以函数为最小单位
  • 代码行覆盖率:以代码行为最小单位

统计代码覆盖率的目的:

  • 找出遗漏的测试场景
  • 找出没用到的代码

常用工具

  • Jest - 自带了覆盖率统计工具
  • Karma - 借助第三方库 Istanbul

具体步骤

  1. 在上一章节代码中,执行以下命令生成覆盖率报告
npx jest --coverage

运行结果:
在这里插入图片描述
在这里插入图片描述

另外会生成一个包含 html 格式覆盖率报告的 coverage 目录。


使用Jest测试异步代码

测试包含有如网络请求、定时器等异步行为的目标代码

核心内容:

  1. jest 处理异步代码的方式

方式一:回调风格

通过 test() 的回调函数参数 done (它也是个函数,调用它即可告知完成异步任务)

test('some desc', done => {someAsyncTask(data => {try {expect(data).toBe('....')done()} catch(e) {done(e)}})
})

方式二:Promise/async + await 风格

通过在 test() 的回调函数中返回一个 promise 对象

test('some desc', () => {return someAsyncTask().then(data => {expect(data).toBe('...')})
}) 

或直接用 async/await

test('some desc', async () => {const data = await someAsyncTask()expect(data).toBe('...')
}) 

具体步骤:

  1. 在上一章节代码基础上,安装 axios 包,并在 src/util.js 中编写一个网络接口调用函数
npm i axios --save

src/util.js

import axios from 'axios'export function getRemoteData() {const url = 'http://www.liulongbin.top:3006/api/getbooks'return axios.get(url).then(res => res.data)
}
  1. src/util.test.js 测试代码中添加新的测试用例:
import { toUpperCase, getRemoteData } from './util'// 测试用例3:获取异步数据
test('get remote data', async () => {// 测试返回 promise 的异步代码,必须要返回 promise 对象// 这样才能让测试正确结束const data = await getRemoteData()expect(data.status).toBe(200)
})

使用Cypress进行e2e测试

安装和使用 Cypress 进行端到端测试

核心内容:

  1. 安装和启动 Cypress
  2. 编写和运行 Cypress 测试代码

具体步骤:

  1. 安装 Cypress
  npm i cypress --save-dev
  1. 打开 Cypress
npx cypress open

Cypress 会搜索到用户电脑上的所有浏览器,供测试时选用:

image-20211102153747619
  1. 创建e2e测试
image-20211102162735502

测试文件名请按 xxx.spec.js 这种命名规则。

  1. 编写测试代码

e2e测试的本质其实就是模拟用户操作,即用户是如何使用网页界面的。所以 e2e 测试代码就是在利用各种 API 操作网页而已。

Cypress 使用了 Mocha + Chai,因此编写测试代码时用的是来自这两个库的函数,如: describeitexpect 等。

/// <reference types="cypress" />describe('测试百度搜索功能', () => {// 每个测试用例都会执行的前置行为beforeEach(() => {// 打开百度首页cy.visit('https://www.baidu.com')})// 一个测试用例it('应该得到搜索结果', () => {// 获取百度首页的关键字输入框,并输入关键字cy.get('#kw').type('前端e2e测试')// 获取百度首页的搜索按钮,并点击cy.get('#su').click()// 对比结果cy.get('.nums_text').should('have.text', '百度为您找到相关结果约3,190,000个')})
})
  1. 点击用例,运行测试
    在这里插入图片描述

测试 Vue 项目

介绍针对 Vue 开发的应用代码进行自动化测试的工具

核心内容:

  1. 针对 Vue 代码的测试工具介绍
  2. 在 Vue 代码中添加测试工具,并编写测试案例

Vue的代码测试涉会及到以下三类:

  • 单元测试(测试函数)- 可使用 Jest 或 Mocha,官方提供了相关插件,可查看官方文档
  • 组件测试(测试Vue组件)- 官方推荐使用 Vue Test Utils 或它的进一步封装库 Vue Testing Library
  • e2e测试(测试界面)- 可使用专为 Vue 封装的 Cypress

具体步骤:

一、测试 Vue 组件

  1. 在现有的 Vue CLI 项目中,通过 vue-cli 提供的命令添加 Vue Testing Library
# 单元测试
vue add @vue/unit-jest# 端到端测试
vue add @vue/e2e-cypress

执行后项目中会新增测试专用目录 tests
在这里插入图片描述

  1. 编写一个新组件Counter.vue,并在 App.vue 中调用

Counter.vue

<template><div><h1 class="title">当前计数:<span class="count">{{ count }}</span></h1><div><button class="btn decrease" @click="decreaseHandler">减少</button><button class="btn increase" @click="increaseHandler">增加</button></div></div>
</template><script>export default {props: {init: {type: Number,default: 0}},data() {return {count: this.init}},methods: {increaseHandler() {this.count += 1},decreaseHandler() {this.count -= 1}}}
</script><style>.count {color: red;}
</style>

App.vue中的调用:

<Counter :init="10"/>
  1. 针对 Counter.vue 组件,编写以下几个单元测试

tests/unit/count.spec.js

import Counter from '@/components/Counter.vue'
import { mount } from '@vue/test-utils'describe('Counter.vue', () => {it('不传 init 属性时显示的初始计数是 0', () => {// 渲染组件const wrapper = mount(Counter)// 获取组件内的数据expect(wrapper.vm.count).toBe(0)})it('传入 init 属性值为 10 时显示的初始计数是 10', () => {const wrapper = mount(Counter, {// 为组件传入属性propsData: {init: 10}})expect(wrapper.vm.count).toBe(10)})it('点击 3 下增加按钮及 1 下减少按钮,当前计数增加 2', () => {const wrapper = mount(Counter)// 获取组件内的元素const btnIncrease = wrapper.find('.increase')const btnDecrease = wrapper.find('.decrease')// 模拟用户点击btnIncrease.trigger('click')btnIncrease.trigger('click')btnIncrease.trigger('click')btnDecrease.trigger('click')// 比对数据expect(wrapper.vm.count).toBe(2)})
})
  1. 运行单元测试
npm run test:unit

在以上单元测试中进行数据比对时,都从组件的实例(vm 对象)上获取数据来进行比对,但有时我们想测试的是界面是否已渲染成我们期望的内容,这时应该这样写:

it('点击 3 下增加按钮及 1 下减少按钮,当前计数增加 2', async () => {const wrapper = mount(Counter)// 获取组件内的元素const btnIncrease = wrapper.find('.increase')const btnDecrease = wrapper.find('.decrease')// (修改点1)模拟用户点击(使用 await)await btnIncrease.trigger('click')await btnIncrease.trigger('click')await btnIncrease.trigger('click')await btnDecrease.trigger('click')// (修改点2)获取界面上的内容来进行数据比较expect(wrapper.get('.count').text()).toBe('2')
})

说明:此处使用 await 是因为 click 事件是异步的,这样才能在异步行为发生后正确获取重新渲染后的界面内容。

二、e2e 测试

在 vue 中进行 e2e 测试其实和直接使用 Cypress 没有太大差别。

  1. 通过以下命令启动 Cypress
npm run test:e2e
  1. 和之前一样,编写和运行 Cypress 测试脚本即可

http://chatgpt.dhexx.cn/article/ELx8u866.shtml

相关文章

AUTOSAR E2E Introduction

E2E – Functional Safety E2E 用于保护安全相关的数据交互,以防止数据在交互过程中因为” FAULT” 导致数据完整性,时效性,合法性出现问题, 比如HW RANDOM FAULT 导致数据被篡改 E2E 的使用可以满足ISO26262 -6 对于数据安全传输的要求, 最高可以满足ASILD 的要求 需要…

【小猫爪】AUTOSAR学习笔记12-功能安全之E2E模块

【小猫爪】AUTOSAR学习笔记12-功能安全之E2E模块 前言1 E2E模块简介2 E2E功能简介2.1 五种保护机制2.2 E2E的状态机2.3 E2E Protection Wrapper2.4 E2E 错误反馈方式 END 前言 从这一节开始&#xff0c;正式步入功能安全专题。这一节先来看一个与Communication Stack强相关的且…

AUTOSAR专项--E2E

1. E2E基本概念 E2E,全称叫做End To End。这个概念的提出是用于保护在ECU运行时与安全相关的数据交换不受通信链路中故障的影响。根据AUTOSAR E2E Protocol Specification描述,基于E2E的通信可以按照如下示例: 很明显,E2E在传输中用于防止MCU硬件的随机失效、通信总…

Vue中如何进行自动化测试与端到端测试(E2E测试)

Vue中如何进行自动化测试与端到端测试&#xff08;E2E测试&#xff09; Vue.js是一种流行的前端JavaScript框架&#xff0c;用于构建现代的单页应用程序。在Vue.js中&#xff0c;测试是一个非常重要的主题。测试可以确保代码的正确性&#xff0c;使代码更加可靠和可维护。在这…

前端测试:e2e测试

为什么进行测试 你是否有以下烦恼&#xff1a; 当你加班加点完成一个功能后&#xff0c;提交给测试部&#xff0c;立马返回几个bug 当你修改完bug后&#xff0c;并检查了好几遍&#xff0c;确保无误后&#xff0c;提交给测试部&#xff0c;有返回几个bug …… 对于以上情境…

【AUTOSAR-E2E】-1.1-End-to-End通信保护介绍(Functional Safety功能安全相关)

目录 1 常见的通讯故障以及E2E机制能够检出的通讯故障 2 Functional safety功能安全对通信的要求 3 通信故障的原因 3.1 软件故障 3.2 随机硬件故障 3.3 外部影响、环境压力 4 常见的“E2E通讯保护”解决方案 4.1 无E2E保护的信号数据流示例 4.2 E2E Protection Wrapper解决方案…

Autosar BSW层CAN通讯开发------08(Autosar的E2E开发-----以E2E Profile01为例)

Crc校验在CAN报文中的实际应用介绍&#xff1a; Crc在报文传输过程中的实际应用如下&#xff08;在汽车中&#xff0c;Crc一般是对8个字节进行校验&#xff0c;目前我接触到的是这样&#xff09;&#xff1a; ECU-A和ECU-B之间进行CAN报文的传输&#xff0c;双方规定ECU-A发出的…

功能安全专题之端到端(E2E) 的通信保护

本文来自AUTOSAR技术资料。 前言 功能安全&#xff08;Functional Safety&#xff09;是一项系统特性&#xff0c;由于基于功能安全的设计会影响到系统设计&#xff0c;所以从系统开发初始阶段就要进行考虑。由于软件的复杂度会影响 到功能安全的设计&#xff0c;所以在AUTOS…

AUTOSAR的E2E通信安全

导语&#xff1a;近期项目中遇到一些E2E的诊断故障&#xff0c;涉及到整车需求和AutoSAR配置&#xff0c;对这个概念重新做了下梳理&#xff0c;与大家交流。由于E2E机制比较成熟&#xff0c;本文章内容更多出自于AutoSAR标准、ISO 26262 和相关文献&#xff0c;这里只捡重点和…

E2E通信保护协议学习笔记

E2E通信保护协议学习笔记 最近在做功能安全方面工作&#xff0c;想了解E2E保护的问题。本文试着说明两个点&#xff1a; 功能安全需要考虑通信失效造成的影响&#xff0c;因此E2E通信保护协议被提出&#xff0c;以满足功能安全要求&#xff1b; 简单介绍E2E通信保护协议机制。…

什么是 E2E 保护 ?

安全在每个领域都是一个永恒的话题&#xff0c;汽车也不例外&#xff0c;而随着最近几年汽车电动化、智能化和网联化的发展&#xff0c;汽车安全也越来越受到用户及开发人员的重视&#xff0c;安全的要素也是多方面的&#xff0c;例如用户可能关心在使用车机系统时的隐私安全、…

HVS颜色空间的提取

在日常的图片处理中&#xff0c;常常要把RGB转成HVS&#xff0c;然后再提取色调、亮度、饱合度通道图片进行操作&#xff0c;网上大多介绍都只是提到转换&#xff0c;如果提取都不准确&#xff0c;我这里记录一下准确提取的方法。V&#xff0c;S提取只要将值乘255就可以&#x…

matlab绘制hsv色轮图

% 生成网格 tListlinspace(0,2.*pi,300); rListlinspace(0,1,100); [theta,R]meshgrid(tList,rList);% 角度及半径转换为坐标 Xcos(thetapi).*R; Ysin(theta).*R; Zzeros(size(X));% 构造hsv网格并转换为rgb网格 hsvMeshcat(3,theta./2./pi,ones(size(R)),R); rgbMeshhsv2rgb(h…

图像融合:Exposure Fusion Using Boosting Laplacian Pyramid

Exposure Fusion Using Boosting Laplacian Pyramid 文章目录 Exposure Fusion Using Boosting Laplacian PyramidJND ModelLuminance AdaptationContrast MaskingOverall JND Model A Hybrid Exposure Weight MeasurementLocal Exposure WeightGlobal Exposure WeightJND-Base…

基于主动视觉机制的深度学习--一个综合池化框架

卷积神经网络(CNN)是深度学习的代表算法之一&#xff0c;长期以来被广泛应用于图像识别领域。它是受到了生物处理过程的启发&#xff0c;通过模仿人类视觉系统(HVS)的工作机制&#xff0c;完成各种视觉任务等。但与HVS相比&#xff0c;CNN不能够像人类一样&#xff0c;迅速的分…

第13章:直方图处理

第13章&#xff1a;直方图处理 一、直方图的含义&#xff1a;1. 普通直方图&#xff1a;2. 归一化直方图&#xff1a; 二、绘制直方图&#xff1a;1. 使用Numpy绘制直方图&#xff1a;2. 使用OpenCV绘制直方图&#xff1a;3. 使用掩码绘制直方图&#xff1a; 三、直方图均衡化&…

通过matlab,基于DCT变换,利用hvs实现水印嵌入强度自适应

我真的会谢&#xff0c;为什么我跑出来是一片黑呀&#xff1f;本matlab小白跪求matlab大佬答疑解惑555555感谢 以下是我的程序&#xff1a; % 读取原始图像和水印图像 I imread(lena.bmp); W imread(waterMark.bmp);% 将图像转为灰度图&#xff0c;并将水印调整为与原始图像…

基于HVS 的结构相似性的视频质量评价

清华大学的汪志兵&#xff0c; 廖煜鹏&#xff0c; 汪 博&#xff0c; 秦明海&#xff0c; 林行刚等人在《通信技术》2010年第2期上发表。   HVS 对不同频率分量的敏感性不同&#xff0c;对视频帧不同部分的关注度也不相同。 为了达到更好的效果&#xff0c;论文中引入3 个因…

一种基于HVS特性的视频质量评测方法

本篇论文是由厦门大学的袁飞&#xff0c;黄联芬&#xff0c;姚彦发表于《光电工程》2008年1月刊上。   本文针对视频质量的评测应用&#xff0c;通过在视频帧内图像和帧间图像的处理过程中引入人眼视觉系统(HVS)的主要特性&#xff0c;克服传统PSNR 算法在序列质量检测应用方…

数字水印算法matlab源程序 matlab版数字水印算法 /DCT/DWT/LSB/HVS/W-SVD数字水印源码 数字水印的嵌入和提取 W-SVD数字水印实现

发以下多套系统源码&#xff1a; 1、matlab版数字水印算法 2、MATLAB数字水印 源代码文档 3、数字水印技术matlab代码 4、数字水印 JPEG压缩 matlab代码 5、数字水印 添加噪声 matlab代码 6、各种数字水印的matlab源代码&#xff08;有DFT&#xff0c;DCT&#xff0c;小波变换等…