移动端自动化测试实战

UI自动化测试的价值


1、提升回归测试的效率
2、可以进行兼容性测试

UI 自动化测试应用场景

• 冒烟测试自动化:提测之前自动断言提测质量,提供准入参考。

• 功能测试自动化:辅助 QA 与测试工程师的快速验证。

• 验收测试自动化:兼容性测试等。

• 移动端性能专项测试自动化:性能、卡顿、健壮性测试、竞品分析。

测试框架

• 阿里 Macaca

• 腾讯开源微信小程序自动化测试工具

• 百度内部的 Cafe 框架

自动化测试常见误区

强调自动化测试不代表手工测试无用

• 手工测试非常有用,仅有手工测试是不够的。

• 手工测试 + 自动化测试才是企业快速迭代的根基

UI 自动化测试的“瓶颈”

• 技术成本高:

• 人力成本高:优秀测试开发工程师难招

• 技术门槛高:80%的自动化测试工程师在自动化能力上都不及格

• 维护成本高

• 复用率不高:UI 和业务流程变更是最主要变更

• 稳定性不足:容易被干扰,执行慢

• 常见行业错误观点

• 错误观点一:UI 自动化测试无用论

• 错误观点二:UI 自动化测试只能模拟人工

合理地使用 UI 自动化

• 使用分层测试策略,控制 UI 自动化测试规模:

• 少数核心用例交给自动化测试

• 大部分的基础回归测试交给自动遍历

• 新功能测试交给人工测试

• 技术改进方案:

• 良好的维护模型:PageObject、数据驱动

• 更好的框架支持:增加 Watch,智能等待,失败重试等机制

自动化测试就是机器点点点?

• 传统自动化测试

• 自动探索测试 自动化对新功能进行测试?

• codeless 方向的自动化测试  不需要写代码就可以完成自动化测试

• 自动化测试用例智能生成 

如何高效实用的落地自动化

• 学习方向

• 了解待测产品和平台:Android、iOS、App

• 精通最好的测试框架:Appium、UI Automator、WebDriverAgent

• 掌握自动化测试落地经验:PageObject、稳定性提升、数据驱动……

• 达到的结果

• 一天搞定一款 app 的自动化测试脚手架

• 一天完成单个功能的业务测试自动化用例集合

• N 周内搞定公司的 app 自动化测试

移动自动化测试的技术体系

UI 自动化分类

• Web 自动化:Selenium

• App 自动化:Appium

• GUI 自动化:Windows、Mac

• 微信小程序自动化:App + Web 测试技术的外延形态

• 更多平台:智能设备、机器人、工业 app

UI 自动化测试方面的成就

• Google:Espresso、UI Automator

• Facebook:WebDriverAgent

• 焰焮ibaba:Macaca

• Ebay:Selendroid

• Walmart:Robotium

• Sauce Labs:Appium

• ThoughtWorks:Selenium

Appium

Appium 的设计理念

Appium client:对应语言的client包和脚本,如python的Appium-Python-Client并编写脚本

Appium server:启动服务开放端口,接收appium client客户端的http请求

driver:appium需要driver来驱动移动端,Appium team目前维护了很多driver,需要根据平台来选择driver。Android平台一般使用Uiautomator2 driver。。IOS使用XCUITest driver

 

自动化测试框架选择

• 推荐 Appium

• 跨语言:Java、Python、Node.js 等

• 跨平台:Andoid、iOS、Windows、Mac

• 底层多引擎可切换

• 生态丰富,社区强大

• iOS:KIF、WDA、XCTest

• Android:Robotium、UI Automator

• 特色框架:calabash、Macaca、ATX

Appium 引擎列表

• Android

• Selendroid、Espresso [推荐]

• UI Automator、UI Automator2 [推荐]

• iOS

• UI Automation [已废弃]

• XCUITest [推荐]

• 更多平台:Mac、Windows、游戏引擎等

Appium 多端架构与自动化

UI 分层测试体系

移动 App 分层测试

 移动 App 快速迭代模型

自动遍历测试与其价值

• 定义:以自动化的方式对 app 进行充分的功能遍历以探索 bug

• 价值

• 降低自动化维护成本,可替代 80% 的自动化测试

• 实现新功能的探索

• 实现老功能的回归

• 用途:多设备兼容测试、自动化专项测试

常见遍历工具与技术

• Android 原生 Monkey

• 百度 SmartMonkey

• 腾讯 New Monkey

• 阿里 Macaca 的 NoSmoke

