前端自动化测试(一):揭秘自动化测试秘诀

news2024/9/21 10:40:28

目录

    • @[TOC](目录)
    • 前言
    • 自动化测试 VS 手动测试
    • 测试分类
    • 何为单元测试
    • 单元测试的优缺点
      • 优点
      • 缺点
    • 测试案例
      • 测试代码
    • 测试函数的封装
    • 实现 `expect` 方法
    • 实现 `test` 函数
    • 结语

在这里插入图片描述

正文开始如果觉得文章对您有帮助,请帮我三连+订阅,谢谢💖💖💖


前言

在日常开发中,我们常会遇到下面的问题:

  • 每次在版本发布上线之前,需要在电脑前蹲上好几个小时甚至更长时间对你的应用进行测试,这个过程非常枯燥而痛苦。
  • 当代码的复杂度达到一定级别,且维护者的数量不止你一个时,你会逐渐察觉到在开发新功能或修复 bug 时会变得越发小心翼翼。即使代码看起来没问题,你心里还是会犯嘀咕:这个 Feature 会不会带来其他 Bug?这个 Fix 会不会引入其他 “Feature”?
  • 当你想要对项目中的代码进行重构时,会花费大量时间进行回归测试。

以上这些问题大多源于开发者使用的最基本的手动测试方式。解决这些问题的根本在于引入自动化测试方案

自动化测试 VS 手动测试

特性自动化测试手动测试
速度快速,可以连续运行多个测试用例。慢,需要逐个测试用例手动执行。
一致性高,每次执行结果一致。低,可能因人为因素导致结果不一致。
覆盖率高,可以覆盖大量测试用例。低,可能遗漏一些测试用例。
成本初始成本高,需要编写和维护测试脚本。初始成本低,但随着测试用例增加,成本可能增加。
维护需要维护测试脚本,但一旦建立,维护成本较低。每次更改需求或功能时,需要重新执行所有测试用例。
灵活性低,测试用例需要预先定义。高,可以根据需要随时调整测试用例。
准确性高,可以精确执行测试用例。低,可能因人为因素导致测试结果不准确。
重复性高,可以重复执行测试用例。低,重复执行测试用例可能会出错。
资源需要专门的测试工具和环境。需要测试人员和测试设备。
发现问题可以发现一些手动测试难以发现的问题。可以发现一些自动化测试难以发现的问题。
适用场景适用于回归测试、持续集成等场景。适用于探索性测试、用户验收测试等场景。
可扩展性随着测试用例的增加,可以扩展测试范围。随着测试用例的增加,执行时间可能显著增加。
风险测试脚本可能存在缺陷,导致测试结果不准确。测试人员可能因疲劳或疏忽导致测试结果不准确。

测试分类

前端开发最常见的测试主要是以下几种:

  • 单元测试:验证独立的单元是否正常工作。
  • 集成测试:验证多个单元协同工作。
  • 端到端测试:从用户角度以机器的方式在真实浏览器环境验证应用交互。
  • 快照测试:验证程序的 UI 变化。

何为单元测试

  • 单元测试是对应用程序最小的部分(单元)运行测试的过程。通常,测试的单元是函数,但在前端应用中,组件也是被测单元。
  • 单元测试可以单独调用源代码中的函数并断言其行为是否正确。
  • 与端到端测试不同,单元测试运行速度很快,只需几秒钟即可完成,因此你可以在每次代码变更后运行单元测试,从而快速得到变更是否破坏现有功能的反馈。
  • 单元测试应该避免依赖性问题,比如不存取数据库、不访问网络等,而是使用工具虚拟出运行环境。这样可以最小化测试成本,不需花大力气搭建各种测试环境。

单元测试的优缺点

优点

  • 提升代码质量,减少 Bug。
  • 快速反馈,减少调试时间。
  • 让代码维护更容易。
  • 有助于代码的模块化设计。
  • 代码覆盖率高。

缺点

  • 由于单元测试是独立的,无法保证多个单元一起运行时是否正确。

测试案例

上面提到单元测试的单元是函数,我们可以写两个函数,然后进行测试。看下面的例子:

// math.js
function sum (a, b) {
  return a + b; 
}

function subtract (x, y) {
  return x - y;
}

module.exports = {
  sum,
  subtract
};

测试代码

通过测试代码可以很方便地帮助验证代码的正确性。

const { sum, subtract } = require('./math');

const result = sum(1, 2);
const expected = 3;

