前言

笔者入职 Trip.com 已满一年,回顾这一年的工作历程,约一半的时间都在做 UI 自动化测试相关内容。从而,笔者更深入地研究了 iOS 平台下的自动化测试技术,目前也在负责部门 App 自动化测试平台的搭建和维护。故想借这篇文章一并将所踩过的坑以及学习到的技术,系统且全面地整理出分享给大家。

本文的内容大致如下:

  • iOS/macOS UI 自动化测试框架 XCUITest 原理详解
  • 基于 Web Service 的自动化测试平台架构设计
  • AppiumMacaca 介绍与对比
  • Trip.com App UI 自动化测试现状

自动化测试可以分为白盒测试、黑盒测试以及灰盒测试,本文主要围绕 Apple 官方提供的 XCUITest 测试框架,逐步阐明 iOS 操作系统下的 UI 自动化测试原理、架构设计思想以及应用场景。

XCUITest 原理详解

iOS UI自动化测试核心技术

2015 年,Apple 发布了 UI 自动化测试框架 XCUITest 并集成在 Xcode7 中,而 iOS/macOS UI 自动化测试依赖两个核心技术: XCUITestAccessibility

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KGRzmu7A-1635928622918)(https://niyaoyao.github.io/images/uitest/core-technology.png)]

XCUITest 是集成在 Xcode 中的测试框架,若想使用 UI 测试功能,可以在创建 iOS 项目时勾选 Include Tests 选项,从而使项目具备自动化测试的能力。而 Accessibility 技术,则是 Apple 官方为视障用户提供的一整套使用 iOS/macOS App 的解决方案。

Xcode 项目创建 UITests Target 并运行测试,其编译产物 Test App 本质上是一个 Deamon 守护进程,该进程有独立的应用程序生命周期,依靠 XCUIApplication 类型进行管理。 UITests 的 Test App 进程在运行时会驱动 Host App(项目的主 Target 产物),并且利用元素审查的相关 API 驱动 Host App 模拟用户行为交互,从而进行 UI 自动化测试。

对于 Accessibility 技术,开发人员需要注意的是,XCUITest 框架默认并不能将所有视图元素审查到,只会审查到可以被 VoiceOver 功能读取文字的元素。比如,UIButtonUILabel,这些视图对于视障用户而言可以通过语音来获知其内容,而对于 UIImageViewUIView 这种对于视障人士并不友好的 UIKit 视图元素默认是不会审查到的,所以编码时要另行配置 Accessibility 相关属性,以保证其支持 Accessibility 从而在 UI 自动化查询的元素层级中可见。

基于 XCUITest 框架 和 Accessibility 技术的自动化测试,有利于 App 进行数据一致性校验,但 UI 一致性校验能力较弱。比如,App 可以针对某些数据请求结果或者某个元素是否存在进行校验,而视觉展示效果却仍需要人工介入。

XCUITest 框架结构

XCUITestAPI

XCUITest 测试框架 API 主要包含:元素查询(UI Element Queries)相关类型,如 XCUIElementQuery,UI 元素(UI Elements)相关类型,如 XCUIElement,以及测试 App 生命周期类型(Application Lifecycle)类型,如 XCUIApplication

接下来,我们创建一个简单 Demo 项目,来学习如何使用 XCUITest 框架编程,并进行 iOS UI 自动化测试。

利用 Xcode UITests Target 进行自动化测试

integrate-tests

创建一个 Demo 工程,勾选 Include Tests 选项,在 ViewController 里编写如下代码。本文 Demo 工程可访问链接 https://github.com/niyaoyao/UITestDemo 。

import UIKitclass ViewController: UIViewController {lazy var testImageView: UIImageView = {let testImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))testImageView.backgroundColor = .redtestImageView.accessibilityIdentifier = "test imageview"return testImageView}()lazy var testLabel: UILabel = {let testLabel = UILabel(frame: CGRect(x: 0, y: 130, width: 100, height: 20))testLabel.backgroundColor = .greentestLabel.text = "test label"return testLabel}()lazy var testView: UIView = {let testView = UIView(frame: CGRect(x: 0, y: 170, width: 100, height: 50))testView.backgroundColor = .bluetestView.accessibilityIdentifier = "test view"return testView}()lazy var testButton: UIButton = {let testButton = UIButton(frame: CGRect(x: 0, y: 230, width: 100, height: 50))testButton.backgroundColor = .yellowtestButton.setTitle("测试按钮", for: .normal)return testButton}()override func viewDidLoad() {super.viewDidLoad()view.addSubview(testImageView)view.addSubview(testLabel)view.addSubview(testView)view.addSubview(testButton)}
}

源码解释,上面的这段代码创建了四个视图实例,分别为 UIImageViewUILabelUIViewUIButton 类型,并将四个视图实例添加到当前页面中。其中,UILable 和 UIButton 仅设置了frame、字符串、背景颜色等属性,但是对于 UIImageView 和 UIView 视图除了一般的视图属性,还设置了 accessibilityIdentifier 个属性是为了让 UIImageView 和 UIView 支持 Accessibility 功能,但仅设置这个属性并不能使这两个视图在 Accessibility 的元素层级结构中可见。接下来就对 Accessibility 功能做简要介绍。