• TesterHome 社区 vigossjjj smart_monkey

• TesterHome 社区 zhangzhao Maxim

• TesterHome 社区 seveniruby AppCrawler

• Google 出品的 App Crawler

合理的使用 UI 自动化

• 单元测试:使用 App 分层测试策略,增加单测规模,控制 UI 自动化测试规模。

• 移动 App 自动化测试:核心集成与验收测试用例交给自动化测试。

• 自动遍历测试:大部分的基础回归测试交给自动遍历。

• 人工测试:测试团队主负责,整个产品团队参与。

Android app 的常见概念

Android 自动化前提依赖

• Android SDK:Android Studio 可辅助安装

• 模拟器

• Android Studio 自带 Emulator [推荐]

• Genymotion、网易 MuMu、BlueStacks

• 真机

获取 App 的信息

• App 信息

• 获取当前界面元素:adb shell dumpsys activity top

• 获取任务列表:adb shell dumpsys activity activities

• App 入口

• adb logcat |grep -i displayed

adb logcat | findstr Displayed  (windows cmd用这个)

• aapt dump badging mobike.apk | grep launchable-activity

• apkanalyzer 最新版本的 SDK 中才有

• 启动应用

 Android 调试桥 adb 命令详解

环境准备

• 真机 or 模拟器

• 下载 Android SDK

• 设置 PATH 变量加入 SDK 的工具目录

Android 常用命令

• adb:Android Debug Bridge

• adb devices:查看设备

• adb kill-server:关闭 adb 的后台进程

• adb tcpip:让 Android 脱离 USB 线的 TCP 连接方式

• adb connect:连接开启了 TCP 连接方式的手机

• adb logcat:Android 日志查看

• adb bugreport:收集日志数据,用于后续的分析,比如耗电量

adb shell

• adb shell 本身就是一个 Linux 的 shell,可以调用 Android 内置命令

• adb shell

• adb shell dumpsys

• adb shell pm

adb shell pm clear com.android.contacts

 

 清除包的缓存数据和权限,获得一个比较新的环境。

• adb shell am

 • adb shell am start -W -n  com.android.contacts/.activities.PeopleActivity -S

• adb shell ps

• adb shell monkey

常用命令列表

• adb

• pm 包管理工具

• am  启动一个APP

• dumpsys 获取整个系统的性能数据

• uiautomator  获取APP的界面结构,执行自动化测试 

• input 完成简单的自动化指令

Android 性能统计 dumpsys

• 获取所有的 dumpsys 子命令 dumpsys | grep -i DUMP

• 获取当前 activity adb shell dumpsys activity top

• 获取 activities 的记录,可以获取到 appium 依赖的原始 activity dumpsys activity activities

• 获取特定包基本信息 adb shell dumpsys package com.xueqiu.android

• 获取系统通知 adb shell dumpsys notification

• 获得内存信息 adb shell dumpsys meminfo com.android.settings

• 获取 cpu 信息 adb shell dumpsys cpuinfo

• 获取 gpu 绘制分析 adb shell dumpsys gfxinfo com.android.settings

• 获取短信 adb shell dumpsys activity broadcasts | grep senderName=

uiautomator

• adb shell uiautomator runtest ...

运行自动化测试用例

• adb shell uiautomator dump

adb shell uiautomator dump

 把Android APP控件生成xml文件

UiAutomator是测试Android原生态APP的功能测试工具。Android 4.1发布时包含了这种新的测试工具—UiAutomator。UiAutomator用来做UI功能测试的。

uiautomator2是uiautomator的升级版,uiautomator是Google开发的一款用来做安卓自动化测试的Java库。适用于Android4.4+

简单的自动化工具 input 命令

• text (Default: touchscreen)

• keyevent [--longpress] ... (Default: keyboard)

• tap (Default: touchscreen)

adb shell input tap 529 1176

点击屏幕上该坐标  

• swipe [duration(ms)] (Default: touchscreen)

• draganddrop [duration(ms)] (Default: touchscreen)

• press (Default: trackball)

