Android UI自动化测试框架—SoloPi简介

1、UI自动化测试简介

软件测试简介

​软件测试是伴随着软件开发一同诞生的,随着软件规模大型化,结构复杂化,软件测试也从最初的简单“调试”,发展到当今的自动化测试。

​ 自动化测试是什么呢?自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程,自动化测试通常会借助某些工具或者框架。虽然不能完全取代手工测试,但相比手工测试来讲,自动化测试可以减少人力成本,降低重复工作,从而更快速、高效的进行测试活动。

测试金字塔是一种自动化测试过程的金字塔形策略结构,用来指导软件开发过程中各层测试投入的工作量比例,其最早由Mike Cohn在2009年的著作《Scrum敏捷软件开发》中提出。Mike Cohn在书中指出:测试金字塔从上到下分为三层,分别是UI测试、服务/接口测试、单元测试,越接近金字塔底部的测试活动,投入的工作量应该越多,即单元测试投入工作量最多,接口测试次之,UI测试投入最少。

UI测试

​UI测试是最接近软件真实用户使用行为的测试类型。通常是模拟真实用户使用软件的行为,即模拟用户在软件界面上的各种操作,并验证这些操作对应的结果是否正确。

接口测试(API测试)

​ API测试,主要针对的是各模块暴露的接口,通常采用灰盒测试方法。首先以黑盒方式设计如何调用API的测试用例,同时在测试执行过程中统计代码覆盖率,然后根据代码覆盖率情况来补充更多、更有针对性的测试用例。

单元测试

​ 单元测试,属于白盒测试的范畴,通常由开发工程师自己完成,越早发现缺陷其修复成本越低。

为什么要做 UI 自动化?

​ 随着不停的版本迭代,软件新增功能变的越来越多,对测试资源的需求也变得越来越大,执行人工测试的时间越来越长。对于人工测试的依赖开始变得棘手,因此大家开始寻找解决方案,UI 自动化也应运而生。

人工测试存在以下的弊端:

  1. 人工回归测试需要花费很长时间才能完成,很小的延迟就会让发布面临风险。
  2. 发布节奏受到人工回归测试的限制。两天以上的人工回归测试意味着最好的情况下能够一个月发布两次。而且,开发者需要一次性发布所有东西。要么全部发布,要么什么都发布不了,因为需要将所有东西一起测试。

UI 自动化测试存在以下的优点:

  1. 解放了测试团队针对临时的和探索性案例的测试时间;
  2. 可以一边开发一边进行回归测试,减少等待时间;
  3. 可重复性使用,快速进行回归测试;
  4. 更好的利用资源(周未/晚上的资源空闲时段)。

UI 自动化测试的特点

​ 了解到为什么要选择UI自动化测试之后,我们需要了解UI自动化测试的使用场景。UI 即 User Interface(用户界面)的简称,UI 自动化做的事情就是模拟用户行为进行操作,完成对用户界面的测试。这也就从本质上限制了它的使用场景:

  1. 软件需求变动不频繁
  2. 产品更新维护周期长
  3. 比较频繁的回归测试
  4. 自动化测试脚本可重复使用

所以在开始之前,我们最好先认识清楚哪些业务场景是可以自动化测试的。

2、Android UI自动化测试工具

​ UI自动化测试经过多年的发展,也已经涌现出很多优秀的测试工具。下面简单介绍一下Android测试领域内的一些常见的测试工具。

1、Monkey

​ 是Android SDK自带的测试工具,在测试过程中会向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、手势输入等),实现对正在开发的应用程序进行压力测试,也有日志输出。实际上该工具只能做程序做一些压力测试,由于测试事件和数据都是随机的,不能自定义,所以有很大的局限性。

2、MonkeyRunner

​ 也是Android SDK提供的测试工具。严格意义上来说MonkeyRunner其实是一个Api工具包,比Monkey强大,可以编写测试脚本来自定义数据、事件。Monkeyrunner 足够强大了,但是录制的脚本是以坐标轴来作为定位方式,而安卓设备类型众多,各种分辨率,所以移植性不好。

3、Instrumentation