让 App 支持辅助功能

使用 Accessibility Inspector

前文中提到 Apple 对于视图元素会默认审查能够通过 VoiceOver 播放文字的视图元素,而对于 UIImageView、UIView 这种默认不支持 Accessibility 功能的需要配置相关特性,而开发人员在开发过程中可以通过 Accessibility Inspector 查看不同进程的 Accessibility 元素层级,该应用可以审查 iOS 和 macOS 的元素。

accessibility-inspector

选择 Xcode 的图标菜单并选择 Open Developer Tool 选项,点击 Accessibility Inspector 即可开始使用。

accessibility-hierarchy

当我们没有设置 isAccessibilityElement 属性时,在 Accessibility 元素层级结构中就无法看到 UIImageView 和 UIView 元素,只能看到 “test label” 和“测试按钮”。而当我们将 UIImageView 和 UIView 的 isAccessibilityElement 属性设置为 true 时, UIImageView 和 UIView 元素才能在元素层级中可见。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EH43006S-1635928622925)(https://niyaoyao.github.io/images/uitest/accessibility-hierarchy-visible.png)]

Accessibility 相关属性
UIAccessibility: var accessibilityLabel: String? { get set }

accessibilityLabel 属性可以解决绝大部分的 Accessibility 问题,当光标将焦点放在设置该属性的元素师时,它的内容可由 VoiceOver 读取的人类可读的字符串。但如果不是需要被视障用户获知的视图元素,仅用于自动化测试,就可以不用设置该属性。

UIAccessibility: var accessibilityIdentifier: String? { get set }

accessibilityIdentifier 属性不会被 VoiceOver 诵读,而是面向开发人员的字符串,可在不希望用户操作 accessibilityLabel 的情况下使用。

UIAccessibility: var isAccessibilityElement: Bool { get set }

如果 isAccessibilityElement 未设置为 true,那么这个视图将不会在 Accessibility 视图层次结构中可见。

The default value for this property is false unless the element is a standard UIKit control, in which case, the value is true. —— Apple Documentation

另外,根据 Apple 官方中的介绍 UIControl 的子类的 isAccessibilityElement 属性都默认设置为 true。

手动编写测试 case

import XCTestclass UITestDemoUITests: XCTestCase {override func setUpWithError() throws {// ...}override func tearDownWithError() throws {// Put teardown code here. This method is called after the invocation of each test method in the class.}func testExample() throws {// UI tests must launch the application that they test.let app = XCUIApplication()app.launch()let label = app.staticTexts["test label"]XCTAssertTrue(label.exists)let button = app.buttons["测试按钮"]XCTAssertTrue(button.exists)let imgview = app.images["test imageview"]XCTAssertTrue(imgview.exists)let view = app.otherElements["test view"]XCTAssertTrue(view.exists)  // Use recording to get started writing UI tests.// Use XCTAssert and related functions to verify your tests produce the correct results.}func testLaunchPerformance() throws {if #available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 7.0, *) {// This measures how long it takes to launch your application.measure(metrics: [XCTApplicationLaunchMetric()]) {XCUIApplication().launch()}}}
}

源码解释,XCUIApplication 类型的实例,是管理 Test App 生命周期的实例对象,可以通过该对象获取 Accessibility 视图层级结构,通过 XCTAssertTrue 断言元素是否存在。

录制交互行为自动生成测试 case

对于相对复杂的 Test Case,可以通过 Xcode 提供的测试行为录制功能进行自动代码生成。

execute-test
execute-test

UITest 执行过程

execute-test

点击 Test 定义的 function 前方对应的播放按钮或者 Test Navigator 中对应 function 的播放按钮,就可以开始执行 UI 测试。而开始 UI 测试后,会先执行源码编译,将 Target 中的源码编译出产物,启动 Test App 进程,进入 Test 程序执行 app.launch() 则会启动 App,然后执行断言源码。

iOS 自动化测试工具链

编写了基本的 UI 测试的 UITest Target 方法之后,我们可以利用相关命令行工具链,将 iOS UI 自动化测试脚本化,从而可以方便集成入 CI 流程。

xcodebuild

xcodebuild test -project UITestDemo.xcodeproj -scheme UITestDemoUITests -destination 'platform=iOS,id=<iPhoneUDID>'

可以利用上述命令执行自动化测试,也可以将命令进行拆分,拆分为测试编译命令和测试执行命令,以便细化自动化测试过程。
测试编译命令:

xcodebuild build-for-testing -project ****.xcodeproj -scheme **** -configuration Debug -sdk iphonesimulator -destination 'platform=iOS Simulator,id=XXXXX' -derivedDataPath ~/derived_path -quiet COMPILER_INDEX_STORE_ENABLE=NO GCC_WARN_INHIBIT_ALL_WARNINGS=YES | tee build.log

测试执行命令:

xcodebuild test-without-building -xctestrun ****.xctestrun -configuration Debug -sdk iphonesimulator -destination 'platform=iOS Simulator,id=XXXXXX' -derivedDataPath ~/derived_path -resultBundlePath ****.xcresult -only-testing:****-UITests/TargetTests

xcrun simctl

simctl 命令是 xcrun 的一套自命令,提供一系列用来控制 iOS 模拟器的命令。

列举当前已经启动的模拟器 xcrun simctl list devices | grep booted

启动模拟器 xcrun simctl boot XXXXX

关闭模拟器 xcrun simctl shutdown XXXXX

设置模拟器权限 xcrun simctl privacy XXX grant location-always xx.xx.xxx

安装 App xcrun simctl install {} {}'.format(uuid, app_path)

运行指定 App xcrun simctl launch {} {}'.format(uuid, bundle_id)

结束指定 App xcrun simctl terminate {} {}'.format(uuid, bundle_id)

卸载指定 App xcrun simctl uninstall {} {}'.format(uuid, bundle_id)

ideviceinstaller

与控制模拟器相似,iOS 真机也有相应的控制命令行工具链,例如 ideviceinstaller

安装 apppath 下的 app ideviceinstaller -i apppath

安装 xxx.ipa 为应用在本地的路径ideviceinstaller -u [udid] -i [xxx.ipa]

卸载应用 ideviceinstaller -u [udid] -U [bundleId]

查看设备安装的第三方应用 ideviceinstaller -u [udid] -l

同上,查看设备安装的第三方应用 ideviceinstaller -u [udid] -l -o list_user

查看设备安装的系统应用 ideviceinstaller -u [udid] -l -o list_system

查看设备安装的所有应用 ideviceinstaller -u [udid] -l -o list_all

列出手机上所有的用户安装的app ideviceinstaller -l

ios-deploy

查看当前链接的设备 ios-deploy -c

安装APP ios-deploy --[xxx.app]

卸载应用 ios-deploy --id [udid] --uninstall_only --bundle_id [bundleId]

查看所有应用 ios-deploy --id [udid] --list_bundle_id

查看应用是否安装 ios-deploy --id [udid] --exists --bundle_id

利用以上命令行工具链,就可将 UI 自动化测试根据不同项目进行自定义的脚本接入 CI 流程,比如接入 GitLab Pipelines 中,对 code review、 merge request 等过程进行干预。

基于 Web Service 的架构设计

App 自动化测试平台的架构设计

从前文中我们了解到,我们可以利用 Xcode 创建 UITest Target,编写 UITest Case 测试脚本,辅以 xcodebuild 等相关命令工具链编写自动化脚本,就能接入 CI/CD 流程,实现 iOS App 的 UI 自动化测试,从而达到释放人力资源,降低人工测试的成本的目的。

但与此同时,又有新的问题出现,那就是业务频繁的迭代的情况下,我们写的 Test Case 脚本,很容易因为业务的改变而导致废弃,测试脚本复用率低,又增加了开发成本。如果不同系统平台的 App,如,Android、iOS 甚至 Web App 能共用一套测试脚本,提高脚本复用率,会降低开发成本,更有利于业务回归。

除此之外,对于复杂业务的回归测试,若希望提高大量测试 case 的业务回归效率,必然要提高并发性,缩减测试时间。故在这样的需求下, Facebook 团队就设计出了 Appium 这样的基于 Web Service 的自动化测试工具。类似 Appium 的测试工具还有阿里巴巴团队设计的 Macaca,这类测试工具的设计架构如下图可视。

execute-test

基于 Web Service 的自动化测试的架构主要可以分为命令分发服务 Web Service 模块和 UI 测试驱动模块。

对于命令分发服务模块,其任务是搭建通用测试 case 脚本与底层驱动之间的通信桥梁,而 HTTP RESTful API 恰能满足这样跨平台的需求。因此,Web Service 模块需要搭建 HTTP Web Service 进行命令转发,将自动化测试中的 Test Case 脚本作为 Web Service 的 Client 端,向 Web Service 的 Server 端发送请求。而 Web Service 的 Server 接收到请求后,再将请求转发到底层的 UI 测试的驱动进程,以便后续驱动 UI 测试。

对于 UI 测试驱动模块,其主要任务是,接收 Web Service Server 端转发来的请求,并触发驱动进程进行 UI 自动化测试,最终收集测试结果,并生成测试报告。Android 操作系统的底层驱动一般是 UIAutomator 程序;而对于 iOS 系统, Appium 用的是 WebDriverAgent,Macaca 是 XCTestWD。而不论 WebDriverAgent 还是 XCTestWD 都是一个基于 XCUITest 的 Xcode project,其技术核心也就是我们前文介绍的以 XCUITest 和 Accessibility 为基础的 iOS UI 自动化测试技术。

App 自动化测试平台,需要先运行 Web Service Server,Server 作为测试指令的发出者,向测试驱动发出请求,从而驱动 Test App 进程操作 App。因此,需要先在 Jenkins Slave 机器启动运行 Web Service Server,例如,在本地 4722 端口创建 Web Service,并监听 Client 向该端口发送的请求,再转发给驱动层。

驱动项目(WebDriverAgent 或 XCTestWD)编译成功后,都会在运行的设备上创建并运行一个 Runner 程序,该程序就是利用 XCUITest 编译成 Test App,但与前文 Demo 不同的是,这个程序会在设备上也会创建一个 Web Service,接收 Server 发来的请求,并根据 Test App 中程序处理请求,最后返回响应结果给 Server。

例如,创建测试 Session 过程,WebDriverAgent 编译成功后会在测试设备的 8080 端口创建 Web Service,从而 Jenkins Slave 上运行的 Web Service Server 能够将 Client 的请求转发给 WebDriverAgent 创建的 Web Service,然后经过 WebDriverAgent 的内部路由/wd/hub/session 进行映射,找到对应创建 session 的具体代码,保存 Session ID 值,并将 Session ID 作为响应结果返回给 Jenkins 的 Web Server。其他测试操作如,查找 element、查找元素 value,滚动某个元素等操作,这些操作 Jenkins 的 Web Service C/S 和底层驱动间的通信过程,都与建立 Session 过程相类似。

所以,有了基于 Web Service 的 UI 自动化测试工具,我们可以更加高效地进行自动化测试,复用性更高、可支持多平台,跨平台测试,甚至可以利用其 Web Service 搭建分布式的测试平台,基于 Jenkins 服务的架构设计如下图所示。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AsSeoHUT-1635928622930)(https://niyaoyao.github.io/images/uitest/jenkins-slave.png)]

根据上图架构设计,我们可以利用多台机器搭建 Jenkins 集群,根据我们 CI/CD 流程所需,向 Jenkins Server 发送请求,再由 Jenkins Server 分配不同 Jenkins Slave 执行 Job,每个 Jenkins Slave 都配置好 UI 自动化测试平台驱动多台设备进行自动化测试。从而实现分布式的自动化测试平台,提高并发性、提升测试效率,缩减回归测试的时间。

接下来就分别介绍 Appium 和 Macaca 的简单使用。

Appium 工具链矩阵

WebDriverAgent

WDA 是 Facebook 基于 XCUITest 测试框架开发的 iOS UI 自动测试 Driver。类比 Macaca Runner。

源码安装 WDA
git clone https://github.com/appium/WebDriverAgent.git
真机测试修改 Team ID

选择 Apple 开发账号的 Team。

Appium Web Service Server

Appium Server 用于 HTTP 命令转发,驱动底层 Driver WDA。

利用 Appium Desktop 启动 Server

下载链接 https://github.com/appium/appium-desktop/releases/download/v1.21.0/Appium-mac-1.21.0.dmg

安装 Appium App,并用 GUI App 启动 Server。

利用 Appium Command 启动 Server
安装 Nodejs 依赖

执行命令行

npm install -g appium
启动 Server

执行命令行

appium -a 127.0.0.1 -p 4722

参数列表:http://appium.io/docs/en/writing-running-appium/server-args/index.html

端口映射

执行命令行

iproxy [LOCAL_TCP_PORT] [DEVICE_TCP_PORT]

http://manpages.ubuntu.com/manpages//trusty/man1/iproxy.1.html

https://github.com/libimobiledevice/libusbmuxd/blob/master/tools/iproxy.c

端口映射关系

执行命令行

appium -a 127.0.0.1 -p 4722 --webdriveragent-port 8123

如果启动 appium server 时设置了 WDA 的 Port 为 8123,则 iproxy 命令第一个入参须是本地监听端口可任意随机选择,第二个入参必须对应 appium 命令指定的 WDA 的端口,可如下执行

iproxy 8100 8123
驱动 Runner 存储位置

全局安装 appium server 到本地后,WebDriverAgent.xcodeproj 存储在以下路径中。

/usr/local/lib/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeproj

Web Service Client —— Test Case

测试项目

https://github.com/appium/appium/tree/master/sample-code

javascript-webdriverio
安装依赖

执行命令行

cd appium-master/sample-code/javascript-webdriverio
npm install
修改配置

修改测试脚本中 capabilities 配置。

const iosCaps = {platformName: 'iOS',automationName: 'XCUITest',deviceName: process.env.IOS_DEVICE_NAME || 'iPhone',udid: 'iphone udid',platformVersion: process.env.IOS_PLATFORM_VERSION || '13.6.1',noReset: true,bundleId: 'your app id',app: undefined // Will be added in tests
};

capabilities 文档
https://appium.io/docs/en/writing-running-appium/caps/

https://appium.io/docs/en/writing-running-appium/default-capabilities-arg/

运行 Case

执行命令行

npm test

Macaca 工具链矩阵

与 Appium 相类似,Macaca 的工具链矩阵也包含 DriverWeb Service ServerWeb Service Client

安装 Macaca 工具链

# 本地安装
$ npm i macaca-ios --save-dev
# 全局安装
$ npm i macaca-ios -g
# 安装有 TEAM_ID 的 macaca-ios
$ DEVELOPMENT_TEAM_ID=TEAM_ID npm i macaca-ios -g

更多详细安装过程可参阅官方文档 https://macacajs.github.io/zh/guide/environment-setup.html#%E5%AE%89%E8%A3%85-node-js

Appium 与 Macaca 的对比

框架名称相同点不同点
Appium基于 XCUITest 和 Accessibility 设计的 iOS UI 自动化测试技术驱动项目利用 Objective-C 编写,社区更完善,项目更新迭代更活跃,用户数量更多。
Macaca基于 XCUITest 和 Accessibility 设计的 iOS UI 自动化测试技术驱动项目利用 Swift 编写,社区生态相对不完善,维护较不活跃,用户量相对较少。

我们的 UI 自动化测试平台最初仅接入 Macaca 框架,独立维护一份仓库以供内部平台使用。而维护过程中也会遇到各种问题并自行解决,验证无误后也会反馈给官方,并提供相应解决方案。目前也已开始逐步接入 Appium 框架对现有平台进行技术改造,以适应更多场景,以及保障框架长期稳定可持续地维护。

Trip.com App 自动化测试现状

Trip.com App 在日常开发迭代过程中, UI 自动化测试的应用场景有很多,例如冒烟测试、探索测试,以及基于 Web Service 的 UI 自动化测试平台。接下来,向大家分别介绍不同测试在 CI/CD 中扮演的角色和作用。

应用场景

冒烟测试

基本概况

在程序设计和软件测试领域 , 冒烟测试 (也包括信心测试 、健全性测试、 [1] 构建验证测试 ( BVT ) [2] [3]、构建验收测试 )是指初步地进行测试,并以此展示一些简单但足以影响发布软件版本的这一高级别的错误。 —— Wikipedia

在 Trip.com 实际应用场景中,冒烟测试所担任的角色主要是 Merge Request 卡点检测,其主要作用是对 Trip.com App 的集成编译以及运行时闪退的预先校验。比如,对于多模块并行开发的情况下,不同团队的某些改动就会造成符号名找不到的问题,而冒烟测试就可以预先对此进行卡点,避免集成打包失败降低试错成本和时间成本。

而对于 Trip.com iOS 的冒烟测试具体实践,就是在主项目中创建 UITest Target 编写简单的 UI 视图校验程序,并接入 GitLab Runner Pipeline,利用 xcodebuild 工具链对编译过程和运行时健壮性进行初步校验,以保证合入主分支的代码,不会使 App 出现明显的重大闪退等问题。

数据体现

冒烟测试在 Trip.com 快速迭代开发的过程中,作为 Merge Request 的卡点任务,利用多台 GitLab Runner 实现并发执行六个冒烟测试任务,大大缩减了卡点校验的时间,单个冒烟测试时间控制在 6min 之内,不仅达到了验证集成包的编译构建和健壮性的目的,还大大节省了测试验证的时间成本。

探索测试

基本概况

探索性测试(Exploratory Testing)是软件测试方法的一种,它的特点为在进行测试时,同时探索开发更多不同型态的测试方式,以便改善测试流程。 —— Wikipedia

探索测试在 Trip.com App 实际应用场景中,主要担任的角色是 App 页面随机测试,主要用于验证集成打包 App 的质量,随机点击页面,并收集和统计 Page View 以及 Crash 数据,最终整理成报告发给相关开发同学。

exploretest

Trip.com iOS 探索测试是基于 Google eDistantObject 和 EarlGrey 开源项目开发的白盒/灰盒 UI 测试框架。区别于 XCUITest 编写 Test Case 并且必须结合 Accessibility 的测试方式,白盒/灰盒的探索测试框架,则是利用 Test App 和 Host App 进程间通信,使 Test App 驱动 Host App 进行 UI 自动化测试,而 App 的元素审查、用户交互以及数据收集则都是在 Host App 进程中完成。 没有了 Accessibility 的限制,白盒/灰盒的探索测试元素审查更全面,稳定性更高,测试数据也相应更全面。

数据体现

Trip.com 探索测试是用于验证 App 集成包稳定性的日常 Jenkins 任务,收集全部触达页面,可有效预先发现 Crash 问题,并发送测试结果的报告邮件给研发组。iOS 的探索测试在并发数为 5 的情况下,2 小时测试有效触达非重复页面可达 180 个,场景涉及首页 Feed 流、玩乐旅拍、订单页面等场景。探索测试收集的 Crash 问题,会收集崩溃调用栈整理成表格,分配给相关研发同学,推动产线修改相关问题代码。

UI 自动化测试平台

基本概况

Trip.com App UI 自动化测试平台,是由 IBU 公共测试团队和 IBU 公共无线共同设计搭建的可视化、数据统一管理的质量保证平台。在 App 快速迭代的开发过程中,为提高测试效率,利用多台机器,搭建 Jenkins 集群,实现用例并发执行 Case,进行 App 回归测试,减少人力测试成本,并将测试问题报告反馈给相关开发同学,推动开发同学完善功能,从而,保证 App 上线前的质量。而选用的测试框架主要是 Macaca,并且将逐步向 Appium 迁移改造。

数据体现

UI 自动化平台目前处于开发的一阶段,日常回归测试中,对于复杂业务场景的测试,机器性能稳定且并发数目 6 的情况下,测试总耗时可控制在 40 分钟,测试总用例数可达 209 个,Step总数 3077 步,Feature 通过率达 97.14% ,Case 通过率达 98.56%

以上不同的自动化测试应用实践,接入不同的 CI/CD 流程中,都为 Trip.com App 快速开发迭代过程中提供了质量保证。

总结

对于 iOS 平台下的 UI 自动化测试技术,Apple 官方提供的两个核心技术是 XCUITestAccessibility。而为了能够增强复用性,更利于分布式进行自动化测试,不同厂商又在此基础上设计实现了基于 Web Service 的自动化测试平台,优点是具有易部署、跨平台等特性,可以更大程度上利用分布式增强并发性,提高测试效率,减少人力测试成本。

当然,市面上 UI 自动化框架还有很多,例如 STF 和 Airtest,这类框架底层驱动利用图形图像识别进行 App 元素的定位。而对于目前 Trip.com iOS 的自动化测试应用实践,则更多是基于 XCUITest 框架实现的,所以本文暂不讨论此类测试框架。但不论何种驱动进行 App 的自动化测试,整体的架构设计都会以文中介绍的 Web Service 进行设计,以达到跨平台、易集成、高复用等目的。

特别鸣谢

感谢读到本文最后的你,当然除了感谢耐心读完文章的每一位读者,我还想感谢我们 Trip.com IBU 公共无线团队的每一位小伙伴,尤其感谢我的 leader 郭耀家(Shanks) 同学 😄。

在我加入 IBU 大家庭的这一年多的时间中,Shanks 对我足够的信任,放手让我尝试各种不同的项目。从入职到现在,我参与了诸如,编译打包时间优化、支持 Swift Coverage 增量覆盖率,CI/CD 流程自动化提升,以及 UI 自动化测试等一系列我之前从未接触过的技术,使我个人在这一年的时间里,技术水平有了迅猛提升,眼界也更开阔。在工作的过程中,我如果遇到很困难的问题,也可以和 Shanks 沟通交流,从而获得不同的解决思路。除此之外,Shanks 也没有给我施加过大的心理压力,只要最终结果能符合预期,即便过程并不顺畅也不会对我有过多苛责。所以,衷心感谢香克斯同学对我的帮助,也祝 Shanks 一切顺利、天天开心。

在 IBU 工作的一年多时间是相当愉快的,而 IBU 公共无线团队也是是我从业至今感觉最喜欢、最欢乐的团队。所以,这篇文章也是我给团队的一份答卷,如果自己给这一年多的成长和成果打分,我感觉我能得 75 分吧。所以很感谢现在的团队给我尝试和挑战的机会,我也很珍惜和团队里每一位小伙伴共同协作的时光,希望今后继续扬帆远航,活到老学到老,归来依旧是少年,加油!

当然,如果此时此刻的你,有意加入我们 IBU 公共无线团队,想和我们小伙伴一起参与质量保证、CI/CD 效率工具等研发工作,欢迎各位能人贤士发送简历到 y_ni@trip.com,期待大神带我飞 😁。

参考资料

  • 闲话iOS探索测试实现 https://shanks.pro/2020/05/16/ios-explore-test/
  • Testing with Xcode - User Interface Testing https://developer.apple.com/library/archive/documentation/DeveloperTools/Conceptual/testing_with_xcode/chapters/09-ui_testing.html#//apple_ref/doc/uid/TP40014132-CH13-SW1
  • WWDC2015 UI Testing in Xcode https://devstreaming-cdn.apple.com/videos/wwdc/2015/406o0doszwo8r15m/406/406_ui_testing_in_xcode.pdf?dl=1
  • WWDC2019 Testing in Xcode https://devstreaming-cdn.apple.com/videos/wwdc/2019/413kpguqjv5fqp9/413/413_testing_in_xcode.pdf?dl=1
  • Accessibility and UI Testing in iOS https://medium.com/@jchen_77520/accessibility-and-ui-testing-in-ios-3eb0822a17fb
  • UIAccessibility https://developer.apple.com/documentation/objectivec/nsobject/uiaccessibility
  • UIAccessibilityContainer https://developer.apple.com/documentation/objectivec/nsobject/uiaccessibilitycontainer
  • iOS真机命令(自动化测试) https://www.cnblogs.com/xiyuan2016/p/9929814.html
  • Black Box Testing https://www.imperva.com/learn/application-security/black-box-testing/
查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 【DDD】- DDD全集

    为什么会出现默认方法? 接口中出现默认方法&#xff0c;且类可以实现多接口的&#xff0c;那和抽象类有啥区别? 多重实现的默认方法冲突怎么办? 一.DDD&#xff1f; 我们首先来讲下模型吧&#xff01; 1、模型&#xff1a;对现实世界的抽象 2、模型的特点&#xff1a; 为…...

    2024/3/6 9:24:26
  2. 大家信夫结合信用经济加速发展 数字信用迎来新机遇

    近年来信用经济在国内呈现蓬勃发展态势&#xff0c;各地纷纷加大信用体系建设。大家信夫企业信用平台将总结信用经济的创建经验&#xff0c;整合信用经济相关产业资源&#xff0c;积极探索信用经济所需标准、技术、产品和平台体系&#xff0c;助力全国信用经济体系建设和发展。…...

    2024/3/6 9:24:26
  3. 百度一面总结

    1. 二进制重排 1.1 clang 插桩具体如何做的 1.2 c 方法 clang 插桩能否取到&#xff1f; 不能 可以取到 c 函数&#xff0c;oc 方法&#xff0c;block&#xff0c;swift 方法 但是可以用 -finstrument-functions 在编译期插桩 “hook”&#xff0c;或者使用并不完美但成本最…...

    2024/3/28 17:05:14
  4. Web前端技术前景怎么样?需要专业学习吗

    Web前端技术前景怎样&#xff1f;为提升技能要专业学习吗&#xff1f;众所周知&#xff0c;Web前端的学习门槛相对要低一些&#xff0c;对于计算机基础比较薄弱的初学者来说&#xff0c;从Web前端开始学起也是不错的选择。不过随着越来越多的人加入前端开发行列以及互联网技术的…...

    2024/3/28 6:51:08
  5. 如何将租用的香港服务器性能优化?

    租用香港服务器的用户数量在近几年持续上升&#xff0c;香港服务器已经逐渐成为大部分站长的建站服务器之一&#xff0c;为了确保网站持续稳定运行&#xff0c;需要不断的进行优化工作&#xff0c;除了对网站页面的优化以外&#xff0c;还有什么方式可以优化网站的访问速度呢?…...

    2024/3/15 9:31:37
  6. 2021年全球与中国血细胞计数器行业市场规模及发展前景分析

    2021年全球与中国血细胞计数器行业市场规模及发展前景分析 本报告研究全球与中国市场血细胞计数器的发展现状及未来发展趋势&#xff0c;分别从生产和消费的角度分析血细胞计数器的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品…...

    2024/3/21 23:21:38
  7. [数据结构与算法] 链表 II

    [数据结构与算法] 链表 II一、理解指针或引用的含义二、警惕指针丢失和内存泄漏&#xff08;单链表&#xff09;三、利用“哨兵”简化实现难度引入”哨兵“&#x1f46e;‍♂️举例对比有无哨兵的情况四、重点留意边界条件处理五、举例画图&#xff0c;辅助思考六、多写多练一、…...

    2024/3/20 18:22:40
  8. C语言基础学习1

    目录 一、编译/执行 C 程序 二、C基本语法 C 的令牌 分号 注释 标识符 关键字 C 中的空格 三、C数据类型 整数类型 浮点类型 void 类型 一、编译/执行 C 程序 C 程序主要包括以下部分&#xff1a; 预处理器指令函数变量语句 & 表达式注释 #include <stdio…...

    2024/3/15 19:00:55
  9. 蚂蚁分类信息系统6增加批量发送短信功能

    蚂蚁分类信息系统6增加批量发送短信功能 批量发送营销短信 设置短信模板 选择发布的会员 选择短信模板 批量发送...

    2024/3/18 3:39:49
  10. 玩转StyleGan2:手把手教你安装并运行项目!

    时间过得是真快,离上次分享《用AI生成一堆漂亮且独一无二的女朋友!》已经快过去半个多月了。光分享效果,而不分享如何实现,这不是我的风格。所以从今天开始,我会带大家一起玩转这个强大的高清人脸生成项目(不懂开源项目的可以理解为软件)。目前规划了几个主题1. 安装并运…...

    2024/3/26 10:17:22
  11. HTML案例设计(用户信息提交表单)

    最近学习了HTML语法知识&#xff0c;详见内容请戳此次HTML基础知识 遂做了此前端界面&#xff0c;比较简略&#xff0c;但是算对Web开发有了初步的认识。 先放效果图出来。 你的三连就是我创作的动力。 HTML代码&#xff08;本次知识点将会不定期补充&#xff09; <html…...

    2024/3/4 15:22:17
  12. 人脸识别资源大列表(人脸识别检测,关键点检测 看这些就够了)

    文章内相关链接,可以直接点解页面 链接:点这里 几篇知乎 《人脸识别方向有哪些大牛?目前的发展如何? - 知乎》 O从认知心理学的角度来说,人脸识别方向有哪些… 《谈到人脸识别技术,有哪些常见的误区? - 知乎》 O谈到人脸识别技术,有哪些常见的误区? - 知乎 ​​​​ 《…...

    2024/3/4 15:22:16
  13. Redis设计与实现-基础数据结构与对象-思维导图

    ...

    2024/3/4 15:22:16
  14. python根据url批量获取title

    # -*- coding: utf-8 -*- import re import requests from bs4 import BeautifulSoup def pick_charset(html): charset None m re.compile( <meta .*(http-equiv"?Content-Type"?.*)?charset"?([a-zA-Z0-9_-])"?, re.I).search(html) if m a…...

    2024/3/6 9:24:15
  15. opengl 深度测试+透明几何体

    在opengl渲染中会有透明物体和不透明之分&#xff0c;若打开深度测试&#xff0c;那么渲染过程中前方的透明物体会完全挡住后方的物体&#xff0c;“透明”变得不“透明”&#xff1b;若关闭深度测试&#xff0c;那么渲染时颜色为多个物体的颜色叠加&#xff0c;无遮挡效果。 …...

    2024/3/6 9:24:14
  16. idea 将分支代码合并到master分支

    一.创建一个新的分支 1.先把代码切换到master分支上 2.分支名称 3.然后Push&#xff0c;新的分支就创建好了&#xff01;&#xff01;&#xff01; 一.将创建的分支代码合并到master分支 1.先切换master分支 2.在Remote Banches找到自己需要合并到master的分支&#xff0…...

    2024/3/6 9:24:13
  17. 使用 equals 比较时出现空指针异常NullPointerException的解决

    示例&#xff1a; 如比较两个对象数组中的元素是否相同时 arr1:[null,null,3] arr2:[0,null,null] 当执行 arr1[0].equals(arr2[0]) 即 null.equals(0)时会报空指针异常NullPointerException当执行 arr1[1].equals(arr2[1]) 即 null.equals(null)时会报空指针异常NullPointerE…...

    2024/3/6 9:24:12
  18. swin transformer

    如何看待微软亚洲研究院的Swin Transformer&#xff1f; - 知乎Swin Transformer最重要的两点是hierarchical feature representation和SW-MSA&#xff08;Shifted Window based Mu…https://www.zhihu.com/question/451860144/answer/1812073911Swin Transformer对CNN的降维打…...

    2024/3/6 9:24:11
  19. 生成二维码及海报 html2canvas 、qrcodejs2

    案例下载地址 https://download.csdn.net/download/qq_39161501/36761918https://download.csdn.net/download/qq_39161501/36761918 https://download.csdn.net/download/qq_39161501/36761918...

    2024/3/16 17:47:20
  20. 使用MongoRepository对数据进行增删改查,出现java.lang.IllegalArgumentException: MongoOperations 必须不能为null

    原因&#xff1a;百度MongoOperations 类是做什么的&#xff0c;发现MongoTemplate类实现MongoOperations类 在使用MongoRepository时&#xff0c;程序也是借助MongoOperations 完成对应的操作&#xff0c;可以MongoRepository工厂构造会传入MongoOperations 类&#xff0c;获取…...

    2024/3/6 9:24:10

最新文章

  1. redis的设计与实现(四)——单机数据库特性

    1. 前言 我们前面了解了redis的数据结构&#xff0c;对象。但是redis对于这些对象的使用和管理策略需要也熟记于心&#xff0c;这篇文章我们就了解一下吧。 2. 类型检查和命令多态 DEL,EXPIRE,RENAME,TYPE,OBJECT 可以对任何数据类型执行SET,GET,APPEND,STRLEN&#xff0c;等…...

    2024/3/28 22:44:37
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. vscode添加gitee

    1.创建仓库 2.Git 全局设置 3.初始化仓库 2.1 打开vscode打开需要上传到给git的代码文件 2.2.点击左边菜单第三个的源代码管理->初始化仓库 4.点击加号暂存所有更改 5.添加远程仓库 5.1 添加地址&#xff0c;回车 5.2 填写库名&#xff0c;回车 6.提交和推送 6.1 点击✔提交…...

    2024/3/28 22:20:56
  4. Controller中接收数组参数

    1、场景 需要根据用户id集合批量删除用户数据&#xff0c;前端使用post请求&#xff0c;controller中参数接收数组参数并根据用户id删除用户基本信息 2、分析处理&#xff1a; 2.1、前端请求类型contentType:application/json 请求体中为json字符串&#xff0c;后端新建一个U…...

    2024/3/28 3:27:23
  5. 机器学习_推荐系统

    文章目录 定义问题基于内容的推荐系统协同过滤 定义问题 我们从一个例子开始定义推荐系统的问题。 下面引入一些标记&#xff1a; 基于内容的推荐系统 在一个基于内容的推荐系统算法中&#xff0c;我们假设对于我们希望推荐的东西有一些数据&#xff0c;这些数据是有关这些…...

    2024/3/28 0:56:02
  6. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/3/27 10:21:24
  7. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/3/24 20:11:25
  8. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/3/18 12:12:47
  9. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/3/24 20:11:23
  10. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/3/26 20:58:42
  11. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/3/28 17:01:12
  12. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/3/24 5:55:47
  13. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/3/27 10:28:22
  14. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/3/26 23:04:51
  15. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/3/26 11:20:25
  16. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/3/24 20:11:18
  17. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/3/28 9:10:53
  18. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/3/24 20:11:16
  19. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/3/24 20:11:15
  20. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/3/27 7:12:50
  21. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/3/24 20:11:13
  22. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/3/26 11:21:23
  23. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/3/28 18:26:34
  24. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/3/28 12:42:28
  25. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/3/28 20:09:10
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  27. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  45. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57