• roll (Default: trackbal

Appium 架构介绍

文档:The Context API - Appium Documentation

Appium 生态工具

• adb:Android 的控制工具,用于获取 Android 的各种数据和控制

• Appium Desktop:内嵌了 Appium Server 和 Inspector 的综合工具

• Appium Server:Appium 的核心工具,命令行工具

• Appium Clients:各种语言的客户端封装库,用于连接 appium server

• Java、Python、Ruby、robotframework-appium

• AppCrawler 自动遍历工具

Desktop 主要功能

• UI 分析

• 录制用例

• 元素查找测试

• Attach 已有的 session

• 云测试

python 客户端安装

• 客户端安装:pip install Appium-Python-Client

• IDE:PyCharm

• Python 多版本隔离工具:venv

• 国内依赖源:http://pypi.douban.com/simple/

• 测试框架:unittest、pytest、nose,推荐 pytest

APP自动化

控件定位方法

常用定位手段

• id

• Accessibility ID

• XPath

元素定位

• 测试步骤三要素:

• 定位、交互、断言

• 定位

• ID (重要)

• XPath(重要)

• Accessibility ID: content-desc(重要)

• 不推荐:Class -iOS -Android

常用自动化 API

常见自动化动作支持

• click

• sendKeys

• swipe

• touch action

手势操作 TouchAction

• press release longPress

• tap wait

• moveTo

• perform

capabilities 设置

Capabilities - Appium Documentation

Capabilities是appium启动server会话时设置的参数,告诉server需要启动的APP入口,android版本等信息。

• App APK 地址 appPackage 包名 appActivity Activity 名字

• automationName 默认使⽤ uiautomator2

• noReset fullReset 是否在测试前后重置相关环境

• autoGrantPermissions ⾃动赋予 App 权限

• unicodeKeyBoard resetKeyBoard 是否需要输⼊⾮英⽂之外的语⾔并在测试完成后重置输⼊法

 Appium 设备交互 API

可见Appium Python Client 文档Welcome to Appium python client’s documentation! — Python client 1.0 1.0 documentation

常用的设备交付命令

• 模拟电话、短信

用下面的命令模拟 GSM 电话和短信,注意:只能在模拟器上使用!

self.driver.make_gsm_call("5551234567", GsmCallActions.CALL);
 
self.driver.send_sms('555-123-4567', 'Hey lol')
 

Original error: gsmCall method is only available for emulators 这里在夜神模拟器上执行是失败的。

• 横竖屏切换

• App 处理

# 实现 APP 的安装
self.driver.install_app('/Users/johndoe/path/to/app.apk') 
 
# 检测 APP 是否被安装
self.driver.is_app_installed('com.example.AppName');
 
# 启动 APP
self.driver.launch_app()
 

• 键盘、粘贴板

设置系统剪贴板的内容:

self.driver.set_clipboard('happy testing')
self.driver.set_clipboard_text('happy testing')
 
获取到剪贴板的内容:

self.driver.get_clipboard()
self.driver.get_clipboard_text()

• 录屏

显式等待

• 功能差别

• 显式等待的条件非常灵活

• 隐式等待只用于元素定位

• 执行差别

• 显式等待本地轮询条件

• 隐式等待通过 appium server 轮询条件

def assert_exist_element(self,loc):try:WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located(loc))return Trueexcept:print("元素{}不存在".format(loc))return False

XPath 介绍

• 绝对定位:根据严格的父子关系定位

• 相对定位:根据条件匹配定位

• 慢的原因:XPath 定位比其他定位慢,因为需要递归解析每个元素的属性

• 慢的不明显的原因:有 Cache 机制

常用 XPath 相对定位表达式

• 查找:

• //*[@text='登录’]

• //*[contains(@resource-id, 'login’)]

• 条件匹配:

• //*[contains(@resource-id, ‘login’) and contains(@text, ‘登录’)]]

• //*[contains(@text, ‘登录’) or contains(@label, '登录’)]]

• 寻找所有元素://*

Toast 识别方法

• automationName:uiautomator2

• getPageSource 是无法找到的

• 必须使用 xpath 查找

• 推荐 //*[@class= ‘android.widget.Toast']

• 或者 //*[contains(@text, "xxxxx")]

断言体系

元素是否存在:find_elements

assert len(self.driver.find_elements(by=AppiumBy.XPATH, value='//*[@text="Battery"]'))>=1 #断言存在该元素
assert "哈哈" in self.driver.find_element(by=AppiumBy.XPATH, value='//*[@text="Battery"]').text

• 元素属性正确性:get_attribute

xUint常用断言

传统的xUnit风格的assertXXX()系列

Hamcrest断言,基于更灵活的Matchers断言方式 --推荐 https://github.com/hamcrest/PyHamcrest

参数化与数据驱动

参数化

• 参数化:根据传入的数据,对测试用例进行迭代调用

• 数据驱动:基于数据完成流程调度,通常数据来源自外部数据文件

• 参数化是数据驱动的基础和特例

数据驱动

