当前位置: 首页 > news >正文

Android测试王炸:Appium + UI Automator2

Android平台主流开源框架简介

在Android平台上,有多个开源且好用的自动化测试框架。以下是几个被广泛使用和认可的框架:

1.1

Appium

Appium是一个跨平台的移动测试工具,支持iOS和Android上的原生、混合及移动Web应用。

它使用了供应商提供的UI框架(如iOS中的XCTest和Android中的UIAutomator或Instrumentation)来实施测试,并将这些框架封装到Selenium WebDriver中,允许开发者使用多种编程语言编写测试脚本。

优点包括不需要重新编译应用程序或安装额外的东西到设备上,拥有活跃的社区支持。

1.2

UI Automator

这是另一个由Google提供的Android UI测试框架,它允许进行黑盒测试,即不需要了解应用内部结构。

支持跨应用功能测试,例如从一个应用跳转到另一个应用。

缺点是不支持WebView元素,所以对于混合应用的支持有限。

1.3

Espresso

Espresso是由Google开发的一个轻量级的Android UI测试框架,适合于白盒测试。

它与被测应用运行在同一进程中,因此可以访问应用内部状态,使得测试更加可靠快速。

主要用于单个应用内的交互测试,不直接支持跨应用测试,但可以通过联合测试解决这一限制。

1.4

Robotium

Robotium是一款成熟的Android UI测试框架,能够执行灰盒测试。

支持对本地和混合应用进行全面的测试,包括活动、按钮、菜单等UI组件以及手势操作。

测试可以在真实设备或模拟器上运行,并且可以作为持续集成的一部分,官网已经搜不到了,不确定是否还有人维护。

1.5

Selendroid

Selendroid是一个基于Instrumentation的框架,完全兼容WebDriver协议。

它可以在模拟器和实际设备上使用,并且可以集成网格节点以扩展测试规模。不过,随着Appium的发展,Selendroid逐渐式微。

Appium简介

2.1

发展历史

Appium的发展历史可以追溯到2012年,它从一个简单的想法逐渐成长为最受欢迎的开源跨平台移动自动化测试框架之一。以下是Appium发展的关键里程碑:

早期灵感与创建

2011年:Dan Cuellar 在担任Zoosk的测试经理时遇到了iOS应用程序测试的问题,意识到需要一种更好的方法来自动化测试过程。

2012年:Dan在Selenium大会上展示了他的项目,并进行了闪电演讲。他的演示引起了广泛关注,尤其是Jason Huggins(Selenium的共同创始人)的兴趣。

开源与社区支持

2012年8月:Dan在他的GitHub上发布了C#版本的源代码,并上传了基于Python实现的新版本。

2012年9月:Jason添加了一个Web服务器,并开始通过HTTP实现WebDriver有线协议,使iOSAuto可以从任何语言的任何Selenium WebDriver客户端库编写脚本。

2013年1月:Sauce Labs决定全力支持Appium,并提供更多的开发能力。团队选择使用Node.js作为框架,为Appium的基本架构奠定了基础。

成长与成熟

2014年5月:发布了Appium 1.0,这是Appium发展的一个重要里程碑。此时,Appium已经成为最受欢迎的开源跨平台移动自动化框架。

2016年末:为了保持Appium的开源状态,Sauce Labs将Appium作为一个项目捐赠给了JS Foundation(后来合并到了OpenJS Foundation),确保其在社区中长期地发展。

生态系统扩展

2013年初至2016年:期间,Appium增加了对Android和Selendroid的支持,成为第一个真正的跨平台自动化框架。项目继续吸引用户和贡献者,功能不断丰富,错误得到修复,稳定性也得到了改善。

Appium 2.0发布

2023年:Appium 2发布,重点放在将Appium作为一个生态系统而不是单一项目上。任何人都可以开发和共享驱动程序和插件,这为实现iOS和Android之外的平台自动化开发开辟了无限的可能性。

持续发展

