2023年了,来体验下前端的测试方案

news2024/9/22 17:29:17

在当前的前端当中,有好多同学自己写的代码bugger横飞,怎么解决这个问题呢🤔🤔🤔?个人觉得主要有以下两个趋势

  • 给前端的代码加上类型检查(ts)
  • 给前端代码编写单元测试和e2e测试

当然,小孩子才做选择,我们两者都要🤠🤠🤠,那就一起来看看如何在现有的前端基础上加上单元测试e2e测试吧,上期的2023年了,来试试前端格式化工具文章中主要是用react为基础框架上添加的eslint,prettier等,这一期就以vue为基础框架添加测试方案吧😉😉😉

初始化结构

使用以下命令来初始化一个vue项目的工程

pnpm create vite my-vue-app --template vue

image.png

接下来进入对应的目录,安装依赖即可

vitest

vitest是什么,这里就不说了。咱们使用vitest来搭建一个单元测试的环境

使用下面命令来安装vitest

pnpm i vitest -D

然后初始化vitest的配置文件,在根目录下面新建 vitest.config.ts

import { defineConfig } from 'vitest/config'

export default defineConfig({
    test: {
        environment: 'node',  // 环境是node环境
        passWithNoTests: true, // 如果没有找到测试,Vitest 不会失败。
        exclude: ['**/node_modules/**', '**/dist/**'], // 不需要进行测试的文件夹
        threads: true // 是否开启多线程
    }
})

这样是不是就可以了呢?🤔🤔🤔肯定是的,vitetest就是so easy,那么咋们来写个测试用例来测试下吧😀😀😀

接着新建 src/__test__/index.test.ts 这个测试文件,写一个简单的测试用例:

import { expect, test } from 'vitest'

test('simple test add', () => {
    expect(1 + 1).toBe(2)  // 测试一个简单的逻辑
    expect('map'.slice(1)).toMatchSnapshot('"ap"') // 进行快照测试
})

测试当中的内容分为两段,一段是进行一个简单的js逻辑测试,另一端则是创建一个测试的快照。

最后咱们需要在package.json当中加入一个启动的脚本如下:

"scripts": {
...
+ "test:init": "vitest run"
},

执行的效果如下:

image.png

拓展

当然,vitest还给咱们提供了ui界面来方便我们进行测试,如果你想开启的话需要安装一个依赖:

pnpm i @vitest/ui -D

然后在package.json中增加测试脚本:

"scripts": {
...
+ "test:ui": "vitest --ui"
},

接着执行pnpm test:ui,你可以去浏览器查看 Vitest 的 UI 界面:

image.png

并且当你的测试用例代码变动时,UI 界面会有实时的热更新效果哦😉😉😉

playwright

单元测试只是用来测试咋们的逻辑有没有问题,通常我们还会对项目进行E2E测试。谈到 E2E 测试,它与单元测试最大的区别就在于,它是从端用户的角度出发,来测试系统的整体行为,一般而言会启动一个无头浏览器(无 UI 界面),然后去测试页面的 UI 状态和交互表现。

我们使用目前比较流行的一个 E2E 测试套件 playwright,首先安装依赖:

pnpm i @playwright/test -D

当然,这里有的同学会说,用其他的E2E测试包可不可以,对于这个没有强制要求。也可以使用cypress来进行端到端的测试

然后新建配置文件 playwright.config.ts ,内容如下:

import type { PlaywrightTestConfig } from '@playwright/test'

const config: PlaywrightTestConfig = {
    testDir: './e2e', // 测试的目录
    fullyParallel: true, // 开启多线程
    timeout: 50000, // 每个测试最大的执行时间
    webServer: {
        url: 'http://localhost:5173', //在进行测试启动的本地服务
        command: 'pnpm dev' // 测试启动的服务
    },
    use: {
        headless: true // 是否使用无头浏览器来进行测试
    }
}
export default config

有了配置文件,接下来启动咋们前端的工程,看下页面中有啥。

image.png

并且页面的body当中一定包含文本 Vite + Vue

编写基本测试

在根目录下建立文件e2e/index.test.ts,并且写上一些需要测试的内容:

import { test, expect } from '@playwright/test'

const siteUrl = 'http://localhost:5173'

test('Verify that the page renders properly', async ({ page }) => {
    // 打开页面进行测试
    await page.goto(siteUrl) 

    const res = await page.evaluate(async () => {
       // 获取页面的内容
        const pageContent = document.body.innerText
        // 页面的内容一定包含字符串 Vite + Vue
        return pageContent.includes('Vite + Vue')
    })
    expect(res).toBe(true)
})