• 参数化数据读取自外部文件:使用 YAML、JSON 读取

• 测试步骤读取自外部文件:定制执行引擎

• 断言步骤读取自外部文件:定制执行引擎

• 整个用例读取自外部文件:动态创建用例

Native 原生 App 的自动化测试

多种架构支持

Native 原生应用的分类

• Android 标准组件

• 非标准组件:

• Flutter:闲鱼

• React Native:Facebook

• Weex:极客时间

• 游戏

非标准控件的特征

• 非 WebView 组件

• 原生控件可识别

• HTML 控件被编译为 Native 控件

• HTML 的文本属性被解析为 Native 属性

• text 还是 content-desc 取决于 API 版本

常见 Native 自动化测试方式

• Android 原生组件:Appium 默认支持

• Native非标准组件:Appium默认支持

• 自定义 View 识别:

• 使用相对定位,父控件加百分比偏移

• OCR、图像识别、AI

• 游戏控件识别:使用游戏引擎特定技术

游戏自动化测试支持

• Appium 提供了简单的游戏自动化测试支持

• 图像识别

• AI 识别

• 游戏测试的推荐做法

• 提高可测性:编码输出游戏引擎下的控件布局信息,与 Appium 对接

• 使用成熟的 airtest 框架

Hybrid 混合 App 的自动化测试

WebView 控件在 Appium 中的抽象

• Native 层面支持

• uiautomator 解析 WebView 中的内容并映射为原生控件

• getPageSource 为 DOM 结构可发现 WebView 组件和控件

• 切换为 WebView 上下文

• 切换后才是正规的 Web

• getPageSource 为 HTML

• 可以使用 CSS 定位等

Hybrid 测试流程

• 首先进去带有 WebView 的页面

• 使用 Contexts API 寻找 WebView

• 使用 Context 切换到 WebView

• 使用 CSS 等 Web 定位方式

• 使用 Context 重回 Native

真机进行 WebView 测试的前提

• 模拟器默认支持

• 物理机需要打开 app 内开关

• 检测是否打开:反编译检查对应的 API 调用

 WebView 测试 - Python

找对 ChromeDriver 的版本

• Android 默认浏览器:

• 老版本 Android 用 Browser,新版本 Android 用 Chrome

• adb shell dumpsys package com.android.webview | grep versionName

• adb shell dumpsys package com.android.chrome | grep versionName

• App 自带 WebView 组件:每个 App 自带的 WebView 的版本也都不相同

Android WebView进程信息

• getContextHandles

• 查看所有的 WebView 进程

• adb shell cat /proc/net/unix | grep webview

• Context 切换

• 把 domain socket 映射为本地的 socket 端口

• adb forward tcp:$port localabstract:webview_devtools_remote_$pid

• 获取对应的 WebView 组件版本 http://localhost:$port/json/version

• ChromeDriver 协议交互

设置 ChromeDriver

• ChromeDriver 安装

• 提前下载所有的 ChromeDriver 版本备用

• 运行时指定

• 隐式选择:1.8版本以后支持自动选择 ChromeDriver

• 显式指定:chromedriverExecutableDir 设置

• 调试开关:

• showChromedriverLog

纯 H5 站自动化测试

浏览器自动化技术原理

浏览器调试工具 DevTools

 对网站进行分析

 移动浏览器测试 - Python

 

 小程序自动化测试

小程序自动化的三个方法

• 利用 Uiautomator 的原生定位

• 利用微信提供的小程序自动化 SDK

• 基于WebView的测试方法

基于原生定位的方法

• Appium 使用 Uiautomator2 定位可以识别内部 WebView 组件

• 缺点:元素定位符不够精确,content-desc、resource-id 多数都没有

• NoReset 默认为 false,会默认清空微信聊天记录,所以请使用测试机测试帐号

基于微信提供的小程序自动化 SDK

• 使用 Node.js 体系

• 微信小程序自动化 SDK + 标准的测试框架

• 支持真机与 Web 模拟器

微信小程序自动化 SDK 的缺点

• 从官网提供的代码示例来看,微信的这套体系主要用于研发自测

• 微信的研发对自动化测试理解不到位,大量的 wait,实用性不高

• 需要在已有的 WebSocket 体系上做二次封装对接 Appium

• 希望微信可以重视这块的测试支持改进

基于 WebView 的测试方法

• 微信6.x版本支持基于 WebView 自动化测试

• 7.x改版后默认已经无法使用基于 WebView 的自动化

• 7.x + root强行开启 WebView debug + Appium hack