自成立以来,Appium一直由不同的个人和组织指导,并且曾经用三种不同的编程语言实现过。随着Appium加入OpenJS Foundation,它持续获得来自全球开发者社区的支持,不断发展以满足新的需求和技术趋势。

Appium的历史反映了它从一个小型实验性项目成长为一个强大的、广泛采用的工具的过程,同时也体现了开放源码的力量以及社区合作的重要性。今天,Appium仍然是移动应用自动化测试领域的重要参与者,支持着数以千计的应用程序的开发和测试工作。

2.1

优点与缺点

优点

跨平台支持:

  1. Appium支持iOS、Android和Windows应用程序的自动化测试,这意味着你可以用同一套API来编写针对不同平台的测试脚本。

  2. 无需重新编译应用

    测试人员不需要访问应用程序的源代码或对应用程序进行任何修改就可以直接进行自动化测试,这使得它非常适合用于黑盒测试。

  3. 使用WebDriver协议:

    Appium基于W3C WebDriver标准构建,允许用户利用现有的Selenium WebDriver客户端库来编写测试脚本,从而简化了学习曲线,并且可以与现有的CI/CD工具链无缝集成。

  4. 丰富的社区支持:

    由于其开源性质,Appium拥有一个活跃且庞大的开发者社区,提供了大量的插件、扩展和其他资源,帮助解决常见问题并加速开发过程。

  5. 灵活性和可扩展性:

    支持多种编程语言(如Java, Python, Ruby, JavaScript等),并且可以通过自定义驱动程序和插件来适应特定需求。

  6. 强大的UI元素识别能力:

    利用内置的定位策略(例如通过XPath、ID、Accessibility ID等)来识别屏幕上的UI组件,提供稳定的元素查找机制。

  7. 良好的文档和支持:

    官方网站提供了详尽的文档和指南,包括安装说明、示例代码以及最佳实践建议。

  1. 性能问题:

    在某些情况下,尤其是在复杂的应用场景中,Appium可能会表现出比原生工具更慢的速度,这是因为它依赖于多个层之间的通信(比如从客户端到服务器再到设备)。

  2. 初期设置较为复杂:

    尽管有详细的文档,但初次配置环境(特别是对于初学者)可能需要花费一定的时间去理解和解决问题,例如配置Appium Server、正确安装依赖项等。

  3. 对WebView的支持有限:

    虽然Appium已经增强了对WebView内容的操作能力,但在处理混合模式(native+web)应用时仍然可能存在挑战,特别是在确保稳定性和速度方面。

  4. 依赖外部服务和工具:

    Appium本身并不包含所有必要的功能;它经常需要与其他工具和服务一起工作,例如模拟器/真机管理工具、报告生成工具等,这增加了整体架构的复杂度。

  5. 版本兼容性问题:

    随着操作系统版本更新和技术栈的发展,可能会遇到新旧版本间的兼容性问题,导致测试脚本需要定期维护以保持最新状态。

  6. 不稳定的行为:

    在某些情况下,Appium可能会出现不稳定的行为,比如偶发性的崩溃或无法可靠地执行某些命令,这些问题通常与底层平台的变化有关。

总的来说,Appium是一个强大而灵活的工具,适合那些希望在一个平台上同时测试iOS和Android应用程序的企业和个人开发者。然而,了解它的优势和潜在限制可以帮助你做出更好的决策,并为可能出现的问题做好准备。

2.3

核心概念