if (result !== expected) {
  throw new Error(`1 + 2 应该等于 ${expected},但是结果却是 ${result}`);
}

const result2 = subtract(2, 1);
const expected2 = 1;

if (result2 !== expected2) {
  throw new Error(`2 - 1 应该等于 ${expected2},但是结果却是 ${result2}`);
}

测试函数的封装

之前示例的测试代码太过繁琐,可以思考如何封装得更简便一些,例如:

expect(sum(1, 2)).toBe(3);
expect(subtract(2, 1)).toBe(1);

这样的测试代码就像自然语言说话一样,很舒服。

实现 expect 方法

function expect (result) {
  return {
    toBe (actual) {
      if (result !== actual) {
        throw new Error(`预期值和实际值不相等,预期 ${result},实际 ${actual}`);
      }
    }
  };
}

实现 test 函数

增加错误提示信息:

const { sum, subtract } = require('./math');

test('测试加法', () => {
  expect(sum(1, 2)).toBe(3);
});

test('测试减法', () => {
  expect(subtract(2, 1)).toBe(1);
});

function test (description, callback) {
  try {
    callback();
    console.log(`${description} 通过测试`);
  } catch (err) {
    console.error(`${description} 没有通过测试:${err}`);
  }
}

function expect (result) {
  return {
    toBe (actual) {
      if (result !== actual) {
        throw new Error(`预期值和实际值不相等,预期 ${result},实际 ${actual}`);
      }
    }
  };
}

结语

自动化测试是前端开发中提升效率、保证质量的利器。它不仅能够减轻手动测试的繁重工作,还能在代码发生变动时迅速提供反馈,确保代码的稳定性和可靠性。通过本文的介绍,相信你已经对自动化测试有了简单理解,后面我会继续介绍更多使用的测试工具

在实际项目中,合理地引入自动化测试,不仅能够大幅度提升开发效率,还能让你在面对复杂的项目需求和频繁的代码变更时更加从容。


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

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

相关文章

7月投稿警惕!6本On Hold期刊被数据库剔除!

本周投稿推荐 SCI&EI • 1区计算机类,3.5-4.0(1个月录用) • CCF推荐,1区-Top(3天初审) EI • 各领域沾边均可(2天录用) 知网(CNKI)、谷歌学术 •…

nginx的配置和使用

一、nginx支持win和linux版本的下载,选择合适的版本进行安装 二、配置文件注解 重点的几个参数进行注释: 1、listen 要监听的服务的端口,符合这个端口的才会被监听 server_name要监听的服务地址,可能是ip,也可能是域名&#xf…

流量书单,互联网营销必读

《流量池》杨飞 《增长黑客》肖恩埃利斯(Sean Ellis)、摩根布朗(Morgan Brown) 《增长五线》王赛 《参与感》黎万强 《场景革命》吴声 《网络营销实战密码》昝辉 《网络营销推广实战宝典》江礼坤 《超级IP,互联网新物种方法论》吴声 《周鸿祎自述&#xff0…

Golden Software Surfer v25 解锁版下载与安装教程 (三维绘图软件)

前言 Golden Software Surfer 是一款三维绘图软件,具备强大的插值功能和绘制图件能力,可用来处理XYZ数据,轻松绘制专业三维图。该软件有着很直观的用户界面,尽管不支持中文,但是很用户在熟悉流程以后依然能够轻松学会…

《计算机网络》(学习笔记)

目录 一、计算机网络体系结构 1.1 计算机网络概述 1.1.1 计算机网络的概念 1.1.2 计算机网络的组成 1.1.3 计算机网络的功能 1.1.4 电流交换、报文交换和分组交换 1.1.5 计算机网络的分类 1.1.6 计算机网络的性能指标 1.2 计算机网络体系结构与参考模型 1.2.1 计算机…

SpringCloud Nacos的配置与使用

Spring Cloud Nacos的配置与使用 文章目录 Spring Cloud Nacos的配置与使用1. 简单介绍2. 环境搭建3. 服务注册/服务发现4. Nacos 负载均衡4.1 服务下线4.2 权重配置4.3 同集群优先访问 5. Nacos 健康检查5.1 两种健康检查机制5.2 服务实例类型 6.Nacos 环境隔离6.1 创建namesp…

QT开发笔记:常用控件

常用控件: 站在巨人的肩膀上,Qt中已经提供了大量的内置控件(按钮、文本框、单选按钮、复选按钮、下拉框) 可直接学习其特性使用方法使用。 控件 Widget 界面上的各种元素,各种部分的统称。 HTML 包含很多标签&#…