• 曾经这个方案是最好用的,Appium 默认支持

• 但是当前微信版本里这个方法已经被破坏,绕过条件比较苛刻,暂时不可用了

Page Object 模式

做法

• 以页面为单位独立建模

• 隐藏实现细节

• 本质是面向接口编程

• 优点

• 减少重复 find click 样板代码

• 易读性提高

• 页面修改不影响测试用例

Page Object 六大设计原则

登录场景

• 登陆页面提供 login findPassword 功能

• Login 类 + login findPassword 方法

• 登录页面内的元素有多少并不关心,隐藏内部界面控件

• 登录成功和失败会分别返回不同的页面

• findPassword

• loginSuccess

• loginFail

• 通过方法返回值判断登录是否符合预期

编写用例顺序

• 根据界面封装 page 类与方法,实现可以为空

• 编写用例,不断重构明确 page 里方法的入参和返回值

• 开始实现 page 内的方法

• 调试

BasePage 封装

• 实现通用的 Page 方法,对常用自动化行为做封装

• 管理各种 Driver

• 减少每个 Page 对 Appium、Selenium 等库的太多依赖

自动化行为封装

• 异常弹框处理:广告、好评、升级、tips 等弹框

• 通用自动化能力封装

基于 POM 的用例组织结构

• page:完成对页面的封装

• driver:完成对 Web、Android、iOS、接口的驱动

• testcase:调用各类 page 完成业务流程并进行断言

• data:配置文件和数据驱动

• utils:其他便捷的功能封装,可选

测试用例管理

• 用例组织结构:

• 使用 package 管理业务模块

• 使用 class 管理业务对象、使用method完成业务具体行为

• 数据驱动:测试数据、测试步骤、测试断言

• 测试用例:

• 使用 testcase 完成测试步骤的定义

• 使用 assertion 完成业务正确性校验

• 持续集成:使用 Jenkins 完成持续集成

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

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

相关文章

stable-diffusion-webui 界面汉化

本教程通过安装 sd-webui-bilingual-localization 插件来达到汉化目的, 项目地址为:https://github.com/journey-ad/sd-webui-bilingual-localization 一、安装插件 先进入插件安装界面 在搜索栏搜索 zh_CN Localization 中文语言包, 项目地址: https://github.com/dtlnor/st…

CrossOver是什么软件 CrossOver软件好用吗

CrossOver是一款由CodeWeavers公司开发的软件,它可以在Mac和Linux等操作系统上运行Windows软件,而无需在计算机上安装Windows操作系统。这款软件的核心技术是Wine,它是一种在Linux和macOS等操作系统上运行Windows应用程序的开源软件。本文将会…

mysql按季度查询数据

select * from 表名 where YEAR(add_time) 2023 and QUARTER(add_time) 1

使用docker 搭建nginx + tomcat 集群

创建3个Tomcat容器,端口分别映射到 8080,8081,8082,使用数据卷挂载,分别将宿主机目录下的 /opt/module/docker/tomcat3/ROOT1/,/opt/module/docker/tomcat3/ROOT2/,/opt/module/docker/tomcat3/ROOT2/ 挂载到 容器内部…

STM32外部中断

配置是stm32外部中断步骤: 1.使能IO时钟和AFIO时钟 2.配置EXIT中断线 3.配置中断控制器NVIC (EXTI15_10_IRQn,EXTI4_IRQn) 4.写中断服务子程序 (EXTI15_10_IRQHandler) 首先要明白中断IO对应的中断线EXTIx 其中 PA0-PE0对应的是E…

CAD练习——绘制冲压件三视图

首先还是先设置咱们的绘图模板: 这是图层划分: 文字样式设置: 标注样式: 从主视图开始,首先绘制如下图形 用到的快捷指令: L:直线 O:偏移 TR:修剪 效果:…

uniapp中token操作:存储、获取、失效处理。

