新手也能看懂的【前端自动化测试入门】!

前言

最近在网上搜索前端自动化测试相关的文档,但是发现网上的文章都是偏使用,没有把一些基础概念说清楚,导致后续一口气遇到一些karmaJasminejestMochaChaiBDD等词汇的时候很容易一头雾水,这次一方面整理一下收获的知识一方面做个分享。

什么是前端自动化测试

我个人做题喜欢使用拆解法,比如什么是“前端自动化”,根据这个题目可知,“前端”是在范围/领域,”自动化“是方法,通过脚本或者工具等各种方式在没有人或者很少人的协助下实现预期的目标的过程,“测试”是工作,是为了保证软件项目质量的工作。

那么前端自动化测试就是在不借助人员帮助下,通过使用脚本或者工具等各种方式保证前端项目的项目质量的任务。

首先,一般人在正式工作中,往往由于工作的强度和业务的要求开发项目的时候都没有编写自动化测试脚本的环节。

但是在后续过程中职业生涯中,参与一些大型项目或者一些使用人很多的第三方库中,会对代码质量和功能稳定性的要求越来越高,以及多人协作开发的开发集成交付效率,更为了提高自己的知识储备和行业竞争力,学会前端自动化测试的一些相关基础是很必要的。

前端测试分类

既然讲了什么是前端自动化测试,那么前端测试又分成哪几类呢?

首先前端测试分类往往指的是涵盖的模块大小,从最小的函数方法到整个应用的自动化测试分成了多个模块:

  • 1.静态代码分析:静态代码分析工具(如 ESLintStylelintPreitter)通过静态分析源代码来检测潜在的错误、代码风格问题和安全漏洞。

    它们的原理是基于预定义的规则或自定义规则对代码进行扫描,并生成相应的警告或错误。

    这些工具帮助开发人员在编码阶段捕获问题,提高代码质量和可维护性。

    静态代码分析的工作主要是通过配置分析工具配置文件的方式,由于Eslint工具十分成熟且网上配置教程众多,这里就不展示案例。

  • 2.单元测试:单元测试——这是在软件开发里常常听到的词,单元测试是针对软件系统中最小的可测试单元(在前端里通常是函数或方法)进行的测试。

    测试工具(如 JestMochaEnzyme)使用断言库来验证函数的输入和输出是否符合预期。

    它们通过提供的测试框架和断言库来运行和验证函数的行为,以确保各个单元(函数)的正确性。

现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:691998057【暗号:csdn999】

下面一个例子,通过mocha编写的自动化脚本去测试函数的返回是否符合预期:

 // 目标函数,返回的是两数之和 function sum(a, b) {     return a + b; }  describe('sum', () => {  it('返回两数之和', () => {    const result = sum(2, 3);    // expect里为测试目标,入参为2和3的sum函数    // equal里为结果,期望返回的是5    // 如果实际执行中返回的结果不对则会报错    expect(result).to.equal(5);  });});
  • 3.集成测试:再封装一层,将已通过测试的单元按设计要求集成起来再进行的测试就是集成测试;

    集成测试用于测试多个组件或模块之间的交互和集成情况。

    测试工具(如 JestMocha)提供了功能来组织和运行集成测试套件,并使用模拟、桩(stub)或替代(mock)等技术来模拟外部依赖。

    它们可确保不同组件之间的集成正常工作,并验证系统的整体功能。在前端往往是模拟组件生成到接口集成测试这部分的工作。

下面一个例子,Mock远程数据到调用组件方法来验证登陆组件是否能正常工作:

<template>   <Login ref="login" /></template><script>import { ref } from "vue"const au = ref("")Mock.mock("/login", {  code: 200,  msg: "成功",  data: {    token: "abcdefg",  },});
fetch("/api/data", {  method: "POST",})  .then((data) => {      au.value = data.token;});  this.$refs.login.setToken({ token })<script>
  • 4.端到端测试:咱们继续往上游链路走,当我们把集成好的应用放到不同应用终端中进行实际运行测试就是端到端测试;

    端到端测试(End-to-End Testing)是模拟真实用户环境中用户操作和行为的测试。测试工具(如 CypressPuppeteerPlaywright)通过控制浏览器或模拟用户操作来执行测试。

    它们可以模拟用户在浏览器中的交互行为、检查页面元素和状态,并验证整个应用程序的功能和用户体验。