​ 是早期Google提供的Android自动化测试工具类,虽然在那时候JUnit也可以对Android进行测试,但是Instrumentation允许你对应用程序做更为复杂的测试,甚至是框架层面的。通过Instrumentation你可以模拟按键按下、抬起、屏幕点击、滚动等事件。

Instrumentation是通过将主程序和测试程序运行在同一个进程来实现这些功能,你可以把Instrumentation看成一个类似Activity或者Service并且不带界面的组件,在程序运行期间监控你的主程序。

缺点是对测试人员来说编写代码能力要求较高,需要对Android相关知识有一定了解,还需要配置AndroidManifest.xml文件,不能跨多个App。

4、UiAutomator

​ 也是Android提供的自动化测试框架,基本上支持所有的Android事件操作,对比Instrumentation它不需要测试人员了解代码实现细节(可以用UiAutomatorviewer抓取App页面上的控件属性而不看源码)。基于Java,测试代码结构简单、编写容易、学习成本低,一次编译,所有设备或模拟器都能运行测试,能跨App(比如:很多App有选择相册、打开相机拍照,这就是跨App)。缺点是只支持SDK 16(Android 4.1)及以上,不支持Hybird App、WebApp。

5、Espresso

​ 是Google的开源自动化测试框架。相对于UIAutomator,它的特点是规模更小、更简洁,API更加精确,编写测试代码简单,容易快速上手。因为是基于Instrumentation的,所以不能跨App。

6、Selendroid

​ 基于Instrumentation的测试框架,可以测试Native App、Hybird App、Web App,但是网上资料较少,社区活跃度也不大。

7、Robotium

​ 也是基于Instrumentation的测试框架,目前国内外用的比较多,资料比较多,社区也比较活跃。缺点是对测试人员来说要有一定的Java基础,了解Android基本组件,不能跨App。

8、Appium

​ Appium 是目前最主流的移动测试自动化框架,不仅支持 Android 应用,而且适用于 iOS、混合和 Web 应用程序。

