自动化测试(二)01-前端测试分为单元测试、集成测试和E2E测试 测试工具对比-适合TDD或 BDD、断言、异步测试 测试工具的类型

article/2025/11/11 2:37:46

自动化测试(二)01-前端测试分为单元测试、集成测试和E2E测试 & 测试工具对比-适合TDD或 BDD、断言、异步测试 & 测试工具的类型

前端自动化测试

测试是一个庞大的主题,包括各种分类的测试,诸如黑盒测试/白盒测试、单元测试/集成测试/端到端测试等。通常程序员在测试自己的代码的时候用得最多的便是单元测试,但是因为测试也是需要代价,很多人是不喜欢写测试的,甚至是一点都不写。

那么是什么原因让大家不愿意写呢?

  1. 不熟悉
  2. 浪费时间
  3. 知识不成体系
  4. 团队氛围
  5. 缺少实践

我们要从基础的东西学起,打消对测试的恐惧。

测试的分类

在多浏览器的自动化测试,我们多半是进行端到端的测试工作,一小部分是大粒度的单元测试。端到端测试测试模拟用户的行为。在 Web 应用程序中,他们会启动服务器,打开浏览器,模拟用户的行为进行点击、输入、提交等动作,断言浏览器中发生了特定的事情或者是得到了期待的结果,从而让我们相信功能可以正常的运行。

而单元测试根据代码单元的公共 API 运行它们。这些测试需要创建一个类的实例,使用特定的输入调用它的方法,断言被调用的方法达到了预期的效果。在下文中我们会看到这两种测试的实践,当然有时候区分度并不大,可能无法明显地区分哪些是端对端测试哪些是单元测试,有时候他们是混合起来的,不过只要记住我们的目标是保证功能可以正常运行救足够了。

按照软件工程自底而上的概念,前端测试一般分为单元测试(Unit Testing )、集成测试(Integration Testing)和端到端测试(E2E Testing)。从下面的图可以看出,从底向上测试的复杂度将不断提高,另一方面测试的收益反而不断降低的。

在这里插入图片描述

关于软件测试分类,可见软件测试的分类

测试工具对比

在进行项目实践前,很重要的一项工作是选择合适的技术栈。好比在前端开发时应该选择 React,Vue 还是 Angular 作为框架一样,前端的测试工作也需要选择一套技术栈。很多时候大家在制定技术栈时容易走偏,在选择技术框架时不是选择最合适的框架,而是选择最热门的框架。当然一定程度上热门的框架能反应其受欢迎程度,可能是因为其出众的优点,如较高的开发效率、高效的渲染特性或者是活跃的社区。在前端开发中,很容易有这样的感受,就是只要半个月没有关注业界的最新动态,就感觉恍若隔世,新的解决方案层出不穷,让人喘不过气。

经过几年的前端洗礼之后,就已经过了慌乱的年纪,再也不会盲目地追寻新技术,而转向关注技术背后解决的痛点,原理等。

在这里插入图片描述

如何选择测试框架

测试框架基本上都做了一件事儿:

  • 描述你要测试的东西
  • 对其进行测试
  • 判断是否符合预期

选择框架会考虑下面的点:

  • 测试框架是否有简明的语法与文档。

    Mocha、Jasmine、Jest、AVA、Karma、Nightmare

  • 断言(Assertions):用于判断结果是否符合预期。有些框架需要单独的断言库。

    Should.js、chai、expect.js等等,断言库提供了很多语义化的方法来对值做各种各样的判断。当然也可以不用断言库,Node.js中也可以直接使用原生assert库。

  • 适合 TDD / BDD:是否适合 测试驱动型 / 行为驱动型 的测试风格。

    BDD(Bebavior Driven Developement,行为驱动测试)和TDD(Testing Driven Developement,测试驱动开发)

    BDD和TDD均有各自的适用场景,BDD一般更偏向于系统功能和业务逻辑的自动化测试设计,而TDD在快速开发并测试功能模块的过程中则更加高效,以快速完成开发为目的。下面我们看下BDD和TDD具体的特点:

    BDD的特点:

    • 从业务逻辑的角度定义具体的输入与预期输出,以及可衡量的目标;
    • 尽可能覆盖所有的测试用例情况;
    • 描述一系列可执行的行为,根据业务的分析来定义预期输出。例如,expect, should, assert;
    • 设定关键的测试通过节点输出提示,便于测试人员理解;
    • 最大程度的交付出符合用户期望的产品,避免输出不一致带来的问题。

    TDD的特点:

    • 需求分析,快速编写对应的输入输出测试脚本;
    • 仅在自动测试失败时才编写新代码
    • 重构去除不必要的依赖关系,然后重复测试,最终让程序符合所有要求。
  • 异步测试:有些框架对异步测试支持良好。

  • 使用的语言:大部分 js 测试框架使用 js。

  • 用于特定目的:每个框架可能会擅长处理不同的问题。

    是要测试单个功能、单个组件、还是集成化测试?

    是要测试GUI逻辑、交互?

    是要测试非功能性指标?兼容性?

  • 社区是否活跃。