有了测试用例,咋们来执行看下效果😉😉😉

在package.json中,增加启动测试的脚本如下:

+ "test:e2e": "playwright test"

效果

cypress-pro-finish-test.gif

可以看出执行的结果会打开浏览器进行测试,并且测试是通过的🎉🎉🎉🎉

进行操作测试

这里咋们来模拟点击里面的那个页面中的button,看下效果

e2e里面新建oper.test.ts来进行操作测试,内容如下:

import { test, expect } from '@playwright/test'

const siteUrl = 'http://localhost:5173'

test('Verify button clicks', async ({ page }) => {
   // 页面跳转
    await page.goto(siteUrl)
    // 找到按钮就行点击
    await page.getByRole('button').click()
    // 点击后,按钮的文本将变成 count is 1
    await expect(page.getByRole('button')).toHaveText('count is 1')
})

结果

cypress-pro-finish-test.gif

通过结果,咋们会发现,里面会启动多个进程来进行测试工作,结果当然也是通过的啦🎉🎉🎉

打开ui,查看测试的步骤

当然,playwright也提供了ui,方便我们进行调试测试的每一步骤,使用的方式如下:

package.json增加脚本

+  "test:e2eui": "playwright test --ui"

启动后,就可以打开ui测试的界面啦

image.png

进行无头测试

作为一名前端工程师,咋们肯定是不想要每一次测试都打开ui来,那不是浪费时间嘛🤔🤔🤔,所以playwright也提供了无头浏览器测试.

在进行无头浏览器测试的时候,需要在本地下载浏览器的内核,不然第一次测试容易超时。

npx playwright install

这里安装时间会比较长

修改playwrite.config.ts如下:

import type { PlaywrightTestConfig } from '@playwright/test'

const config: PlaywrightTestConfig = {
    testDir: './e2e', // 测试的目录
    fullyParallel: true, // 开启多线程
    timeout: 50000, // 每个测试最大的执行时间
    webServer: {
        url: 'http://localhost:5173', //在进行测试启动的本地服务
        command: 'pnpm dev' // 使用启动服务的脚本
    },
    use: {
-       headless: false // 是否使用无头浏览器来进行测试
+       headless: true // 是否使用无头浏览器来进行测试
    }
}

export default config

此时进行测试,就不会弹出浏览界面来啦😀😀😀

cypress-pro-finish-test.gif

总结

本文主要分享了,在前端工程化中如何进行搭建一个单元测试和e2e的测试环境。感谢读者朋友读到这里,愿你在日后写的代码永无bugger😶‍🌫️😶‍🌫️😶‍🌫️

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

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

相关文章

【C++】继承和多态、共有私有和保护、重写

区分继承与多态、辨别public、protected、private 继承与多态的概念继承与多态的区别与联系区别:联系:示例结果: 继承和访问的权限说明示例:结果 结论 继承与多态的概念 面向对象三大原则:封装、继承、多态。继承是一种…

【C++进阶1--继承】面向对象三大特性之一(附菱形继承讲解

继承是面向对象中很重要的特性,今天就来讲讲C中的继承。 文中不足错漏之处望请斧正! 什么是继承? 是一种类的复用,可以让B类继承,从而使B类获得A类的所有成员。 A类叫做父类或基类,B类叫做子类或派生类。…

C++ 构造函数-2

构造函数-2 构造函数体赋值 在对象创建的时候,编译器会调用构造函数,给对象当中的成员赋一个合适的初始值。 class Date { public: Date(int year, int month, int day) { _year year; _month month; _day day; } private: int _year; int _month; i…

Android framework工程师一定要知道的高级技巧

作为一名android framework工程师,你是否对Android framework的一些高阶使用技巧感到陌生?想了解更多的细节?如果是这样,那么就请你读下去。本篇文章我将为大家相信介绍Android framework的高阶技巧,帮助你成为一名高级…

【Nginx】【SSL】Nginx上配置ssl证书

配置需要有自己的域名和云主机;域名已经解析到主机;安装好Nginx 一、申请免费版的SSL证书 1、阿里云可以申请免费版的SSL证书 阿里云搜索 ssl 找到 数字证书管理服务/SSL 证书>免费证书;申请一个免费的 2、下载SSL证书到本地&#xf…

贝叶斯公式与全概率公式的理解。

1.贝叶斯与全概率公式解释 1.全概率公式定义 即若在某个场景下,可找到一个完备事件组 Ai ( i 1,2,3…n)。 则对任一与该场景有关的事件 B,都可以分割成无数个小事件(由不同因素引起的事件) 有:   B B ∩ A1 ∪ A2…

给你的项目启动提提速:Lazy Initialization

前言 在一个名为种花家的小镇上,生活着一群热爱编程的人。他们致力于构建出高效、可维护的软件系统,而 Spring Boot 框架成为了他们的不二之选。这个小镇上的人们每天都在用 Spring Boot 框架创造着令人瞩目的应用程序。 然而,随着时间的推移…

Java 学习之线程

1、引入线程的优点: 1)充分利用cup资源 2)简化编程模型 3)简化异步事件处理 4)使GUI更有效率 5)节约成本 2、线程使用:在Java中创建线程有几种方法,每个Java程序至少包含一个线…