Appium作为一款强大的移动应用自动化测试框架,有几个核心概念对于理解和使用它是至关重要的。以下是Appium的一些关键概念:

  1. WebDriver协议:

    Appium基于W3C WebDriver标准构建,这是一个浏览器自动化接口的标准。它允许开发者通过HTTP请求来控制浏览器或移动应用程序的行为。WebDriver API提供了丰富的命令集,用于模拟用户与应用的交互,如点击、输入文本等。

  2. Appium Server:

    Appium Server是Appium的核心组件之一,它充当客户端(测试脚本)和移动设备/模拟器之间的中间件。服务器接收来自客户端的命令,然后将这些命令转换为适合目标平台的本地驱动程序(例如XCUITest Driver for iOS, UiAutomator2 Driver for Android)可以理解的指令,并执行相应的操作。

  3. 客户端库(Client Libraries):

    为了方便地编写测试脚本,Appium支持多种编程语言的客户端库,如Java、Python、Ruby、JavaScript (Node.js) 等。这些库实现了WebDriver协议,让开发者可以用自己熟悉的语言编写自动化测试。

  4. Desired Capabilities:

    Desired Capabilities是一组键值对参数,用来配置测试会话的属性。它们告诉AppiumServer关于要启动的应用程序的信息,例如平台名称(iOS或Android)、设备信息、应用程序路径等。这些设置在创建一个新的测试会话时提供给Appium Server。

  5. 驱动程序(Drivers):

    驱动程序是负责与特定操作系统进行通信的部分。对于不同的平台(如iOS、Android),Appium使用不同的驱动程序来执行自动化任务。例如,UiAutomator2用于Android,而XCUITest则用于iOS。每个驱动程序都有自己的特点和能力,以适应各自平台的独特需求。

  6. 元素定位(Element Locators):

    元素定位是指如何在应用程序界面上找到UI组件。Appium提供了多种策略来定位元素,包括但不限于ID、XPath、Accessibility ID、类名等。选择合适的定位策略对于确保测试的稳定性和可靠性至关重要。

  7. 插件系统(Plugin System):

    从Appium 2.0开始引入了插件系统,使得扩展Appium功能变得更加容易。插件可以添加新的命令、改变现有行为或者集成第三方服务。这为定制化和增强Appium的能力提供了极大的灵活性。

  8. 平台独立性(Platform Independence):

    尽管Appium本身需要根据平台的不同使用不同的驱动程序,但它设计成尽可能保持跨平台的一致性。这意味着你可以在不同平台上使用相似的API调用,减少了学习成本并提高了代码复用率。

  9. 混合应用支持(Hybrid Apps Support):

    对于混合应用(即包含原生和Web内容的应用),Appium能够切换上下文,在原生视图和WebView之间无缝切换,以便测试不同部分的功能。

理解上述核心概念有助于更好地掌握Appium的工作原理及其使用方法,从而更有效地进行移动应用的自动化测试。

UI Automator简介

3.1

发展历史

UI Automator是Google为Android平台开发的自动化测试框架之一,首次发布于2012年。它的设计目的是为了简化Android应用的UI测试流程,并允许开发者和测试人员在无需了解应用程序内部结构的情况下对应用进行黑盒测试。

随着Android系统的不断发展,UI Automator也经历了多次迭代,以适应新的API级别和功能需求。尽管如此,在2021年Google I/O大会上,Google宣布了UI Automator将逐渐被Espresso取代作为官方推荐的UI测试工具,但UI Automator仍然可以用于跨应用测试等特定场景。

3.2

优点和缺点

优点

  1. 黑盒测试:

    UI Automator不依赖于应用程序的源代码或内部实现细节,这使得它非常适合用来测试第三方应用或者当您不想暴露内部逻辑时。

  2. 跨应用测试:

    与仅限于单个应用内的Espresso不同,UI Automator可以跨越多个应用边界执行操作,这对于测试涉及多个应用之间的交互的用例非常有用。

  3. 稳定性:

    由于直接运行在设备上并使用系统级服务,UI Automator提供的测试通常比较稳定,不容易受到应用重启等因素的影响。

  4. 类型:

    UI Automator能够识别并操作各种标准的Android UI组件,如按钮、文本框、列表等。

缺点

  1. 性能问题:

    相较于Espresso,UI Automator可能会稍微慢一些,尤其是在复杂的布局中查找视图元素时。

  2. WebView限制:

    对于包含WebView的应用,UI Automator不能直接与网页内容交互,需要额外的方法来处理这类情况。

  3. 更新频率较低:

    因为不再是最主要的官方推荐测试工具,所以UI Automator的更新和支持可能不如以前频繁。

3.3