测试工具的类型

测试工具可分为以下功能。有些只为我们提供了一种功能,有些功能为我们提供了一种组合。

为了实现最灵活的集合功能,通常使用多种工具的组合。

  • 提供UI界面或者CLI工具:(Karma,Jasmine,Jest,TestCafe,Cypress)

    CLI工具会给出一系列测试,以及运行这些测试所需的各种配置和脚手架(运行什么浏览器,使用什么babel插件,如何格式化输出等)

  • 提供测试框架(形成文件目录):(Mocha, Jasmine, Jest, Cucumber, TestCafe, Cypress)

  • 提供断言:(Chai,Jasmine,Jest,Unexpected,TestCafe,Cypress)

    断言函数检查测试返回的结果是否符合预期

  • 生成,展示测试结果(Mocha,Jasmine,Jest,Karma,TestCafe,Cypress)

  • 快照测试(Jest,Ava)

    快照测试(snapshot testing),测试 UI 或数据结构是否和之前完全一致,通常 UI 测试不在单元测试中

  • 提供仿真(Sinon,Jasmine,enzyme,Jest,testdouble)

    仿真(mocks, spies, and stubs):获取方法的调用信息,模拟方法,模块,甚至服务器

  • 生成测试覆盖率报告 (Istanbul, Jest, Blanket)

  • 提供类浏览器环境(Nightwatch, Nightmare, Phantom, Puppeteer, TestCafe, Cypress)

  • 可视化回归工具(Applitools, Percy, Wraith, WebdriverCSS)
    percy.io/), Wraith, WebdriverCSS)


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

相关文章

web前端测试——e2e测试

开发环境:安装有node的macbook(windows没测) 第一步: 创建自己需要测试的项目,如在桌面创建一个test目录作为我们的项目根目录。 打开sublim text ,并将项目拖到sublim text中,方便管理。 第…

E2E 端到端测试学习 - E2E 介绍、Cypress 案例基本使用

E2E 测试介绍 E2E E2E(end to end)端到端测试是最直观可以理解的测试类型。在前端应用程序中,端到端测试可以从用户的视角通过真实浏览器自动检查应用程序是否正常工作。 E2E 把整个系统当作一个黑盒,测试人员模拟真实用户在浏…

Unity射线与UI碰撞检测

问题产生背景:我们有的时候,需要实现射线与3D UI之间的碰撞,当射线碰撞到3D UI之后(将Canvas设置为World Space),调整到合适的位置。使用LineRender表示射线的直观显示,使用一把枪结合第一人称控…

unity中射线碰撞检测总结

这阵子通过看视频,看书对unity中射线碰撞检测,有了一些了解,这里我把它总结一下写下来,希望能帮助到你们,也希望通过各位大神来指正不足之处; 射线碰撞检测,就是由某一物体发射出一道射线&#…

Unity 射线与碰撞范围检测【踩坑记录】