实现代码 存储token:uni.setStorageSync(token, res.data.result);获取token:uni.getStorageSync(token);清除token:uni.setStorageSync(token, ); 应用场景 在登录操作中,保存token pwdLogin() {....this.$axios.request({url: .....,method: post,p…

嵌入式面试5 -makefile shell

2、 如果有一个简单的helloworld项目目录如下: tree helloworld helloworld |– file2.h |– file1.cpp |– file2.cpp 请编写一个Makefile文件。 答: TARGET helloworld CXX g COMPILE : $(COMPILE) file1.cpp COMPILE : $(COMPILE) file2.cpp OBJE…

搭建日志服务器Rsyslog

Rsyslog介绍 Rsyslog的全称是 rocket-fast system for log,它提供了高性能,高安全功能和模块化设计。rsyslog能够接受从各种各样的来源,将其输入,输出的结果到不同的目的地。rsyslog可以提供超过每秒一百万条消息给目标文件。 特…

SQL Server数据库如何添加Oracle链接服务器(Windows系统)

SQL Server数据库如何添加Oracle链接服务器 一、在添加访问Oracle的组件1.1 下载Oracle的组件 Oracle Provider for OLE DB1.2 注册该组件1.2.1 下载的压缩包解压位置1.2.2 接着用管理员运行Cmd 此处一定要用管理员运行,否则会报错 二、配置环境变量三、 重启SQL Se…

java 图片处理 Graphics2D GraphicsMagick 避免oom

GraphicsMagick 号称图像处理领域的瑞士军刀。GraphicsMagick 是个图片处理库,是从ImageMagick 5.5.2分支出来。 Graphics2D是JDK 自带的一套图片处理库。但性能一般。 Java 方面也提供了类似 JNI 方式支持 GraphicsMagickim4java 处理图像。 但OpenCV&#xff0…

嵌入式面试7---进程or线程or同步

3.int main(){fork()||fork();}共创建几个进程(B) A.2 B.3 C.4 D.5 解析:首先,父进程fork后,给父进程返回子进程pid,此时为真,逻辑或语句不再执行,但是fork出的子进程是复制的父进程…

使用Spring五大注解来更加简单的存储Bean对象

在使用Spring框架的时候我们如果使用这种方式来存储bean对象的话未免有点太麻烦了 <bean id"xxx" class"xxx"> </bean> 为了简化存储Bean对象的操作&#xff0c;我们可以使用五大类注解来进行存储Bean对象 我们首先要在配置文件配置扫描路径…

【快应用】list组件属性的运用指导

【关键词】 list、瀑布流、刷新、页面布局 【问题背景】 1、 页面部分内容需要瀑布流格式展示&#xff0c;在使用lsit列表组件设置columns进行多列渲染时&#xff0c;此时在里面加入刷新动画时&#xff0c;动画只占了list组件的一列&#xff0c;并没有完全占据一行宽度&…

把大模型装进手机,分几步?

点击关注 文 | 姚 悦 编 | 王一粟 大模型“跑”进手机&#xff0c;AI的战火已经从“云端”烧至“移动终端”。 “进入AI时代&#xff0c;华为盘古大模型将会来助力鸿蒙生态。”8月4日&#xff0c;华为常务董事、终端BG CEO、智能汽车解决方案BU CEO 余承东介绍&#xff0c…

Gson 添加数据默认值问题记录

问题&#xff1a;在用Gson add(key&#xff08;string类型&#xff09;&#xff0c;value&#xff08;必须是JsonElement子类&#xff09;&#xff09;时发现&#xff0c;value 传了 "" 空字符串&#xff08;非null&#xff09;&#xff0c;默认解析后返回null&#…

jmeter测试rpc接口-使用dubbo框架调用【杭州多测师_王sir】

1.基于SOAP架构。基于XML规范。基于WebService协议。特点:接口地址?wsdl结尾2.基于RPC架构&#xff0c;基于dubbo协议&#xff0c;thrift协议。SpringCloud微服务。3.基于RestFul架构&#xff0c;基于json规范。基于http协议(我们常用的都是这种&#xff0c;cms平台也是) Rest…

windows环境下安装elasticsearch、kibana

通过本文可以快速在windows系统上安装elasticsearch、kibana环境。 当你用Integer类型的时候&#xff0c;要非常小心&#xff0c;因为100等于100、但是200不等于200&#xff0c;当然&#xff0c;如果你会一点小花招&#xff0c;也可以让100不等于100、让200等于200。(运算符比较…

CSS 盒模型是什么?它包含哪些属性?标准盒模型/怪异盒模型

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 盒模型⭐ 标准盒模型⭐ 怪异盒模型⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发感…

深度学习中的优化算法

文章目录 前言一、优化和深度学习1.1 优化的目标1.2 深度学习中的优化挑战1.2.1 局部最小值1.2.2 鞍点1.2.3 梯度消失 二、梯度下降2.1 一维梯度下降2.1.1 学习率 2.2 多元梯度下降2.3 自适应方法2.3.1 牛顿法2.3.2 其他自适应方法 三、随机梯度下降3.1 随机梯度更新3.2 动态学…