下面一个例子,模拟用户在浏览器中页面正常打开并表单正常渲染:

// 在Cypress测试脚本中,可以使用describe和it来组织测试用例describe('模拟用户提交表单', () => {  // 在每个测试用例之前执行的操作可以放在beforeEach中  beforeEach(() => {    // 打开网页    cy.visit('https://www.example.com')  })
  // 编写测试用例  it('展示页面标题', () => {    // 断言页面标题是否正确    cy.title().should('include', 'Example')  })
  it('模拟表单提交', () => {    // 定位并填写表单    cy.get('#name').type('Xiaoyou Xin')    cy.get('#email').type('XinXiaoYou@example.com')    cy.get('#submit').click()
    // 断言表单提交后的结果    cy.get('#result').should('contain', 'Success!')  })})

  • 5.性能测试:锦上添花,当页面的主流程和功能都测试完成以后我们还需要对页面的性能有所追求,这个时候对应用程序的各项性能特征,包括加载速度、资源使用、响应时间等进行测试评估就是性能测试,相关的性能测试工具有如 LighthouseWebPageTest等。

    它们模拟和测量应用程序在不同网络条件和硬件环境下的性能表现,并提供有关性能瓶颈和优化建议的报告。

通过在chromium中集成chrome拓展程序实现模拟应用程序报告,提供一个Lighthouse插件的页面性能测试方法。

图片

单元化测试入门

现在我们开始正式的开始了解具体的单元测试的几个概念:

断言——断言是在编程中用于检查代码行为是否满足预期的一种机制或语句。

它用于验证代码的某个条件是否为真,并在条件不满足时触发错误或异常。

通俗易懂地说,断言就像是一个自动化的检查员,它会在你编写的代码中的特定位置进行判断,以确保代码的一些假设或预期是正确的。

如果断言的条件为真,那么一切正常,代码会继续执行。但是,如果断言条件为假,也就是代码行为和预期不符,断言会触发一个错误或异常,指示代码存在问题。

举个例子,当我们想要验证sum函数是否按照我们的预期返回结果的时候,我们就可以通过断言机制:

// 一个相加求和的函数function sum(a, b) {  return a + b;}
// 使用Node中的assert断言模块验证 sum 函数的输出是否符合预期/** *  用于程序调试、单元测试中比较前后值是否相同的方法 *  @params {any} actual 实际返回值 *  @params {any} expected 期望返回值 *  @params {string} actual 结果错误时的提示信息 */assert.equal(sum(2, 3), 5, 'sum函数计算错误');

而基于该机制,延伸出了很多断言库以及断言编码风格,现在我列举几个比较主流的断言库以及其特点:

  • 1.ChaiChai 是一个灵活且可扩展的断言库,它提供了多种风格和接口供选择。

    Chai断言库本身支持断言风格包括断言式(assert-style)、BDD 风格(expect-style)和应用链式风格(should-style)三种断言风格供用户选择(需要注意的是每种风格的实现原理也并不相同,比如should-style使用到了Es6Object.getPrototypeOf函数,所以它并不支持IE浏览器)。

这里给大家展示一下三种风格在写法上的区别:

断言式(assert-style)

断言式风格比较接近NodeJs,使用方法接近Node中的模块概念,通过暴露assert模块,然后调用其中的interface接口方法进行使用。

const assert = require('chai').assertconst foo = 'bar'
assert.typeOf(foo, 'string') // without optional messageassert.typeOf(foo, 'string', 'foo is a string') // with optional messageassert.equal(foo, 'bar', 'foo equal `bar`') 

BDD 风格(expect-style)

BDD风格有两种风格:expect-styleshould-style。整体风格可以感觉像是在模仿人类正常进行运算行为,从左到右链式调用。

import { expect } from 'chai'const foo = 'bar'    , beverages = { tea: [ 'chai', 'matcha', 'oolong' ] }expect(foo).to.be.a('string')expect(foo).to.equal('bar')expect(foo).to.have.lengthOf(3)expect(beverages).to.have.property('tea').with.lengthOf(3)

应用链式风格(should-style)

import { should } from 'chai'const foo = 'bar'    , beverages = { tea: [ 'chai', 'matcha', 'oolong' ] }
foo.should.be.a('string')foo.should.equal('bar')foo.should.have.lengthOf(3)beverages.should.have.property('tea').with.lengthOf(3)

完整的API文档和断言库介绍可以去官网:Chai官方入口(https://www.chaijs.com/)

ps:我觉得学习一个工具最好的方式之一就是查阅官方文档,因为任何第三方文章解读都有可能出现信息错误或者版本过时等问题存在,后续我也会贴出对应官网入口。

  • 2.PowerAssertPowerAssert 是一个基于表达式值的断言库,它能够根据表达式的值自动生成详细的断言信息。这使得在断言失败时能够更容易地理解断言失败的原因。

    PowerAssert 官方入口(https://github.com/power-assert-js/power-assert)

  • 3.Jest:Jest是一款由FaceBook推出的开源项目,它本身其实是一个功能强大的测试框架,并且内建了断言库。

    Jest 提供了丰富的断言方法,如 expect,它的整体风格 的 expect 语法类似,但是不提供链式调用,而是直接调用一个方法进行使用,使用 expect 函数和一系列的匹配器(matchers),可用于编写简洁易读的测试用例,并且与 Jest 的其他功能集成良好。

Jest官方文档入口:https://jestjs.io/docs/getting-started

expect(sum(1, 2)).toBe(3);expect(sum(-1, 5)).toBe(4);
  • 4.....

我们通过刚刚的学习,了解了单元测试的最基本模块,也就是断言,并且简单了解了多种风格的断言库,知道了如何通过使用对应的API和语法对一些测试对象(方法/模块)进行断言。

而在介绍Jest的过程中,我们提到了一个词汇————测试框架。

那么,什么是测试框架呢?

先上定义:测试框架——是一种工具或库,用于帮助开发人员编写、组织和执行测试用例,并提供相关的工具和功能来简化测试过程和结果的分析。

测试框架可以帮助开发人员编写高质量和可靠的测试用例,自动化测试执行,并提供丰富的工具和功能来简化测试过程。

简单的了解,测试框架就是集成了测试需要的相关能力,我们不需要再为了模拟环境、运行代码、配置断言库等底层能力重新开发,可以直接拿来配置好就可以使用的百宝箱。

测试框架通常提供以下功能和特点:

  • 1.测试运行器:测试框架提供测试运行器,用于自动化执行测试用例。

    它可以扫描测试文件或目录,并运行其中的测试代码。测试运行器负责调用测试代码,并收集和报告测试结果。

    其中Karma就是有名的独立测试运行器,它可以与多个测试框架(包括 MochaJasmineQUnit 等)结合使用,需要注意的是截止于2023-4-28,该运行器已经停止维护。

    karma 测试运行器入口(https://github.com/karma-runner/karma)。

  • ​​​​​​​​​​​​​​2.断言库:测试框架通常内置了断言库,用于编写断言语句来验证代码的行为是否符合预期

  • 断言库提供了一组函数和方法,使得编写断言变得简单和直观。

  • 3.测试套件和组织:测试框架提供测试套件和组织机制,用于组织测试用例。

    测试套件是一组相关的测试用例,可以根据功能、模块或其他逻辑关系进行分组

    测试框架提供了一种结构化的方式来组织和管理测试代码。

  • 4.测试报告和结果分析:测试框架通常提供测试结果的报告和分析功能。

    它可以生成详细的测试报告,显示测试通过或失败的情况,以及测试覆盖率等统计信息。

    这些报告和统计信息帮助开发人员了解测试的状态和代码的质量。 

    模拟和依赖注入:一些测试框架提供模拟和依赖注入的功能,用于模拟外部依赖或对代码中的依赖进行替换。

    这使得在测试中可以轻松地模拟数据库、网络请求、文件系统等外部资源,以及对代码的单元进行隔离和测试。

  • 5.异步测试支持:许多测试框架提供了对异步代码的支持。

    它们可以处理异步操作、Promise、回调函数和定时器等情况,以确保在测试中正确处理异步行为。

接下来就列举几个比较常见的前端测试框架:

  • 1.JestJest 是一个流行的 JavaScript 测试框架,特别适用于前端应用的单元测试和集成测试。

    它提供了强大的断言库、Mocking 和 spying 功能、快照测试、异步测试支持等特性。

    Jest官方文档入口(https://jestjs.io/docs/getting-started)。

  • 2.Mocha:Mocha 是一个灵活的 JavaScript 测试框架,适用于前端应用的单元测试和集成测试。

    它提供了测试运行器和丰富的插件生态系统,支持多种断言库和报告器,并具有异步测试支持和钩子函数等功能。 

    mocha 官方入口(https://github.com/mochajs/mocha)。

  • 3.Cypress:Cypress 是一个前端端到端(End-to-End)测试框架,专注于模拟用户行为和测试应用的交互性。

    它提供了可视化测试工具、强大的选择器和断言库,以及实时重新加载和调试功能。

  • 4.EnzymeEnzyme 是一个 React 的测试工具集,用于编写和运行 React 组件的单元测试。

    它提供了一组实用函数和断言库,用于测试组件的渲染、交互和状态变化。

  • 5.Vue Test Utils:Vue Test Utils 是一个 Vue.js 的官方测试工具库,用于编写和运行 Vue.js 组件的单元测试。

    它提供了一组工具和 API,用于创建和操作 Vue 组件,以及进行断言和模拟。

【后续将更新————Jest框架基础使用】

下面是配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

最后: 可以在公众号:程序员小濠 ! 免费领取一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!

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

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

相关文章

SOCKET编程和TCP通信案例三次握手四次挥手

文章目录 一、SOCKET1、网络套接字SOCKET2、网络字节序2.1、小端法2.2、大端法2.3、字节序转换3、IP地址转换函数3.1、本地字节序转网络字节序3.1.1、函数原型&#xff1a;3.1.2、返回值3.2、网络字节序转本地字节序3.2.1、函数原型3.2.2、返回值4、sockaddr地址结构&#xff0…

【蓝桥杯EDA设计与开发】立创开源社区分享的关于蓝桥被EDA真题与仿真题的项目分析

立创开源社区内有几个项目分享了往年 EDA 设计题目与仿真题&#xff0c;对此展开了学习。 【本人非科班出身&#xff0c;以下对项目的学习仅在我的眼界范围内发表意见&#xff0c;如有错误&#xff0c;请指正。】 项目一 来源&#xff1a;第十四届蓝桥杯EDA赛模拟题一 - 嘉立…

网络爬虫采集工具

在当今数字化的时代&#xff0c;获取海量数据对于企业、学术界和个人都至关重要。网络爬虫成为一种强大的工具&#xff0c;能够从互联网上抓取并提取所需的信息。本文将专心分享关于网络爬虫采集数据的全面指南&#xff0c;深入探讨其原理、应用场景以及使用过程中可能遇到的挑…

C++无锁队列的原理与实现

目录 1.无锁队列原理 1.1.队列操作模型 1.2.无锁队列简介 1.3.CAS操作 2.无锁队列方案 2.1.boost方案 2.2.ConcurrentQueue 2.3.Disruptor 3.无锁队列实现 3.1.环形缓冲区 3.2.单生产者单消费者 3.3.多生产者单消费者 3.4.RingBuffer实现 3.5.LockFreeQueue实现 …

实现仿ChatGPT光标跟随效果

先看效果 实现效果 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>光标闪烁效果</title>…

网络安全需要对网络风险有独特的理解

迷失在翻译中&#xff1a;网络风险解释的脱节现实 在古印度的一个经典故事中&#xff0c;几个蒙住眼睛的人接近一头大象&#xff0c;每个人检查不同的部位。有人触摸树干&#xff0c;认为它像一条蛇。另一个摸到了一条腿&#xff0c;认为它是一棵树。还有一个拿着象牙的人&…

Java中打印图案最常用的25个图案程序

Java是公认的最流行的编程语言&#xff0c;因为它的简单性和多功能性。还可以使用它开发各种应用程序&#xff0c;包括Web、移动和桌面应用程序。此外&#xff0c;Java为开发人员提供了强大的工具来轻松高效地创建复杂的程序。Java最有前途的特性之一是它能够创建可以以特定格式…

《向量数据库指南》——为什么说向量数据库是更适合AI体质的“硬盘”

其“AI原生”的体质,具体表现在几个方面: 1.更高的效率。 AI算法,要从图像、音频和文本等海量的非结构化数据中学习,提取出以向量为表示形式的“特征”,以便模型能够理解和处理。因此,向量数据库比传统基于索引的数据库有明显优势。 2.更低的成本。 大模型要从一种新…

【stm32】hal库学习笔记-GPIO按键控制LED和蜂鸣器(超详细!)

【stm32】hal库学习笔记-GPIO按键控制LED和蜂鸣器 注&#xff1a;本学习笔记基于stm32f4系列 使用的开发板为正点原子stmf407ZGT6探索者开发板 GPIO引脚使用时&#xff0c;可输入或输出数字信号 例如: 检测按键输入信号&#xff08;Read_Pin&#xff09;输出信号&#xff08;W…

flink operator 拉取阿里云私有镜像(其他私有类似)

创建 k8s secret kubectl --namespace flink create secret docker-registry aliyun-docker-registry --docker-serverregistry.cn-shenzhen.aliyuncs.com --docker-usernameops_acr1060896234 --docker-passwordpasswd --docker-emailDOCKER_EMAIL注意命名空间指定你使用的 我…

Linux:多线程

目录 1.线程的概念 1.1线程的理解 1.2进程的理解 1.3线程如何看待进程内部的资源? 1.4进程 VS 线程 2.线程的控制 2.1线程的创建 2.2线程的等待 2.3线程的终止 2.4线程ID 2.5线程的分离 3.线程的互斥与同步 3.1相关概念 3.2互斥锁 3.2.1概念理解 3.2.2操作理解…

分类预测 | Matlab实现WOA(海象)-XGboost分类【24年新算法】基于海象优化算法(WOA)优化XGBoost的数据分类预测

分类预测 | Matlab实现WOA(海象)-XGboost分类【24年新算法】基于海象优化算法(WOA)优化XGBoost的数据分类预测 目录 分类预测 | Matlab实现WOA(海象)-XGboost分类【24年新算法】基于海象优化算法(WOA)优化XGBoost的数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本…

模型的召回率(Recall)

召回率&#xff08;Recall&#xff09;&#xff0c;也称为灵敏度&#xff08;Sensitivity&#xff09;或真正例率&#xff08;True Positive Rate&#xff09;&#xff0c;是用于评估二分类模型性能的指标之一。召回率衡量了模型正确识别正例的能力&#xff0c;即在所有实际正例…

ctfshow php特性(web89-web101)

目录 web89 web90 web91 web92 web93 web94 web95 web96 web97 web98 web99 web100 web101 php特性(php基础知识) web89 <?php include("flag.php"); highlight_file(_FILE_);if(isset($_GET[num])){$num$_GET[num];if(preg_match("/[0-9]/&…

Docker项目部署()

1.创建文件夹tools mkdir tools 配置阿里云 Docker Yum 源 : yum install - y yum - utils device - mapper - persistent - data lvm2 yum - config - manager -- add - repo http://mirrors.aliyun.com/docker- ce/linux/centos/docker - ce.repo 更新 yum 缓存 yum makec…

Kafka-消费者-KafkaConsumer分析-PartitionAssignor

Leader消费者在收到JoinGroupResponse后&#xff0c;会按照其中指定的分区分配策略进行分区分配&#xff0c;每个分区分配策略就是一个PartitionAssignor接口的实现。图是PartitionAssignor的继承结构及其中的组件。 PartitionAssignor接口中定义了Assignment和Subscription两个…

三国游戏(寒假每日一题+贪心、枚举)

题目 小蓝正在玩一款游戏。 游戏中魏蜀吴三个国家各自拥有一定数量的士兵 X,Y,Z&#xff08;一开始可以认为都为 0&#xff09;。 游戏有 n 个可能会发生的事件&#xff0c;每个事件之间相互独立且最多只会发生一次&#xff0c;当第 i个事件发生时会分别让 X,Y,Z 增加 Ai,Bi…

什么是低代码(Low-Code)?低代码平台的适用人群

低代码平台是一种革命性的工具&#xff0c;它让非专业的开发人员也能轻松创建应用程序。通过直观的可视化界面和拖放功能&#xff0c;开发人员能够轻松地构建和部署应用程序&#xff0c;无需专业的编程知识。低代码平台的出现&#xff0c;降低了应用程序开发的门槛&#xff0c;…

100天精通鸿蒙从入门到跳槽——第8天:TypeScript 知识储备:泛型

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通Golang》…

火速收藏!2024 新年微信红包封面领取全攻略

2024“龙”重登场&#xff01;今年有哪些令人期待的红包封面&#xff1f; 前方大批精美红包封面来袭&#xff0c;全新品牌氛围红包封面上线&#xff0c;支持品牌定制特色氛围元素&#xff0c;沉浸感受浓浓年味儿&#xff0c;收获满满惊喜&#xff01; 新年开好运&#xff0c;微…