解决 Shiro 重复调用 doGetAuthenticationInfo 导致异常处理错误的问题

遇到一个 Shiro 中反复调用 doGetAuthenticationInfo 导致异常没有被成功处理的问题,经过一些源码调试,发现了问题的所在,只需在继承 BasicHttpAuthenticationFilter 的类中重写 onAccessDenied 方法即可。 文章目录 1.问题环境2.问题描述3.问…

【数学 分类讨论】2029. 石子游戏 IX

本文涉及知识 质数、最大公约数、菲蜀定理 LeetCode 2029. 石子游戏 IX Alice 和 Bob 再次设计了一款新的石子游戏。现有一行 n 个石子,每个石子都有一个关联的数字表示它的价值。给你一个整数数组 stones ,其中 stones[i] 是第 i 个石子的价值。 Ali…

在 Kubernetes 中设置 Pod 优先级及其调度策略详解

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] &#x1f4f1…

Gson的基本使用:解析Json格式数据 序列化与反序列化

目录 一,Gson和Json 1,Gson 2,Json 3,Gson处理对象的几个重要点 4,序列化和反序列化 二,Gson的使用 1,Gson的创建 2,简单对象序列化 3,对象序列化,格…

vue学习笔记(十一)——开发心得(axios的封装、promise细节、vue-router开发中的使用)

1. axios的网络请求的封装 1.1 为什么要封装api? 代码分层,便于以后的修改,无需触碰逻辑页面 目标: 网络请求,不散落在各个逻辑页面里,封装起来方便以后修改 1.2 封装api步骤 ① 在项目 src 下新建目录 utlis &am…

海外发稿:打造希腊媒体宣发新局面

随着全球经济一体化的不断深入,企业对于海外市场的拓展需求日益迫切。在这个过程中,媒体宣发作为一种有效的市场推广手段,已经成为企业出海的重要策略之一。希腊,作为欧洲的重要经济体,拥有丰富的文化底蕴和众多的历史…

如何使用Python实现语音转文字/字幕

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 语音转文字/字幕 📒📝 Python实现📝 便捷封装⚓️ 相关链接 ⚓️📖 介绍 📖 想象一下,在观看一部无字幕的电影或者需要快速整理会议录音时,如果有一个魔法工具能瞬间将音频转化为清晰的文字,那该是多么便捷!今天,…

MPU6050三轴传感器

1.背景: MPU6050 是由 InvenSense(现为 TDK 旗下公司)生产的一款集成了三轴加速度计和三轴陀螺仪的微机电系统(MEMS)传感器。它可以测量物体在三个轴上的加速度和旋转角速度,被广泛应用于消费电子、工业控制…

微前端--single-spa

微前端 使用微前端的挑战: 子应用切换,应用相互隔离,互补干扰,子应用之前的通信,多个子应用并存,用户状态的存储,免登。 常用技术方案 路由分发式微前端 通过http服务的反向代理 http {serv…

光盘防水嘛 ? DVD+R 刻录光盘泡水实验

首发日期 2024-07-20, 以下为原文内容: 同志们好, 欢迎来到 胖喵穷人实验室 ! 这里专注于 低成本, 低难度, 低风险 的 “三低” 小实验. 胖喵穷人实验室 (PM-PLab-E)正式名称: 紫腹巨蚊 (Toxorhynchites gravelyi) 系列穷人 (Poor people) 实验室风险警告: 低风险并不是零风险…

47.简易电压表的设计与验证(2)

(1)Verilog 代码: module adc_collect(input clk ,input reset_n ,input [7:0] adc_data ,output clk_adc );wire clk_adc_a ;…

PostgreSQL异常:An I/O error occurred while sending to the backend

在使用PostgreSQL数据库批量写入数据的时候,遇到了一个问题,异常内容如下: Cause: org.postgresql.util.PSQLException: An I/O error occurred while sending to the backend.报错内容 报错提示1 Caused by: org.postgresql.util.PSQLExc…

QTimer::singleShot导致定时器资源耗尽解决方法

参考文章:Qt QTimer::singleShot问题及用法 1. 问题描述 QTimer::singleShot定时器事件超时,如果此时类内对象已经被回收,定时器事件调用已经释放的类内资源时会引起崩溃。 这通常是因为定时器的回调函数(槽函数)在执…