常用方法

UI Automator提供了丰富的API来帮助用户创建强大的自动化测试脚本。以下是一些常用的API方法:

  • UiDevice: 提供了对整个设备状态的操作接口,例如点击屏幕上的任意位置、按返回键、获取当前窗口信息等。

UiDevice.getInstance().pressHome(); // 按下Home键

  • UiObject: 表示一个具体的UI元素,可以通过属性(如resource-id, text)来定位,并且可以对其执行一系列动作(如点击、长按、输入文本等)。

UiObject button = new UiObject(new UiSelector().text("Submit"));button.click();

  • UiCollection: 用于遍历和操作一组相似的UI元素,比如列表项。​​​​​​​

UiCollection list = new UiCollection(newUiSelector().className("android.widget.ListView"));UiObject item = list.getChildByText(newUiSelector().className("android.widget.TextView"), "Item Name");
  • UiScrollable: 当UI元素不在屏幕可见范围内时,可以使用此对象来滚动视图直到目标元素出现。​​​​​​​

UiScrollable scrollable = new UiScrollable(newUiSelector().scrollable(true));UiObject element = scrollable.getChildByText(newUiSelector().className("android.widget.TextView"), "Desired Text");element.click();
  • UiSelector: 是一个构建器类,用于定义要查找的UI元素的选择条件,可以组合多个属性来精确定位。​​​​​​​

UiObject checkBox = new UiObject(newUiSelector().resourceId("com.example:id/checkbox").checked(false));checkBox.click();​​​​​​​

通过这些API,大家可以构建出不同场景下的测试用例,来保证我们应用程序的稳定性。

相关文章:

Android测试王炸:Appium + UI Automator2

Android平台主流开源框架简介 在Android平台上,有多个开源且好用的自动化测试框架。以下是几个被广泛使用和认可的框架: 1.1 Appium Appium是一个跨平台的移动测试工具,支持iOS和Android上的原生、混合及移动Web应用。 它使用了供应商提供的…...

用Python打造增强现实的魔法:实时对象叠加系统全解析

友友们好! 我是Echo_Wish,我的的新专栏《Python进阶》以及《Python!实战!》正式启动啦!这是专为那些渴望提升Python技能的朋友们量身打造的专栏,无论你是已经有一定基础的开发者,还是希望深入挖掘Python潜力的爱好者,这里都将是你不可错过的宝藏。 在这个专栏中,你将会…...

const let var 在react jsx中的使用方法 。

在 JavaScript 里,const 和 let 都是 ES6(ES2015)引入的用于声明变量的关键字,它们和之前的 var 关键字有所不同。下面为你详细介绍 const 和 let 的区别: 1. 块级作用域 const 和 let 都具备块级作用域,…...

C++隐式转换的机制、风险与消除方法

引言 C作为一门强类型语言,类型安全是其核心特性之一。 然而,隐式转换(Implicit Conversion)的存在既为开发者提供了便利,也可能成为程序中的“隐藏炸弹”。 一、隐式转换的定义与分类 1.1 什么是隐式转换&#xf…...

Python 为什么要保留显式的 self ?

当你在类中定义方法时,Python要求第一个参数必须表示当前对象实例。当你调用obj.method(),Python 本质上会将它转换为ClassName.method(obj)。 所以你需要通过self参数显式接收这个实例,才能访问该对象的属性和其他方法。如果不加self&#…...

Linux 性能调优之CPU认知

写在前面 博文内容为《性能之巅 系统、企业与云可观测性(第2版)》CPU 章节课后习题答案整理内容涉及: CPU 术语,指标认知CPU 性能问题分析解决CPU 资源负载特征分析应用程序用户态CPU用量分析理解不足小伙伴帮忙指正对每个人而言,真正的职责只有一个:找到自我。然后在心中…...

认识vue中的install和使用场景

写在前面 install 在实际开发中如果你只是一个简单的业务实现者,那么大部分时间你是用不到install的,因为你用到的基本上都是别人封装好的插件、组件、方法、指令等等,但是如果你需要给公司的架构做建设,install就是你避不开的一个…...