它底层完全使用了 Selenium 和 WebDriver 的 API,所以如果你之前有用过 selenium, 几乎不需要额外的学习成本就可以使用 appium。appium 通过 uiautomator(API 级别 16 或更高)和 Seledroid(API 级别低于 16)支持 Android,但是你不需要具体懂这两个框架的具体用法,appium 都已经帮你封装成了统一的使用规则。Appium 的优势之一是几乎可以使用任何编程语言(例如 Java、Objective-C、JavaScript、PHP、Ruby、Python 或 C# 等)编写 Appium 脚本。不需要重新编译或改变应用程序来匹配Appium,Appium有一个非常大而活跃的社区。

9、Airtest

​ 是网易出品的一款基于图像识别和poco控件识别的一款UI自动化测试套件,由Airtest框架、poco框架、airtestIDE 组成。是一个跨平台的UI自动化测试框架,适用于游戏和App。用户不需要一行行的去写代码,而是用屏幕截屏的方式,用截出来的图形排列组合成执行的程序。   另外,Airtest也基于poco这个UI控件搜索框架,这个框架也是网易自家的跨平台U测试框架,原理类似于appium,通过控件的名称,id之类的来定位目标控件,然后调用函数方法,例如click(),swip()之类的方法来对目标控件进行点击或者是操作。

​ 虽然Airtest刚开始是为了游戏测试,现在在app测试中也有很大的应用范围。只是进行录制、执行脚本的AirtestIDE没有开源,不方便进行深度定制。

10、Solopi

​ 是蚂蚁金服开源的一款移动端APP测试工具,提供脚本录制、编辑、回放,结果展示以及一机多控(即通过设备间的socket通讯实现1台手机可以控制多台手机执行脚本)等功能,其测试用例的录制和执行等操作均在手机端的一个APP中完成。不需要借助电脑软件与测试设备交互,所以通信结构比Appium简单高效,对元素的识别也是使用类似于appium的控件的方式,并且引入了类似于airtest的图像识别的方式。

3、SoloPi的介绍

​ 以往的性能测试工具,无外乎三种形态:PC 驱动工具、侵入式的测试模块、ROOT 工具。

PC 工具:除了 Android Studio 自带的性能测试工具,市面上大多数文档都是介绍命令行方法,而且各家方案存在差异,不少还存在错误,实际成型的工具也不多。

侵入式的测试模块:这类工具由于需要侵入到源码中,需要单独打包进行测试,工具本身也可能对性能产生影响。

ROOT 工具:首先是需要 Android 系统的 Root 权限,对于权限管控越来越严格的 Android 系统,其路必将越走越窄。

​ SoloPi提供了一种能够在 Android 手机上不需要 root 也能实现应用提权的方案。可以简单概括为:SoloPi是一种无线化、非侵入、免 Root 的 Android 专项测试方案。

​ 传统的功能测试通常有两种方式:一种是人工手动执行测试,另一种则是编写基于测试框架的自动化脚本。前者成本巨大,为应付不断加速的产品迭代可能需要投入大量人力;而后者则对测试同学的代码能力有不小的要求,这也导致由手动测试转化为自动化测试从而节省人力的进度相对缓慢。

​ SoloPi将传统上仅能用于 PC 的自动化测试能力移植到了移动平台,并根据手机的使用习惯,开发了一套简单易用且功能强大的自动化测试框架。不需要测试同学有代码能力,降低了使用门槛,更方便推广。

​ Solopi主要有以下功能:自动化测试-录制回放、兼容性测试-一机多控、性能测试、稳定性测试。

​ 虽然Appium和Airtest都有很大的应用范围,但是Solopi相比于appium和airtest有以下优势:

改进的控件匹配算法,更高的匹配成功率;

不需要依赖pc端的桌面应用,全部操作都在手机端的app中完成,实现了无线化,随时可测;

不需要代码基础,使用人群覆盖范围广;

提供性能测试的功能等。

(1)整体架构

这套方案中,底层依赖主要是 “无线 ADB、系统辅助功能、Chrome 调试以及图像识别技术”,后文将会介绍它们具体的应用场景。同时,在底层依赖的基础上,封装了一套核心能力,由 “控件定位、事件驱动、性能采集以及依赖注入” 组成,并在服务层实现了录制、回放、数据处理等公共服

务能力。在架构的最顶端,结合界面交互逻辑包装出了各个功能的入口。

(2)录制回放

在录制过程中,SoloPi 会对用户的操作进行拦截,识别用户操作的位置,高亮当前操作的控件,记录用户当前要做的操作类型,在每一步操作后,将操作类型及目标控件的各种信息都记录下来。这里的控件信息包括控件的 ID、文字等基本信息,以及相对布局、截图信息等。

​ 在回放时,SoloPi会逐条解析之前录制的数据,通过智能查找算法,综合各种属性,定位目标控件,找到控件后,就会执行相应的操作,如点击、滑动等。在所有步骤执行后,会展示本次回放的结果,包括日志、截图等信息,作为本次回放的总结。

​ SoloPi 的录制和回放,基于同一套逻辑,包括控件结构构建、控件定位、事件驱动三个部分。两者的区别主要在于控件定位:

在录制过程中,SoloPi 会基于用户的点击行为进行定位;

在用例回放时,SoloPi 会根据录制时记录的控件信息,通过 SoloPi 的控件查找算法进行定位。

(3)底层依赖的核心功能

1)基础依赖

​ 下面主要介绍SoloPi的控件查找功能和操作监控功能需要依赖的基础方案:无线ADB方案和AccessiblityService方案。

无线ADB方案

对于 Android 自动化,ADB shell 的执行能力是一切的基础。在 PC 上,通过 Android SDK 提供的ADB client 与同样运行于 PC 中的 ADB server 通信,再由 ADB server 通过 USB 与位于设备中的 Adbd 通信。要实现一套无线化的方案,必须要摆脱对 USB 线的依赖。好在 Android 系统还提供了一种基于 Socket 的 ADB 连接模式,既然是这样,那么只需要按照 ADB 通信协议在端上与本机的 5555 端口进行通信即可获得 ADB shell 的执行能力。

​ 此无线ADB方案是SoloPi区别于其他UI自动化测试框架的核心方案之一,大家可以在其他项目中借鉴这种无线化方案。

