UiAutomator的详细介绍
UIAutomator作为一种高效的测试框架,通过自动化手段显著提升了用户界面(UI)测试的效率与准确性。它不仅支持自动生成功能测试用例,还允许开发者在不同设备上执行这些测试,确保了应用程序的一致性和稳定性。
以下是对 Android 自动化测试中的 UiAutomator 的详细介绍:
目录
一、UiAutomator
概述
核心组件
UiDevice
UiSelector
UiObject
UiCollection
UiScrollable
简单测试用例示例
优点
局限性
适用场景
在自动化测试中的应用
在用户界面测试中的应用
进行复杂测试
二、UiAutomator和Appium哪个更适合Android自动化测试?
技术特点层面
测试场景层面
团队能力和资源层面
一、UiAutomator
UIAutomator是一种专为Android平台设计的自动化测试框架,它使开发者能够轻松创建针对用户界面(UI)的测试脚本。不同于传统的手动测试方法,UIAutomator允许测试人员通过编程方式模拟用户行为,如点击、滑动等操作,从而验证应用程序在各种情况下的表现。这种技术不仅极大地提高了测试效率,还减少了人为错误的可能性。通过UIAutomator,开发者可以专注于更复杂的功能验证,而无需担心基础交互的正确性。它就像是一个虚拟的手指,在屏幕上执行命令,检查每个元素是否按预期工作。
概述
UiAutomator 是 Android 官方提供的一个强大的用户界面自动化测试框架,它允许开发者和测试人员编写自动化测试用例,对 Android 设备上的用户界面进行全面的测试,包括但不限于应用程序内和跨应用程序的交互操作,能模拟用户的各种操作行为,确保应用在不同设备和环境下的正常运行。
核心组件
UiDevice
设备对象,是 UiAutomator 的核心组件,作为与 Android 设备交互的主要入口,提供了一系列操作设备的方法。
通过UiDevice的getInstance(instrumentation)方法获取,可以通过UiDevice实例来检测设备的各种属性,比如获取屏幕的方向、尺寸等,还可以通过UiDevice实例来执行设备级别的操作,比如点击Home键、返回键等。
-
wakeUp()
:唤醒设备,将设备从睡眠状态唤醒。 -
sleep()
:使设备进入睡眠状态,模拟按下电源键让设备休眠。 -
pressHome()
、pressBack()
、pressMenu()
等:模拟用户按下设备的物理按键,像主页键、返回键、菜单键等。 -
findObject(UiSelector selector)
:使用UiSelector
查找界面元素,UiSelector
可根据元素的不同属性(如文本、资源 ID、类名等)定位元素。 -
swipe(int startX, int startY, int endX, int endY, int steps)
:执行滑动操作,从(startX, startY)
点滑动到(endX, endY)
点,steps
决定滑动的步数。 -
drag(int startX, int startY, int endX, int endY, int steps)
:执行拖动操作,将元素从一个位置拖动到另一个位置。
UiDevice uiDevice = UiDevice.getInstance(getInstrumentation());
uiDevice.wakeUp();
uiDevice.swipe(500, 1000, 500, 500, 10);
UiSelector
用于获取某些符合条件的UI控件对象,用于定位 UI 元素的工具类,可根据多种条件定位元素。
常用的条件包括:
-
text(String text)
:根据元素的显示文本定位元素,例如new UiSelector().text("OK")
可定位显示文本为 "OK" 的元素。 -
resourceId(String resourceId)
:根据元素的资源 ID 定位元素,例如new UiSelector().resourceId("com.example.app:id/button")
可定位资源 ID 为 "com.example.app:id/button" 的元素。 -
className(String className)
:根据元素的类名定位元素,例如new UiSelector().className("android.widget.Button")
可定位类名为 "android.widget.Button" 的元素。
// 通过资源id获取
new UiSelector().resourceId("com.yang.designsupportdemo:id/CollapsingToolbarLayout");
// 通过描述文件获取
new UiSelector().description("Navigate up")
// 通过className获取
new UiSelector().className("android.support.v7.widget.RecyclerView")
UiObject
代表一个UI控件/元素,提供对元素进行操作的方法。
通过uiDevice的findObject(UiSelector)方法获取,获取到UiObject实例后,就可以对UI控件进行相关的操作。如:
-
click()
:点击元素。 -
setText(String text)
:向文本框等输入元素输入文本。 -
getText()
:获取元素的显示文本。 -
isEnabled()
:判断元素是否可用。
UiObject textField = uiDevice.findObject(new UiSelector().resourceId("com.example.app:id/textField"));
textField.setText("Hello, UiAutomator");
UiCollection
代表UI控件集合,相当于ViewGroup,比如界面中有多个CheckBox时,可以通过类名获取到当前界面下的所有CheckBox,然后通过控件id获取指定的CheckBox对象:
// 获取指定的CheckBox对象
UiCollection uiCollection = new UiCollection(new UiSelector().className("类名"));
UiObject checkBox = uiCollection.getChild(new UiSelector().resourceId(""));
UiScrollable
代表可滚动的控件,比如打开设置的关于手机选项:
// 滑动列表到最后,点击About phone选项
UiScrollable settings = new UiScrollable(new UiSelector().className("android.support.v7.widget.RecyclerView"));
UiObject about = settings.getChildByText(new UiSelector().className("android.widget.LinearLayout"), "About phone");
about.click();
简单测试用例示例
测试用例通常继承自 InstrumentationTestCase
,以下是一个简单的测试用例示例:
import android.support.test.uiautomator.UiDevice;
import android.support.test.uiautomator.UiObject;
import android.support.test.uiautomator.UiObjectNotFoundException;
import android.support.test.uiautomator.UiSelector;
import android.test.InstrumentationTestCase;public class SimpleUiAutomatorTest extends InstrumentationTestCase {public void testUiAutomatorExample() throws UiObjectNotFoundException {UiDevice uiDevice = UiDevice.getInstance(getInstrumentation());uiDevice.wakeUp();// 查找并点击一个应用图标,假设其文本为 "MyApp"UiObject appIcon = uiDevice.findObject(new UiSelector().text("MyApp"));appIcon.click();// 查找并操作应用内的元素UiObject button = uiDevice.findObject(new UiSelector().resourceId("com.myapp:id/actionButton"));button.click();UiObject resultText = uiDevice.findObject(new UiSelector().resourceId("com.myapp:id/resultText"));String text = resultText.getText();assertEquals("Expected Result", text);}
}
优点
UIAutomator拥有诸多优势,使其成为Android开发者的首选工具之一。
系统级操作:可以跨越应用程序边界,实现不同应用之间的操作,如从主屏幕启动一个应用,再进入另一个应用进行操作,对于测试涉及多应用交互的场景非常方便。
深度交互能力:能深入 Android 系统底层的 UI 框架,处理各种复杂的 UI 操作,适合测试 Android 系统原生的 UI 元素和系统级功能,如通知栏操作、系统设置操作等。
元素查找多样性:提供多种元素查找方式,能满足不同元素查找需求,通过 UiSelector
可以灵活定位各种元素。
局限性
测试语言限制:主要支持 Java 语言编写测试脚本,对于不熟悉 Java 的测试人员可能有一定的技术门槛。
学习曲线:由于涉及到 Android 系统底层的知识,对于初学者来说,可能需要花费一定时间来熟悉其使用方法和 API,理解如何正确操作和查找元素。
适用场景
- 功能测试:验证应用程序的各种功能是否正常,包括按钮点击、输入验证、页面跳转等。
- 兼容性测试:在不同的 Android 设备和不同版本的 Android 系统上运行测试用例,确保应用程序在不同设备和系统上的兼容性。
- 回归测试:当应用程序进行更新或修改时,使用 UiAutomator 可以快速对已有的功能进行重新测试,确保新的改动没有破坏原有功能。
在自动化测试中的应用
UIAutomator作为一款专门为Android平台打造的自动化测试工具,其强大之处在于它能够无缝地集成到现有的开发流程中,为开发者提供了一种高效且灵活的方式来验证应用程序的用户界面。通过简单的Java代码,即可实现对应用界面元素的操作与验证,比如模拟用户点击按钮、输入文本等常见交互行为。
不仅如此,UIAutomator还支持复杂的条件判断和循环结构,使得即使是面对高度动态变化的应用界面,也能编写出稳定可靠的测试脚本。
更重要的是,由于UIAutomator可以直接运行在Android设备或模拟器上,因此它能够真实地反映应用在实际运行环境中的表现,这对于发现潜在问题、优化用户体验具有不可替代的作用。例如,在一个典型的电商应用中,开发者可以利用UIAutomator来模拟用户浏览商品、添加购物车、结算支付等一系列操作流程,从而全面检查整个购物流程的顺畅度及功能性。
在用户界面测试中的应用
当谈到如何有效地运用UIAutomator进行用户界面测试时,我们不得不提到它那令人印象深刻的灵活性与实用性。
想象一下,当你面对着一个全新的应用项目,每一个像素都充满了未知与挑战,这时UIAutomator就像是一位忠实的朋友,引领你穿越复杂的界面迷宫。通过编写简洁明了的Java代码,开发者可以轻松地模拟出几乎所有的用户交互行为——从简单的点击到复杂的多点触控手势,甚至是键盘输入和菜单选择。
更重要的是,UIAutomator的强大之处不仅仅体现在它能够执行这些基本操作上,更在于它能够帮助开发者构建起一套完整的测试体系。例如,在一个典型的社交应用中,你可以编写一系列测试用例来验证登录流程、发布状态更新、查看好友列表等功能是否按预期工作。每一项测试都可以被细致地分解成多个步骤,通过UIAutomator提供的API逐一实现。而这一切的背后,是无数个精心编写的代码片段,它们如同乐高积木般组合在一起,共同构成了一个稳固且高效的测试框架。
为了更好地理解这一点,让我们来看一个具体的例子。假设我们需要测试一个电商应用中的购物车功能,确保用户能够顺利地将商品添加到购物车,并且能够正确显示商品数量。
这里,我们可以使用UiDevice类来获取当前设备实例,并通过click()方法模拟点击“添加到购物车”按钮的动作。接着,利用UiObject类及其子类UiSelector来查找购物车图标,并再次调用click()方法打开购物车页面。最后,通过检查页面上显示的商品数量是否与预期相符来验证功能的正确性。这样的测试不仅能够覆盖常见的使用场景,还能帮助发现潜在的设计缺陷或逻辑错误,从而确保最终产品的质量。
进行复杂测试
在面对复杂的应用逻辑和多变的用户行为模式时,如何确保每一个功能点都能得到充分测试是一个巨大的挑战。
幸运的是,UIAutomator为此提供了强有力的解决方案。通过组合使用多种选择器和条件判断语句,开发者可以构建出高度定制化的测试脚本,以适应几乎任何类型的测试需求。
例如,在一个在线教育平台上,开发者可能需要验证学生能否顺利地观看课程视频、提交作业以及参与实时讨论。此时,可以利用UIAutomator来模拟用户从登录账号、进入课程页面直到完成一系列互动操作的全过程。据统计,某在线教育平台通过采用UIAutomator进行自动化测试后,其用户反馈中的技术问题减少了约35%,这直接反映了自动化测试对于提升用户体验的重要性。
不仅如此,UIAutomator还支持异步操作的测试,这对于那些涉及后台数据加载或网络请求的功能尤为关键。通过合理设置等待时间和超时机制,测试脚本能确保在适当的时候检查应用的状态,从而避免了因网络延迟等原因导致的误判。总之,UIAutomator以其强大的功能和灵活性,成为了应对复杂测试挑战的理想选择,帮助开发者们在激烈的市场竞争中脱颖而出。
总之,UiAutomator 是 Android 自动化测试领域的一个重要工具,它为开发人员和测试人员提供了丰富的功能,能够帮助确保 Android 应用程序的质量和用户体验,尤其在处理系统级操作和 Android 原生 UI 测试方面表现出色。
二、UiAutomator和Appium哪个更适合Android自动化测试?
UiAutomator 和 Appium 在 Android 自动化测试方面各有优劣,哪一个更适合取决于具体的测试需求和场景,以下从不同角度来对比分析它们各自的适用性:
技术特点层面
(1)UiAutomator
优势:
-
对 Android 系统原生支持强:作为 Android 官方推出的框架,它与 Android 系统底层的 UI 框架深度结合,可以直接访问和操作系统原生的各种 UI 元素,对于像系统设置、通知栏等系统级的功能测试以及一些 Android 原生应用中复杂且深度的 UI 交互测试,能更精准、高效地进行操作。例如,测试修改系统的显示设置、从通知栏中清除通知等操作,UiAutomator 可以很方便地实现。
-
执行效率相对较高:由于是专门针对 Android 定制开发,不存在跨平台兼容等额外的抽象层开销,在 Android 设备上运行测试脚本时,执行速度通常较快,尤其是针对纯 Android 原生应用且涉及大量系统级操作的测试场景,能更快速地完成测试任务。
劣势:
-
语言限制明显:主要依赖 Java 语言来编写测试脚本,这对于那些不熟悉 Java 或者团队中使用多种编程语言的情况来说,不太友好,限制了更多技术人员参与到测试脚本编写工作中,也可能增加学习成本和协作难度。
-
跨平台能力缺失:只能应用于 Android 设备,无法用于 iOS 或其他操作系统平台的测试,如果开发的应用需要在多平台上进行测试,单独使用 UiAutomator 就无法满足需求。
(2)Appium
优势:
-
跨平台特性显著:支持包括 Android、iOS 等多种主流移动操作系统的自动化测试,使用同一套测试脚本,只需做少量调整(甚至无需调整,取决于应用的设计和测试场景)就能在不同平台的设备上运行,非常适合需要同时兼顾多平台应用开发和测试的团队,比如一个移动端应用要同时发布在安卓和苹果手机上,Appium 可以极大地提高测试效率,降低测试成本。
-
多语言支持方便协作:支持诸如 Java、Python、JavaScript、Ruby 等多种编程语言,不同技术背景的测试人员可以根据自己熟悉的语言来编写测试脚本,便于团队成员之间的协作,也更容易在项目中集成自动化测试环节,降低了对特定语言的依赖门槛。
劣势:
-
执行效率略逊一筹:因为要兼容多个不同的移动操作系统平台,在底层进行了较多的抽象和适配工作,这使得其在执行测试脚本时,相比专注于 Android 的 UiAutomator,速度上可能会稍慢一些,不过在很多实际应用场景中,这种效率差异往往不会成为决定性因素。
-
对系统原生功能深度测试有限:虽然可以通过调用各平台的原生框架(如在 Android 上借助 UiAutomator 等)来进行操作,但相对来说,在对 Android 系统的一些深层次、系统原生特有的功能测试方面,不如 UiAutomator 直接和灵活,毕竟其设计重点是跨平台的通用性操作。
测试场景层面
(1)功能测试场景
UiAutomator如果是对 Android 应用中那些依赖于系统原生特性实现的功能,或者需要深度访问 Android 系统底层 UI 的功能进行测试,例如测试 Android 应用中与系统服务有紧密交互的功能,像调用摄像头、麦克风权限相关的功能模块,UiAutomator 会是更好的选择,它能更精准地模拟相关操作并验证功能是否正常。
Appium对于一些常见的、通用的用户操作功能测试,比如登录、注册、表单提交、页面跳转等基本的应用交互功能,无论在 Android 还是其他支持的平台上,Appium 都能很好地完成测试任务,并且方便在多平台间进行对比测试,确保功能的一致性。
(2)兼容性测试场景
UiAutomator单独使用时只能针对 Android 设备的不同机型、不同 Android 版本进行兼容性测试,不过在 Android 系统内,它可以很好地检查应用在各种系统环境下是否能正常运行,尤其是涉及系统级功能的兼容性情况。
Appium在需要同时验证应用在 Android 和 iOS 等多个不同平台上的兼容性时,具有绝对优势,能够快速在不同操作系统的设备上运行相同的测试用例,查看应用是否在不同平台的界面显示、功能交互等方面都能符合预期,帮助开发团队及时发现并解决因平台差异导致的兼容性问题。
(3)回归测试场景
UiAutomator适合对 Android 应用中已有的、与系统原生特性关联紧密的功能进行回归测试,当应用更新后,快速验证那些涉及系统底层 UI 交互的功能是否依然稳定,例如应用中某些与系统通知相关的功能模块,在更新后是否正常工作。
Appium更侧重于对整个应用在多平台下的整体功能进行回归测试,确保之前测试通过的功能在不同平台上没有因为代码修改或更新而出现问题,方便开发团队从多平台角度把控应用的质量稳定性。
团队能力和资源层面
(1)团队成员语言技能分布
如果团队成员大多熟悉 Java 语言,且测试工作主要聚焦在 Android 系统内,那么 UiAutomator 使用起来会比较顺手,能充分发挥团队成员的技术优势,高效地编写和执行测试脚本。
要是团队成员技术背景多样,涵盖了不同编程语言的使用者,并且有跨平台测试的需求,那么 Appium 的多语言支持特性就会更契合团队情况,便于各个成员参与到自动化测试工作中。
(2)社区资源与技术支持
UiAutomator 主要依托 Android 官方的支持以及部分 Android 开发者社区的资源分享,相对来说资源集中在 Android 相关的测试应用场景上,遇到问题时可参考的官方文档和相关案例有一定的局限性。
Appium 拥有庞大的全球社区,涵盖了多平台的使用案例、技术分享、问题解决方案等丰富资源,无论是新手入门学习还是在测试过程中遇到复杂问题,都更容易从社区中获取到有效的帮助,这对于长期的自动化测试工作开展和持续优化是一个很大的优势。
综上所述,不能简单地说 UiAutomator 和 Appium 哪个更适合 Android 自动化测试。如果测试工作侧重于 Android 系统原生功能、对执行效率要求较高且团队成员熟悉 Java 语言,那么 UiAutomator 更为合适;而若有跨平台测试需求、团队成员技术背景多样且希望借助丰富的社区资源来支持测试工作,Appium 则会是更好的选择。在实际应用中,甚至可以考虑将两者结合使用,发挥各自的长处,以达到最佳的 Android 自动化测试效果。
相关文章:
UiAutomator的详细介绍
UIAutomator作为一种高效的测试框架,通过自动化手段显著提升了用户界面(UI)测试的效率与准确性。它不仅支持自动生成功能测试用例,还允许开发者在不同设备上执行这些测试,确保了应用程序的一致性和稳定性。 以下是对 …...
在虚拟机里运行frida-server以实现对虚拟机目标软件的监测和修改参数(一)
frida-server下载路径 我这里选择frida-server-16.6.6-android-x86_64 以root身份启动adb 或 直接在android studio中打开 adb root 如果使用android studio打开的话,最好选择google api的虚拟机,默认以root模式开启 跳转到下载的frida-server文件位…...
Ubuntu二进制部署K8S 1.29.2
本机说明 本版本非高可用,单Master,以及一个Node 新装的 ubuntu 22.04k8s 1.29.3使用该文档请使用批量替换 192.168.44.141这个IP,其余照着复制粘贴就可以成功需要手动 设置一个 固定DNS,我这里设置的是 8.8.8.8不然coredns无法…...
机器学习周报-文献阅读
文章目录 摘要Abstract 1 相关知识1.1 WDN建模1.2 掩码操作(Masking Operation) 2 论文内容2.1 WDN信息的数据处理2.2 使用所收集的数据构造模型2.2.1 Gated graph neural network2.2.2 Masking operation2.2.3 Training loss2.2.4 Evaluation metrics 2…...
TensorFlow实现逻辑回归模型
逻辑回归是一种经典的分类算法,广泛应用于二分类问题。本文将介绍如何使用TensorFlow框架实现逻辑回归模型,并通过动态绘制决策边界和损失曲线来直观地观察模型的训练过程。 数据准备 首先,我们准备两类数据点,分别表示两个不同…...
06-AD向导自动创建P封装(以STM32-LQFP48格式为例)
自动向导创建封装 自动向导创建封装STM32-LQFP48Pin封装1.选则4排-LCC或者QUAD格式2.计算焊盘相定位长度3.设置默认引脚位置(芯片逆时针)4.特殊情况下:加额外的标记 其他问题测量距离:Ctrl M测量 && Ctrl C清除如何区分一脚和其他脚?芯片引脚是逆时针看的? 自动向导…...
《 C++ 点滴漫谈: 二十四 》深入 C++ 变量与类型的世界:高性能编程的根基
摘要 本文深入探讨了 C 中变量与类型的方方面面,包括变量的基本概念、基本与复合数据类型、动态类型与内存管理、类型推导与模板支持,以及类型系统的高级特性。通过全面的理论讲解与实际案例分析,展示了 C 类型系统的强大灵活性与实践价值。…...
Ceph:关于Ceph 中 RADOS 块设备快照克隆管理的一些笔记整理(12)
写在前面 准备考试,整理 ceph 相关笔记博文内容涉及使用 RADOS 块设备提供 RDB 的快照和克隆如何操作理解不足小伙伴帮忙指正对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想…...
C语言连接Mysql
目录 C语言连接Mysql下载 mysql 开发库 方法介绍mysql_init()mysql_real_connect()mysql_query()mysql_store_result()mysql_num_fields()mysql_fetch_fields()mysql_fetch_row()mysql_free_result()mysql_close() 完整代码 C语言连接Mysql 下载 mysql 开发库 方法一…...
2023CISCN初赛unzip
2023CISCN初赛unzip 随便上传一个文件,会自动跳转到uplaod.php目录下,源码如下: <?php error_reporting(0); highlight_file(__FILE__);$finfo finfo_open(FILEINFO_MIME_TYPE); if (finfo_file($finfo, $_FILES["file"]["tmp_name…...
Elasticsearch的索引生命周期管理
目录 零、参考一、ILM的基本概念二、ILM的实践步骤Elasticsearch ILM策略中的“最小年龄”是如何计算的?如何监控和调整Elasticsearch ILM策略的性能? 1. **监控性能**使用/_cat/thread_pool API基本请求格式请求特定线程池的信息响应内容 2. **调整ILM策…...
检测到联想鼠标自动调出运行窗口,鼠标自己作为键盘操作
联想鼠标会自动时不时的调用“运行”窗口 然后鼠标自己作为键盘输入 然后打开这个网页 (不是点击了什么鼠标外加按键,这个鼠标除了左右和中间滚轮,没有其他按键了)...
2024年记 | 凛冬将至
放弃幻想,准备斗争! 考研or就业? 上大学以来,考研上名校在我的心里一直是一颗种子,2024年初,当时的想法是考研和就业两手抓。买了张宇的高数现代,想要死磕! 也记了挺多笔记... 如果…...
【Java-数据结构】Java 链表面试题下 “最后一公里”:解决复杂链表问题的致胜法宝
我的个人主页 我的专栏:Java-数据结构,希望能帮助到大家!!!点赞❤ 收藏❤ 引言: Java链表,看似简单的链式结构,却蕴含着诸多有趣的特性与奥秘,等待我们去挖掘。它就像一…...
vim如何解决‘’文件非法关闭后,遗留交换文件‘’的问题
过程描述: 由于我修改文件时(一定得修改了文件,不做任何修改不会产生这个问题)的非法关闭,比如直接关闭虚拟机,或者直接断开远程工具的远程连接,产生了以下遗留交换文件的问题: 点击…...
国内优秀的FPGA设计公司主要分布在哪些城市?
近年来,国内FPGA行业发展迅速,随着5G通信、人工智能、大数据等新兴技术的崛起,FPGA设计企业的需求也迎来了爆发式增长。很多技术人才在求职时都会考虑城市的行业分布和发展潜力。因此,国内优秀的FPGA设计公司主要分布在哪些城市&a…...
运用python爬虫爬取汽车网站图片并下载,几个汽车网站的示例参考
当然,以下是一些常见的汽车网站及其爬虫示例代码,展示如何爬取汽车图片并下载。请注意,爬取网站内容时应遵守网站的使用协议和法律法规,避免对网站造成不必要的负担。 示例1:爬取汽车之家图片 网站地址 汽车之家 爬…...
IO进程寒假作业DAY6
请使用互斥锁 和 信号量分别实现5个线程之间的同步 使用互斥锁 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include &…...
C++ 中用于控制输出格式的操纵符——setw 、setfill、setprecision、fixed
目录 四种操纵符简要介绍 setprecision基本用法 setfill的基本用法 fixed的基本用法 setw基本用法 以下是一些常见的用法和示例: 1. 设置字段宽度和填充字符 2. 设置字段宽度和对齐方式 3. 设置字段宽度和精度 4. 设置字段宽度和填充字符,结合…...
solidity高阶 -- 线性继承
Solidity是一种面向合约的高级编程语言,用于编写智能合约。在Solidity中,多线继承是一个强大的特性,允许合约从多个父合约继承属性和方法。本文将详细介绍Solidity中的多线继承,并通过不同的实例展示其使用方法和注意事项。 在Sol…...
PydanticAI应用实战
PydanticAI 是一个 Python Agent 框架,旨在简化使用生成式 AI 构建生产级应用程序的过程。 它由 Pydantic 团队构建,该团队也开发了 Pydantic —— 一个在许多 Python LLM 生态系统中广泛使用的验证库。PydanticAI 的目标是为生成式 AI 应用开发带来类似 FastAPI 的体验,它基…...
Leecode刷题C语言之跳跃游戏②
执行结果:通过 执行用时和内存消耗如下: int jump(int* nums, int numsSize) {int position numsSize - 1;int steps 0;while (position > 0) {for (int i 0; i < position; i) {if (i nums[i] > position) {position i;steps;break;}}}return steps…...
fpga学习入门 串口rs232回环
奇偶检验位这里是省略了 做好回环后可以使用上位机做回环测试,top文件写的方式就是将rx(fpga端)接受到的模块(pc端)tx发送出去,这两个端口用杜邦线连接,同理模块的rx连接fpga的tx,…...
单片机基础模块学习——DS18B20温度传感器芯片
不知道该往哪走的时候,就往前走。 一、DS18B20芯片原理图 该芯片共有三个引脚,分别为 GND——接地引脚DQ——数据通信引脚VDD——正电源 数据通信用到的是1-Wier协议 优点:占用端口少,电路设计方便 同时该协议要求通过上拉电阻…...
C基础寒假练习(4)
输入带空格的字符串,求单词个数、 #include <stdio.h> // 计算字符串长度的函数 size_t my_strlen(const char *str) {size_t len 0;while (str[len] ! \0) {len;}return len; }int main() {char str[100];printf("请输入一个字符串: ");fgets(…...
es6.7.1分词器ik插件安装-和head插件连接es特殊配置
es6.7.1分词器ik插件安装-和head插件连接es特殊配置 如果对运维课程感兴趣,可以在b站上、A站或csdn上搜索我的账号: 运维实战课程,可以关注我,学习更多免费的运维实战技术视频 1.查看es6.7.1和es-head安装位置和es插件路径 [ro…...
Luzmo 专为SaaS公司设计的嵌入式数据分析平台
Luzmo 是一款嵌入式数据分析平台,专为 SaaS 公司设计,旨在通过直观的可视化和快速开发流程简化数据驱动决策。以下是关于 Luzmo 的详细介绍: 1. 背景与定位 Luzmo 前身为 Cumul.io ,专注于为 SaaS 公司提供嵌入式分析解决方案。…...
菜鸟之路Day10一一集合进阶(三)
菜鸟之路Day10一一集合进阶(三) 作者:blue 时间:2025.1.28 文章目录 菜鸟之路Day10一一集合进阶(三)0.概述1.双列集合概述2.Map2.1Map的常见API2.2Map的遍历方式 3.HashMap4.LinkedHashMap5.TreeMap 0.概…...
Android车机DIY开发之学习篇(六)编译讯为3568开发板安卓
Android车机DIY开发之学习篇(六)编译讯为3568开发板安卓 1.SDK解压到家目录下的 rk3588_android_sdk 目录 一. 全部编译 ###执行 sudo apt-get update sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib gmultilib…...
Workerman和Swoole有什么区别
Workerman和Swoole都是PHP的socket服务器框架,它们之间存在一些显著的区别,主要体现在以下几个方面: 一、实现语言与性能 Workerman:使用纯PHP实现。由于PHP本身的性能限制,Workerman在某些方面可能不如C语言实现的框…...
MySQL(1)
数据库 基础篇 MYSQL概述 SQL 函数 约束 多表查询 事务 进阶篇 存储索引 索引 SQL优化 试图/存储过程/触发器 锁 InnoDB核心 MySQL管理 运维篇 日志 主从复制 分库本表 读写分离 基础篇 MySQL 数据库概念:存储数据的仓库,数据是有…...
DeepseekMath:超强开源数学模型(论文详解)
摘要 近日,中国团队Deepseek推出了一款名为DeepSeekMath的7B开源数学模型,这个模型在数学方面的表现令人惊叹。DeepSeekMath 7 B在不依赖外部工具包和投票技术的情况下,在竞赛级MATH基准测试中获得了51.7%的分数,接近Gemini-Ultr…...
OpenCSG月度更新2025.1
1月的OpenCSG取得了一些亮眼的成绩 在2025年1月,OpenCSG在产品和社区方面继续取得了显著进展。产品方面,推出了AutoHub浏览器自动化助手,帮助用户提升浏览体验;CSGHub企业版功能全面升级,现已开放试用申请,…...
简易CPU设计入门:控制总线的剩余信号(四)
项目代码下载 请大家首先准备好本项目所用的源代码。如果已经下载了,那就不用重复下载了。如果还没有下载,那么,请大家点击下方链接,来了解下载本项目的CPU源代码的方法。 CSDN文章:下载本项目代码 上述链接为本项目…...
scrol家族 offset家族 client家族学习
Scroll 系列属性 scrollTop & scrollLeft scrollTop: 返回元素的内容已向上滚动的部分的高度。scrollLeft: 返回元素的内容已向左滚动的部分的宽度。 scrollHeight & scrollWidth scrollHeight: 返回元素的实际高度,包括由于溢出而在屏幕上不可见的内容…...
人工智能发展历程
AI 发展历史时间表 1943年,美国神经科学家沃伦斯特麦卡洛克和逻辑学家沃尔特皮茨提出了神经元的数学模型,第一个神经元的数学模型- MP 模型。为现代人工智能学科的建立奠定了基础。1950年,艾伦图灵提出了著名的“图灵测试”,使得…...
vim交换文件的工作原理
在vim中,交换文件是一个临时文件,当我们使用vim打开一个文件进行编辑(一定得是做出了修改才会产生交换文件)时候,vim就会自动创建一个交换文件,而之后我们对于文件的一系列修改都是在交换文件中进行的&…...
利用 PyTorch 动态计算图和自动求导机制实现自适应神经网络
在深度学习任务中,不同任务的复杂度千差万别。为了解决复杂任务对模型容量的需求,同时避免简单任务因过度拟合导致的性能下降,我们可以构建一个能够根据任务自动调整网络结构的神经网络。在 PyTorch 中,动态计算图和自动求导机制为…...
docker如何查看容器启动命令(已运行的容器)
docker ps 查看正在运行的容器 该命令主要是为了详细展示查看运行时的command参数 # 通过docker --no-trunc参数来详细展示容器运行命令 docker ps -a --no-trunc | grep <container_name>通过docker inspect命令 使用docker inspect,但是docker inspect打…...
学历赋
崇岳北峙,紫气东临;学海横流,青云漫卷。连九陌而贯八荒,纳寒门而载贵胄。墨池泛舟,曾照匡衡凿壁之光;杏坛飞絮,犹闻仲尼弦歌之音。然观当下,黉宇接天如笋立,青衫叠浪似云…...
vue和reacts数据响应式的差异
Vue 的数据响应式: 原理: Vue 使用 Object.defineProperty 或 Proxy(在 Vue 3 中)来实现数据的响应式。当创建 Vue 实例时,会对 data 对象中的属性进行遍历,将其转换为响应式属性。对于 Object.definePro…...
doris: MAP数据类型
MAP<K, V> 表示由K, V类型元素组成的 map,不能作为 key 列使用。 目前支持在 Duplicate,Unique 模型的表中使用。 K, V 支持的类型有: BOOLEAN, TINYINT, SMALLINT, INT, BIGINT, LARGEINT, FLOAT, DOUBLE, DECIMAL, DECIMALV3, DAT…...
在计算机上本地运行 Deepseek R1
Download Ollama on Linux Download Ollama on Windows Download Ollama on macOS Deepseek R1 是一个强大的人工智能模型,在科技界掀起了波澜。它是一个开源语言模型,可以与 GPT-4 等大玩家展开竞争。但更重要的是,与其他一些模型不同&…...
LeetCode 16. 排列序列
思路 排序数组:对数组进行从小到大排序。 遍历固定一个元素:遍历数组中的每个元素作为三个数中的第一个数,固定该元素后,使用双指针在剩余的子数组中寻找另外两个数。 双指针逼近target:对于每个固定的元素ÿ…...
【C++高并发服务器WebServer】-9:多线程开发
本文目录 一、线程概述1.1 线程和进程的区别1.2 线程之间共享和非共享资源1.3 NPTL 二、线程操作2.1 pthread_create2.2 pthread_exit2.3 pthread_join2.4 pthread_detach2.5 patch_cancel2.6 pthread_attr 三、实战demo四、线程同步五、死锁六、读写锁七、生产消费者模型 一、…...
全解:Redis RDB持久化和AOF持久化
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...
视频外绘技术总结:Be-Your-Outpainter、Follow-Your-Canvas、M3DDM
Diffusion Models专栏文章汇总:入门与实战 前言:视频Inpaint的技术很火,但是OutPaint却热度不高,这篇博客总结比较经典的几篇视频Outpaint技术。其实Outpaint在runway等工具上很火,可是学术界对此关注比较少,博主从这三年的顶会中找到了最具代表性的三篇论文解读。 目录 …...
LLM - 大模型 ScallingLaws 的设计 100B 预训练方案(PLM) 教程(5)
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/145356022 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 Scaling Laws (缩放法则) 是大模型领域中,用于描述 模型性能(Loss) 与…...
Python帝王學集成-母稿
引用:【【全748集】这绝对是2024最全最细的Python全套教学视频,七天看完编程技术猛涨!别再走弯路了,从零基础小白到Python全栈这一套就够了!-哔哩哔哩】 https://b23.tv/lHPI3XV 语法基础 Python解释器与pycharm编辑器安装 - 定义:Python解释器负责将Python代码转换为计…...
MySQL数据导入与导出
在现代软件开发中,数据管理是一个重要的核心环节,而数据库则是进行数据管理的主要工具。MySQL 作为一款开源的关系型数据库管理系统,被广泛应用于企业和个人开发项目中。对于学习编程的初学者或是自学者来说,掌握 MySQL 的基本操作尤为重要,尤其是数据的导入与导出功能。这…...