C++Cherno 学习笔记day17 [66]-[70] 类型双关、联合体、虚析构函数、类型转换、条件与操作断点

b站Cherno的课[66]-[70] 一、C的类型双关二、C的union(联合体、共用体)三、C的虚析构函数四、C的类型转换五、条件与操作断点——VisualStudio小技巧 一、C的类型双关 作用:在C中绕过类型系统 C是强类型语言 有一个类型系统,不…...

3.神经网络

神经网络 神经元与大脑 神经网络神经元的结构: 输入(Input):接收来自前一层神经元的信息。 权重(Weights):每个输入都有一个权重,表示其重要性。 加权和(Weighted Sum&a…...

CentOS 7安装Python3.12

文章目录 使用pyenv安装python3.12一、gitub下载pyenv二、升级GCC三.升级openssl这样python3.12.9就完成安装在CentOS上啦! 使用pyenv安装python3.12 一、gitub下载pyenv https://github.com/pyenv/pyenv 按照README,pyenv教程安装即可 二、升级GCC 安…...

微服务无感发布实践:基于Nacos的客户端缓存与故障转移机制

微服务无感发布实践:基于Nacos的客户端缓存与故障转移机制 背景与问题场景 在微服务架构中,服务的动态扩缩容、滚动升级是常态,而服务实例的上下线需通过注册中心(如Nacos)实现服务发现的实时同步。但在实际生产环境…...

5.2 自定义通知操作按钮(UNNotificationAction)

在本地推送通知中添加自定义操作按钮可以增强用户交互性,让用户无需打开应用就能执行一些快速操作。本节将详细介绍如何在SwiftUI应用中实现这一功能。 基本概念 UNNotificationAction 和 UNNotificationCategory 是UserNotifications框架中用于定义通知交互的核心…...

Python与链上数据分析:解锁区块链数据的潜力

Python与链上数据分析:解锁区块链数据的潜力 引言 区块链技术的兴起不仅改变了金融行业,也为数据分析领域带来了全新的机遇。链上数据(On-chain Data)是区块链网络中公开透明的交易记录和活动数据,它为我们提供了一个独特的视角,去观察用户行为、市场趋势以及网络健康状…...

数字化转型:未来已来,企业如何抢占先机?

近年来,“数字化转型”从一个技术热词逐渐演变为各行各业的“必选项”。无论是全球市场还是中国市场,数字化浪潮正以不可逆的姿态重塑商业生态。据IDC预测,到2028年,中国数字化转型市场规模将突破7300亿美元,全球投资规…...

Web3游戏全栈开发实战指南:智能合约与去中心化生态构建全解析

在GameFi市场规模突破千亿美元的当下,去中心化游戏系统开发正面临技术架构升级与生态融合的双重机遇。本文基于Solidity、Rust等多链智能合约开发经验,结合Truffle、Hardhat等主流框架,深度解析如何构建高性能、高收益的链游生态系统。 一、…...

Windows 图形显示驱动开发-WDDM 2.0功能_IoMmu 模型

概述 输入输出内存管理单元 (IOMMU) 是一个硬件组件,它将支持具有 DMA 功能的 I/O 总线连接到系统内存。 它将设备可见的虚拟地址映射到物理地址,使其在虚拟化中很有用。 在 WDDM 2.0 IoMmu 模型中,每个进程都有一个虚拟地址空间&#xff0…...

uniapp微信小程序基于wu-input二次封装TInput组件(支持点击下拉选择、支持整数、电话、小数、身份证、小数点位数控制功能)

一、 最终效果 二、实现了功能 1、支持输入正整数---设置specifyTypeinteger 2、支持输入数字(含小数点)---设置specifyTypedecimal,可设置decimalLimit来调整小数点位数 3、支持输入手机号--设置specifyTypephone 4、支持输入身份证号---设…...

Java 大厂面试题 -- JVM 深度剖析:解锁大厂 Offe 的核心密钥

最近佳作推荐: Java大厂面试高频考点|分布式系统JVM优化实战全解析(附真题)(New) Java大厂面试题 – JVM 优化进阶之路:从原理到实战的深度剖析(2)(New&#…...

小白入门JVM、字节码、类加载机制图解

前提知识~ JDK 基本介绍 JDK 的全称(Java Development Kit Java 开发工具包)JDK JRE java 的开发工具[java, javac,javadoc,javap 等]JDK 是提供给Java 开发人员使用的,其中包含了java 的开发工具,也包括了JRE。可开发、编译、调试…… JRE 基本介绍…...

新能源汽车动力性与经济性优化中的经典数学模型

一、动力性优化数学模型 动力性优化的核心目标是提升车辆的加速性能、最高车速及爬坡能力,主要数学模型包括: 1. 车辆纵向动力学模型 模型方程: 应用场景: 计算不同工况下的驱动力需求匹配电机扭矩与减速器速比案例&#xff…...

高级java每日一道面试题-2025年3月25日-微服务篇[Nacos篇]-Nacos中的命名空间(Namespace)有什么作用?

如果有遗漏,评论区告诉我进行补充 面试官: Nacos中的命名空间(Namespace)有什么作用? 我回答: 在Java高级面试中,关于Nacos中的命名空间(Namespace)的作用,是一个考察候选人对微服务架构和配…...

5.JVM-G1垃圾回收器

一、什么是G1 二、G1的三种垃圾回收方式 region默认2048 三、YGC的过程(Step1) 3.1相关代码 public class YGC1 {/*-Xmx128M -XX:UseG1GC -XX:PrintGCTimeStamps -XX:PrintGCDetails -XX:UnlockExperimentalVMOptions -XX:G1LogLevelfinest128m5% 60%6.4M 75M*/private stati…...

变量、数据、值类型引用类型的存储方式

代码写了也有2年了,对于这些基础的程序名词,说出口也是模棱两可,心里很不爽,很多基础还是模糊不清,清算一下...... Example值类型: int x 10; 变量:“x”是一个标识符,它对应着栈…...

分布式和微服务的区别

1. 定义 在讨论分布式系统和微服务的区别之前,我们先明确两者的定义: 分布式系统:是一组相互独立的计算机,通过网络协同工作,共同完成某个任务的系统。其核心在于资源的分布和任务的分解。 微服务架构:是…...

数组的常见算法一

注: 本文来自尚硅谷-宋红康仅用来学习备份 6.1 数值型数组特征值统计 这里的特征值涉及到:平均值、最大值、最小值、总和等 **举例1:**数组统计:求总和、均值 public class TestArrayElementSum {public static void main(String[] args)…...

Leedcode刷题 | Day27_贪心算法01

一、学习任务 455.分发饼干代码随想录376. 摆动序列53. 最大子序和 二、具体题目 1.455分发饼干455. 分发饼干 - 力扣(LeetCode) 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对…...

springboot集成kafka,后续需要通过flask封装restful接口

Spring Boot与Kafka的整合 在现代软件开发中,消息队列是实现服务解耦、异步消息处理、流量削峰等场景的重要组件。Apache Kafka是一个分布式流处理平台,它具有高吞吐量、可扩展性和容错性等特点。Spring Boot作为一个轻量级的、用于构建微服务的框架&am…...

MYSQL数据库语法补充2

一,数据库设计范式(原则) 数据库设计三大范式: 第一范式: 保证列的原子性(列不可再分) 反例:联系方式(手机,邮箱,qq) 正例: 手机号,qq,邮箱. 第二范式: 要有主键,其他列依赖于主键列,因为主键是唯一的,依赖了主键,这行数据就是唯一的. 第三范式: 多表关联时,在…...

Flask返回文件方法详解

在 Flask 中返回文件可以通过 send_file 或 send_from_directory 方法实现。以下是详细方法和示例: 1. 使用 send_file 返回文件 这是最直接的方法,适用于返回任意路径的文件。 from flask import Flask, send_fileapp = Flask(__name__)@app.route("/download")…...

随机数据下的最短路问题(Dijstra优先队列)

题目描述 给定 NN 个点和 MM 条单向道路,每条道路都连接着两个点,每个点都有自己编号,分别为 1∼N1∼N 。 问你从 SS 点出发,到达每个点的最短路径为多少。 输入描述 输入第一行包含三个正整数 N,M,SN,M,S。 第 22 到 M1M1 行…...

CPP杂项

注意:声明类,只是告知有这个类未完全定义,若使用类里具体属性,要么将访问块(函数之类)放到定义后,要么直接完全定义 C 友元函数/类的使用关键点(声明顺序为核心) 1. 友元…...

Idea将Java工程打包成war包并发布

1、问题概述? 项目开发之后,我们需要将Java工程打包成war后缀,并进行发布。之前在网上看到很多的文章,但是都不齐全,今天将提供一个完整的实现打包war工程,并发布的文章,希望对大家有所帮助,主要解决如下问题: 1、war工程需要满足的相关配置 2、如何解决项目中的JDK…...

多级缓存模型设计

为了有效避免缓存击穿、穿透和雪崩的问题。最基本的缓存设计就是从数据库中查询数据时,无论数据库中是否存在数据,都会将查询的结果缓存起来,并设置一定的有效期。后续请求访问缓存时,如果缓存中存在指定Key时,哪怕对应…...

SGLang实战:从KV缓存复用到底层优化,解锁大模型高效推理的全栈方案

在当今快速发展的人工智能领域,大型语言模型(LLM)的应用已从简单对话扩展到需要复杂逻辑控制、多轮交互和结构化输出的高级任务。面对这一趋势,如何高效地微调并部署这些大模型成为开发者面临的核心挑战。本文将深入探讨SGLang——这一专为大模型设计的高…...

【中大厂面试题】腾讯 后端 校招 最新面试题

操作系统 进程和线程的区别 本质区别:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位 在开销方面:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销&am…...

数据结构第六章(一) -图

数据结构第六章(一) 图一、图的基本概念1.图的分类、度、权等2.路径、回路、连通等3.连通分量、生成树等 二、几种特殊的图1.完全图2.稠密图、稀疏图3.树、有向树 三、常见考点总结 图 一、图的基本概念 感觉要想怎么定义图,图就是顶点和边组…...

【技术白皮书】外功心法 | 第三部分 | 数据结构与算法基础(常用的数据结构)

数据结构与算法基础 什么是算法?算法效率查询和排序为什么排序如此重要?思考问题如何确定复杂性数据结构连续或链接的数据结构链表的优点数组的优点数组集合Set 声明的一些方法有Multiset多元集合栈和队列何时使用栈和队列数据字典字典Hash的实现时间复杂度对时间的影响什么是…...

spark简介和安装

spark概念 Spark 是一种基于内存的快速、通用、可扩展的大数据分析计算引擎 spark核心模块 Spark Core Spark Core 中提供了 Spark 最基础与最核心的功能,Spark 其他的功能如:Spark SQL,Spark Streaming,GraphX, MLlib 都是在 …...

如何在 CentOS 7 系统上以容器方式部署 GitLab,使用 ZeroNews 通过互联网访问 GitLab 私有仓库,进行代码版本发布与更新

第 1 步: 部署 GitLab 容器​ 在开始部署 GitLab 容器之前,您需要创建本地目录来存储 GitLab 数据、配置和日志: #创建本地目录 mkdir -p /opt/docker/gitlab/data mkdir -p /opt/docker/gitlab/config mkdir -p /opt/docker/gitlab/log#gi…...

springboot Filter实现请求响应全链路拦截!完整日志监控方案​​

一、为什么你需要这个过滤器?​​ 日志痛点: 🚨 请求参数散落在各处? 🚨 响应数据无法统一记录? 🚨 日志与业务代码严重耦合? ​​解决方案​​: 一个Filter同时拦截请…...

spring mvc 在拦截器、控制器和视图中获取和使用国际化区域信息的完整示例

在拦截器、控制器和视图中获取和使用国际化区域信息的完整示例 1. 核心组件代码示例 1.1 配置类(Spring Boot) import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.spring…...

docker部署jenkins并成功自动化部署微服务

一、环境版本清单: docker 26.1.4JDK 17.0.28Mysql 8.0.27Redis 6.0.5nacos 2.5.1maven 3.8.8jenkins 2.492.2 二、服务架构:有gateway,archives,system这三个服务 三、部署步骤 四、安装linux 五、在linux上安装redis&#…...

android 14.0 工厂模式 测试音频的一些问题(高通)

1之前用tinycap,现在得用agmcap 执行----agmcap /data/test.wav -D 100 -d 101 -i CODEC_DMA-LPAIF_RXTX-TX-3 -T 3 报错1 agmcap data/test.wav -D 100 -d 101 -i CODEC_DMA-LPAIF_RXTX-TX-3 -T 3 Failed to open xml file name /vendor/etc/backend_co…...

vue:前端预览 / chrome浏览器设置 / <iframe> 方法预览 doc、pdf / vue-pdf 预览pdf

一、本文目标 <iframe> 方法预览 pdf 、word vue-pdf 预览pdf 二、<iframe> 方法 2.1、iframe 方法预览需要 浏览器 设置为&#xff1a; chrome&#xff1a;设置-隐私设置和安全性-网站设置-更多内容设置-PDF文档 浏览器访问&#xff1a; chrome://settings/co…...

Axure疑难杂症:详解横向菜单左右拖动效果及阈值说明

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! 课程主题:横向菜单左右拖动 主要内容:菜单设计、拖动效果、阈值设计 应用场景:APP横向菜单栏、台账菜单栏、功能选择栏等 案例展示: 案例视频: 横向菜单左右拖动效果 正文内容: 最近很多粉丝私信我,横向…...

多视图几何--立体校正--Bouguet方法

Bouguet算法的数学原理详解 Bouguet算法的核心目标是实现双目相机的极线校正&#xff0c;使左右图像的对应点位于同一水平线上&#xff0c;从而简化立体匹配。其数学原理围绕旋转矩阵分解、极线约束构造和重投影优化展开&#xff0c;以下是分步推导&#xff1a; 一、坐标系定义…...

debian12 mysql完全卸载

MySQL 的数据目录通常是 /var/lib/mysql&#xff0c;配置文件通常在 /etc/mysql 目录下。使用以下命令删除这些目录&#xff1a; sudo rm -rf /var/lib/mysql sudo rm -rf /etc/mysql清理残留文件 sudo find / -name "mysql*" -exec rm -rf {} \; 2>/dev/null验…...

随机动作指令活体检测技术的广泛应用,为人脸识别安全保驾护航

随着人脸识别技术在金融支付、门禁系统、手机解锁等领域的广泛应用&#xff0c;攻击手段也日益多样化&#xff0c;如照片、视频回放、3D面具等伪造方式对系统安全构成严重威胁。传统的人脸识别技术难以区分真实人脸与伪造攻击&#xff0c;正是在这样的背景下&#xff0c;随机动…...

Chrome 135 版本开发者工具(DevTools)更新内容

Chrome 135 版本开发者工具&#xff08;DevTools&#xff09;更新内容 一、性能&#xff08;Performance&#xff09;面板改进 1. 性能面板中的配置文件和函数调用现已显示来源和脚本链接 Performance > Summary&#xff08;性能 > 概览&#xff09;选项卡现在会显示配…...

《算法:以三种算法思想及两种优化策略解决Fibonacci数》

文章目录 0.题目:red_circle:一.递归记忆化搜索**a.普通递归****b.记忆化搜索&#xff08;优化&#xff09;**算法讲解: :red_circle:二.前缀和a.算法讲解b.代码示例 :red_circle:三.动态规划滚动数组a.算法讲解b.普通动规代码示例c.滚动数组优化 作者的个人gitee 作者的算法讲…...