AccessiblityService方案

​ 辅助功能(AccessibilityService)其实是一个Android系统提供给的一种服务,本身是继承Service类的。这个服务提供了增强的用户界面,旨在帮助残障人士或者可能暂时无法与设备充分交互的人们。

​ 从开发者的角度看,主要使用两种功能:查找界面元素,实现模拟点击。

​ UiAutomator(Appium、Airtest使用的方案)和AccessibilityService是有联系的:UiAutomator底层使用的是AccessibilityManagerService,AccessibilityService底层也是使用的AccessibilityManagerService,它们都是通过RPC与AccessibilityManagerService进行交互,获取界面元素和对界面元素进行操作的。区别是:UiAutomator只能在shell环境中执行,AccessibilityService是可以运行在app环境中的,但是需要用户手动开启服务。

2)基础功能

​ 基于以上两种基础能力,下面介绍solopi底层依赖的两种功能:基础控件查找功能、用户操作监控功能。

控件查找功能

随着移动端动态化能力的稳步发展,越来越多的应用采用了 “Native + H5/小程序” 这种混合开发的方案。再考虑到近年来手游行业的飞速发展,手机游戏自动化测试的需求也越来越多。为了尽可能的适配各种场景,SoloPi提供了三种查找模式:

第一种方案的核心就是基于 AccessbilityService 生成当前控件视图树,并记录下id、文字等属性,适用于 Native 场景。

​ 第二种方案基于 Chrome 的调试协议,通过注入js可以获得页面布局以及各元素属性,控件的定位思路与辅助功能这一套方案是一致的。适用于 H5/小程序场景。

​ 第三种方案是图像匹配方案,SoloPi 在端上实现了一套图像比对能力,结合了模板匹配、特征匹配等算法,并做了一定的适配和调优。适用于游戏自动化的场景。

​ 现阶段的开源代码中,native控件和webview中的控件都是使用AccessbilityService生成的控件视图树,断言功能和截图点击功能会使用到图像匹配方案,现阶段基于 Chrome 的调试协议方案未开源。

用户操作监控功能

a、事件获取机制:

​ 关于用于操作监控与控件获取,AccessibilityService 能够获取用户的操作事件并关联对应的控件,可以实现大部分功能。

​ 但 AccessibilityService 也有不足的地方,比如面向 HTML5 场景,辅助功能获取控件会出现延迟从而导致获取的控件结构不够精确;另外,对于部分自定义控件,辅助功能只能获取到对应的控件,但缺乏具体的坐标信息,从而导致控件操作不符合预期。

​ 因此,SoloPi 采取了“结合 Android 系统 getevnet 功能”策略,通过直接解析系统原生事件,获取到用户的操作行为。

简单来说,通过 getevent,SoloPi 可以获取到用户操作屏幕的具体坐标,以及手指落下、抬起的具体时间。不过,getevent 命令的使用需要 SHELL 权限,这限制了普通 Android 应用获取相关数据的能力。SoloPi 通过Android 系统的无线调试功能实现了一套纯端的 SHELL 执行能力,能够在 Android 系统上执行 adb 相关命令。在SoloPi应用中集成了 AdbLib 开源库,包装成一套 ADB 命令执行工具。

​ 通过 getevent 命令,SoloPi 获取到了用户点击的具体坐标,结合 AccessibilityService 获取到当前页面的控件结构树。遍历控件树找到坐标点击位置最上层的控件。

b、事件拦截机制:

​ 在soloPi代码中,当需要拦截事件时,就会设置AccessibilityService进入触摸监控模式(通过此标志位 FLAG_REQUEST_TOUCH_EXPLORATION_MODE)。在此模式下,系统不会在view树中分发事件,各种事件会分发到AccessibilityService的实现类中。此时,soloPi会自己监听get event事件,进行事件的分发和处理。当不需要拦截系统分发事件时,就会重新设置AccessibilityService的标志位。

(4)回放能力的扩展