射线检测 射线检测在2D和3D的区别比较大 一定要加上对应的Collider组件 对应的函数只检测对应的Collider,Physics.Raycast是不会检测到Collider 2D的(这个让我有一次debug了好久才发现) 对应API如下 Physics.Raycast(Vector3 origin,Vec…

Unity 碰撞位置

获取碰撞位置的方法1:使用 Collider.ClosestPoint Returns a point on the collider that is closest to a given location. 返回碰撞器上最接近给定位置的点。 下方是子弹打到物体上,生成撞击火星的代码: // 碰撞体的检测 private void O…

Unity入门7——物理系统之碰撞检测

一、刚体 Rigid Body ​ 刚体利用体积(碰撞器 Collider)进行碰撞计算,模拟真实的碰撞效果,产生力的作用 ​ 碰撞产生的必要条件: 两个物体都有碰撞器 Collider至少一个物体有刚体 Mass:质量 默认为千克&a…

解决Unity物体速度过快无法进行碰撞检测(碰撞检测穿透)

一、解决碰撞检测穿透方法一 首先我们知道只要是跟碰撞相关的基本都是离不开刚体 Rigidbody这个组件,刚体中有一个参数适用于检测碰撞的 如下图 Collision Detection就是碰撞检测。 然而有时候开发游戏,对于高速运动的物体(比如&#xff…

【Unity】Unity中获得碰撞体碰撞的位置

有时间的直接看sprite slicer这个插件的代码,原理也是发射线检测,代码逻辑什么的比下面的文章来的好的多,如果有空我也可以整理一下。 在纯物理环境中,为了获得碰撞体碰撞的位置,我们可以使用Collider2D.OnCollisionE…

Unity 3D中的射线与碰撞检测

在我们的游戏开发过程中,有一个很重要的工作就是进行碰撞检测。例如在射击游戏中子弹是否击中敌人,在RPG游戏中是否捡到装备等等。在进行碰撞检测时,我们最常用的工具就是射线,Unity 3D的物理引擎也为我们提供了射线类以及相关的函…

unity3D之简单的碰撞检测 .

版权声明:欢迎订阅公众号【5厘米的理想】,愿生命里的每一个小理想,都能成为生命里的小确幸。本文地址为: http://blog.csdn.net/qinyuanpei/article/details/23093665 大家好,欢迎大家关注由我为大家带来的Unity3D游戏…

Unity碰撞检测的必要条件

Unity中有两个独立的物理引擎,一个用于3D物理系统,一个用于2D物理系统。两个引擎是使用不同的组件实现的。因此BoxCollider和Rigidbody一起使用,代码中用OnTriggerEnter才能检测到触发;BoxCollider2D和Rigidbody2D一起使用,代码中…

Unity3D入门(二):碰撞检测

碰撞器由来 1.系统默认会给每个对象(GameObject)添加一个碰撞组件(ColliderComponent),一些背景对象则可以取消该组件。 2.在unity3d中,能检测碰撞发生的方式有两种,一种是利用碰撞器,另一种则是利用触发器。这两种方式的应用非…

Unity碰撞检测机制的原理(更新中...)

总是碰到关于碰撞的问题,今天实在忍不住了,来把它搞懂,不然听到八叉树,BSP什么的就怕可不行。 转自:http://www.manew.com/thread-102595-1-1.html 碰撞机制 最近做动态地形生成的时候,发现碰撞检测无效&…

Unity 3D之碰撞检测

一、碰撞器 碰撞检测两大必备条件&#xff1a;1.其中一方具备刚体&#xff0c;碰撞双方碰撞器 1、刚体 2、盒子碰撞器 3、碰撞检测方法 void Start(){this.gameObject.AddComponent<Rigidbody>();//添加刚体}void OnCollisionEnter(Collision other){if (other.gameOb…

Unity2d 学习笔记(四)碰撞检测

碰撞检测功能在游戏开发里是比较常用的&#xff0c;比如地图上无法穿越的部分&#xff0c;以及对于敌人的攻击判定等等。这篇博客就开简单介绍一下碰撞事件的处理。 参考视频&#xff1a;Unity碰撞检测_哔哩哔哩_bilibili 首先&#xff0c;我们需要为想要进行碰撞检测的对象添…

2022-04-20 Unity入门7——物理系统之碰撞检测

文章目录 一、刚体 Rigid Body二、碰撞器 Collider三、物理材质四、碰撞检测函数五、刚体加力 一、刚体 Rigid Body ​ 刚体利用体积&#xff08;碰撞器 Collider&#xff09;进行碰撞计算&#xff0c;模拟真实的碰撞效果&#xff0c;产生力的作用 ​ 碰撞产生的必要条件&…

Unity3D —— 碰撞检测

&#xff08;一&#xff09;两种碰撞检测方式 &#xff08;1&#xff09;Collider&#xff1a;碰撞器 ➜需要与刚体一起添加到游戏对象上才能触发碰撞&#xff0c;没有碰撞体的刚体会彼此相互穿过。 碰撞信息检测函数&#xff1a; //碰撞开始 void OnCollisionEnter(Collis…

【Unity入门】24.碰撞检测

【Unity入门】碰撞检测 大家好&#xff0c;我是Lampard~~ 欢迎来到Unity入门系列博客&#xff0c;所学知识来自B站阿发老师~感谢 &#xff08;一&#xff09;碰撞体 &#xff08;1&#xff09;Collider组件 上节课我们有学习到&#xff0c;unity的物理系统提供了更方便的碰撞…

Unity3D教程:简单的碰撞检测

需求&#xff1a;当立方体Cube碰到地面Plane的时候&#xff0c;输出碰撞物体的名称&#xff0c;则表述检测到立方体碰撞了地面。 1.搭建一个简单的场景。 在新的工程中选择File->new Scene创建新的场景。然后在该场景中添加地板&#xff1a;GameObject->Create Other-&…