软件工程开发文档写作教程(05)—可行性研究报告写作规范

本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl本文参考资料:电子工业出版社《软件文档写作教程》 马平,黄冬梅编著 软件工程开发文档现状 一个软件项目从立项到结尾共有几个阶段:立项,…

动画图解常见串行通讯协议:SPI、I²C、UART、红外分析

一、SPI传输 图1:SPI 数据传输 图1.2:SPI数据传输(2) ​ 图1.3: SPI时序信号 二、IC传输 图1.2.1: I2C总线以及寻址方式 三、UART传输 图1.3.1:PC 上通过UART来调试MCU 图1.3.2:R…

深入探究语音识别技术:原理、应用与实现

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…

Qt-AES加密库

Qt-AES加密库 AES在线加解密工具[1] Qt-AES加密库[2] Qt AES/DES加密算法库 软件/文件/任意长度字符串加密 试用期许可使用方法软件试用期算法对称加密和非对称加密非对称加密(Asymmetric Cryptography)实例总结加密算法 [3] Qt笔记-AES加密[4] AES 加密…

【Betternet怎么用呢?】Betternet下载使用完整教程

Betternet是一款非常历史悠久的访问世界互联网行业的工具了。知道Betternet的用户,也应该是比较久的互联网用户了。早在2015年左右,那时候的betternet就是很多外贸行业的朋友上gmail以及Facebook上开发客户必备的工具了。 因为那时候betternet使用简单&…

Pandas + ChatGPT 超强组合,pandas-ai :交互式数据分析和处理新方法

Python Pandas是一个为Python编程提供数据操作和分析功能的开源工具包。这个库已经成为数据科学家和分析师的必备工具。它提供了一种有效的方法来管理结构化数据(Series和DataFrame)。 在人工智能领域,Pandas经常用于机器学习和深度学习过程的预处理步骤。Pandas通过…

第7章链接:静态链接、符号表、符号解析

文章目录 7.2 静态连接7.3 目标文件7.4 可重定位目标文件7.5 符号和符号表7.6 符号解析7.6.1 链接器如何解析多处定义的全局符号7.6.2 与静态库链接7.6.3 链接器如何使用静态库来解析引用 7.2 静态连接 像 Unix ld 程序这样的静态链接器(static linker)…

C语言函数大全-- u 开头的函数

C语言函数大全 本篇介绍C语言函数大全-- u 开头的函数 1. ultoa 1.1 函数说明 函数声明函数功能char *ultoa(unsigned long value, char *str, int base);用于将无符号长整型数转换成指定基数下的字符串表示 参数: value : 要转换的无符号长整型数st…

docker容器无法执行vim【已解决】

docker容器无法执行vim【已解决】 docker容器中执行vim失败安装文件没更换之前,速度非常的慢【失败】这里我更换了163的但是报错【失败】这里我更换了阿里的第一种报错【成功】::::这里我更换了阿里的第二种成功 完整步…

struct模块进行数据打包

原理: 将一组简单数据进行打包,转换为bytes格式发送。或者将一组bytes格式数据,进行解析。 接口使用 Struct(fmt) 功能: 生成结构化对象 参数:fmt 定制的数据结构 st.pack(v1,v2,v3…) 功能: 将一组数据按照指定格式打包转换为by…

分子动力学基础知识

分子动力学基础知识 目前主要存在两种基本模型:其一为量子统计力学, 其二为经典统计力学。 量子统计力学 基于量子力学原理, 适用 于微观的, 小尺度, 短时 间的模拟,可以描述电子 的结构分布,原子间的成 键断键等化学性质。 经典纭计力学…

MySQL原理(七):内存管理和磁盘管理

前言 上一篇介绍了 MySQL 的日志,这一篇将介绍内存管理和磁盘管理相关的内容。 内存管理 MySQL 的数据都是存在磁盘中的,我们要更新一条记录的时候,得先要从磁盘读取该记录,然后在内存中修改这条记录。修改完这条记录后会缓存起…