​ 通过 SoloPi 录制的用例会以 JSON 的形式存储起来,用例不仅可以在设备本地直接回放,还可以通过 SoloPi 的解析器将用例转换为 Appium等目前主流自动化测试框架的脚本,轻松打通云测平台。另外,得益于文本抓取和图像识别能力,SoloPi还实现了在 Android 端录制一遍用例,生成的脚本能够同时在 Android、iOS 双端回放的能力。

(5)脚本编辑

SoloPi还提供了用例步骤的插入、删除、修改等用例编辑功能,可以有效降低用例的维护成本。另外,SoloPi还引入了循环、条件等流程控制能力,若对用例进行合理编排,可轻松实现需要重复操作的工具脚本或是需要暴力回放的稳定性测试脚本。

(6)一机多控

​ 在各类专项测试中,兼容性测试是最为耗时费力的一项,测试人员需要关注各种系统版本、各大手机厂商,各种类型的屏幕等等,想要通过纯人工测试来保证兼容性测试的质量成本是非常高的。

​ SoloPi 在录制回放能力的基础上实现了一套兼容性测试的解决方案。在录制回放的场景中,先是在一台设备上记录了用户的操作,然后再在任意一台设备上实现操作的回放。如果把场景扩展到多台设备上,就可以实现通过一台设备操控多台设备,这套功能称为 “一机多控”。具体说来就是主机与从机建立 Socket 连接,然后在主机上将用户的操作实时发送到各个从机,在从机上完成操作的回放。

一机多控的环境搭建比较灵活,手边的手机在安装 SoloPi 后,通过简单的建联操作即可完成部署。一机多控适配了目前市面上主流机型和 ROM,并封装了一些提升测试效率的快捷功能,如应用安装、数据清理、设备信息查看等等。

(7)性能测试-数据采集

性能数据随手测,本地自动生成报表。数据采集支持手工和广播两种触发方式,易于结合自动化。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你! 

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

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

相关文章

图分割 Graph Partition 学习笔记1

文章目录 前言一、graph-partition是什么?二、具体分类三、graph-partition的意义参考链接 前言 最近在学习图论划分的方法,碰巧搜索到了这个算是对我而言全新的一个体系,在这里将逐步记载自己的学习资料和进度,希望和大家一起探讨…

HAProxy集群与常见的Web集群软件调度器对比

一.常见的Web集群调度器 Web集群调度器分为软件和硬件: 1.常用软件调度器: (1)LVS:性能最好,搭建复杂 (2)Nginx:性能较好,但集群节点健康检查功能呢不强&…

Rust教程:How to Rust-从开始之前到Hello World

本文为第0篇 专栏简介 本专栏是优质Rust技术专栏,推荐精通一门技术栈的蟹友,不建议基础的同学(无基础学Rust也是牛人[手动捂脸]) 感谢Rust圣经开源社区的同学,为后来者提供了非常优秀的Rust学习资源 本文使用&…

为什么不用 index 做 key?

“在 Vue 中,我们在使用 v-for 渲染列表的时候,为什么要绑定一个 key?能不能用 index 做 key?” 在聊这个问题之前我们还得需要知道 Vue 是如何操作 DOM 结构的。 虚拟DOM 我们知道,Vue 不可以直接操作 DOM 结构&am…

避免重复数据产生

在MySQL表中,可以通过创建唯一索引或唯一约束来确保表中除了ID以外的其他字段不能有两条记录相同的值。 创建唯一索引: CREATE UNIQUE INDEX index_name ON table_name (column1, column2, ...); 其中,index_name是索引的名称,ta…

AI大模型,掀起新一波智能浪潮!

AI大模型的出现,标志着人工智能技术迈入了一个新的阶段。这些巨大的模型不仅在规模上超越了以往任何其他人工智能系统,而且在性能上也取得了巨大的突破。由于其庞大的参数量和复杂的结构,AI大模型在各个领域展现出了强大的学习能力和推理能力…

【机器学习】在Python中进行K-Means聚类和层次聚类

Python中聚类算法API的使用指南 聚类分析是数据分析中一种常见的无监督学习方法,通过将相似的对象分组在一起,我们能够识别出数据集中的自然分群。本文将介绍如何使用Python中的聚类算法接口,KMeans和层次聚类方法。 K-Means 聚类 K-Means…

EdgeX Foundry - 连接 Modbus 设备

文章目录 一、概述1.安装说明2.Modbus Slave 工具 二、连接 Modbus 设备1.docker-comepse2.设备配置文件3.启动 EdgeX Foundry4.访问 UI4.1. consul4.2. EdgeX Console 5.创建 Modbus 设备5.1.创建设备配置文件5.2.添加设备 6.测试6.1.命令6.2.事件6.3.读值 EdgeX Foundry # E…

JavaEE进阶篇 (一) -- Maven

写在前:Hello各位小伙伴们,这一部分主要对JavaEE进阶部分内容进行学习记录,关于前面学习的内容也会同步更新~~ 在学习新内容之前,需要了解一下基础的内容: JavaEE(Java Platform Enterprise Edition),Java平台企业版&…

面试经典150题——环形链表

Suffering, for the weak is the tomb of death, and for the strong is the soil of germinal ambition.​ 1. 题目描述 2. 题目分析与解析 2.1 思路一 这个题目就是判断一个链表有没有环,其实我们之讲过一个题目,就实现了判断链表有没有环的步骤&a…

LeetCode---387周赛

题目列表 3069. 将元素分配到两个数组中 I 3070. 元素和小于等于 k 的子矩阵的数目 3071. 在矩阵上写出字母 Y 所需的最少操作次数 3072. 将元素分配到两个数组中 II 一、将元素分配到两个数组中I 直接按照题目要求进行模拟即可,代码如下 class Solution { p…

探索 ON1 Resize Ai 2023.5 for Mac/win:释放图像的无限可能

ON1 Resize AI 2023.5 for Mac/Win 是一款专业的图像无损放大软件,通过人工智能技术,能够将图像放大至更高的分辨率,同时保持图像细节和清晰度的最佳状态。该软件的强大功能和直观的操作界面,使它成为摄影师、设计师和艺术家的理想…

讲解人工智能在现代科技中的应用和未来发展趋势。

目录 1.人工智能在现代科技中的应用 1.1医疗健康 1.2交通运输 1.3金融服务 1.4教育 1.5制造业 1.6客户服务 2.未来发展趋势 2.1泛化能力提升 2.2跨领域集成学习 2.3增强的可解释性和透明度 2.4AI伦理和法规 2.5量子计算与AI的结合 2.6AI与物联网(IoT&…

滴滴一面:Keepalived+Nginx高可用,如何实现IP跳跃?(1)

尼恩说在前面 HashMap的工作原理是目前java面试问的较为常见的问题之一,在40岁老架构师 尼恩的读者交流群(50)中,最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、shein 希音、百度、网易的面试资格,遇到很多很重要的面试…

OpenCV学习笔记(四)——对视频的读取操作

目录 读取视频内容 将彩色视频转换为灰色视频 读取视频内容 读取视频文件通常分为读取文件、验证是否打开成功打开文件、逐帧读取视频文件、释放资源和关闭窗口 (1)读取文件 在OpenCV中,通常使用VedioCapture来读取视频流,Vedi…

图的单源最短路径问题

目录 一、简述 二、前置配置 三、迪杰斯特拉算法 四、改进的迪杰斯特拉算法 五、贝尔曼福特算法 一、简述 图是一种比较常用的数据结构,将问题转换成图相关的思路也是比较常用的。 图的单源最短路径问题,也就是图中某一个节点到图中其他节点的最短路…

基于JAVA+ springboot实现的抗疫物质信息管理系统

基于JAVA springboot实现的抗疫物质信息管理系统设计和实现 博主介绍:多年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 …

macOS上实现「灵动岛」效果

自从Apple iPhone推出了「灵动岛」功能后,用户们就被其优雅的设计和强大的功能所吸引。然而,作为macOS用户,我们一直在等待这一功能能够在我们的设备上实现。现在,随着新的应用程序的推出,我们终于可以在我们的Mac上体…

JWT的是什么

session共享 什么是session共享 Session共享是指在分布式系统中,在多个服务器之间共享同一个用户的会话数据。在传统的Web应用中,用户的会话信息通常存储在服务器端的Session中,而每个用户的请求在同一个服务器上处理,因此可以轻…