app稳定性测试-iOS篇

稳定性测试:测试应用程序在长时间运行过程中是否存在内存泄漏、崩溃等问题,以确保应用程序具有较高的稳定性和可靠性。

对于安卓端,官方提供了很好的稳定性测试工具:monkey。相比较而言,iOS则没有,而且当前网络上似乎也没有很好的第三方工具可以使用,因此只能自己写了。

我们要开发的iOS稳定性测试程序,应该至少包含以下内容:

  • 持续随机触发UI事件

  • 崩溃重启,测试不中断

  • 日志记录

首先我们确定以上设想的可行性,然后再制定实施方案。在iOS原生开发语言swift和object-C中提供了可进行单元测试和UI测试的XCTest框架,而同样可进行移动端UI测试的第三方框架还有Appium等,但相比较第三方的开源框架,原生的XCTest框架性能更好且更稳定,因此这里我们选择基于swift语言和XCTest框架来开发。

XCTest框架提供了非常全面的启动App和UI操作相关的API接口, 因此1、2两点完全可以实现,当然第三点的日志记录的实现也同样不会有什么问题。接下来就是具体实施了。

首先,我们创建一个用来执行测试的主类:StabilityTestRunner,然后再编写代码去实现以上三点。

持续随机触发UI事件

让我们拆分一下,随机触发UI事件,实际上包含两部分:随机UI元素和随机的UI操作。

那么:随机生成UI元素:

func randomElement(of types: [ElementType]) -> XCUIElement? { var allElement:[XCUIElement] = [] for type in types { if !self.exists{ break } var elements: [XCUIElement] if self.alerts.count > 0 { elements = self.alerts.descendants(matching: type).allElementsBoundByIndex }else { elements = self.descendants(matching: type).allElementsBoundByIndex } let filteredElements = elements.filter { element in if !element.exists { return false } if !element.isHittable || !element.isEnabled { return false // Filter out non clickable and blocked elements. } return true } allElement.append(contentsOf: filteredElements) } return allElement.randomElement() }

随机生成UI操作:

/** Random execution of the given UI operation. - parameter element: Page Elements. - parameter actions: Dictionary objects containing different UI operations. */ private func performRandomAction(on element: XCUIElement, actions: [String: (XCUIElement) -> ()]) { let keys = Array(actions.keys) let randomIndex = Int.random(in: 0..<keys.count) let randomKey = keys[randomIndex] let action = actions[randomKey] if action == nil { return } if !element.exists { return } if !element.isHittable { return } Utils.log("step\(currentStep): \(randomKey) \(element.description)") action!(element) }

持续测试和崩溃重启

while !isTestingComplete{ // Randomly select page elements. let element = app.randomElement(of: elementType) if element != nil { currentStep += 1 takeScreenshot(element: element!) performRandomAction(on: element!, actions: actions) // Perform random UI operations. XCTWaiter().wait(for: [XCTNSPredicateExpectation(predicate: NSPredicate(format: "self == %d", XCUIApplication.State.runningForeground.rawValue), object: app)], timeout: stepInterval) if app.state != .runningForeground { if app.state == .notRunning || app.state == .unknown { Utils.saveImagesToFiles(images: screenshotData) Utils.saveImagesToFiles(images: screenshotOfElementData, name: "screenshot_element") Utils.log("The app crashed. The screenshot before the crash has been saved in the screenshot folder.") } app.activate() } } }

日志记录

记录截图并标记UI元素:

private func takeScreenshot(element: XCUIElement) { let screenshot = app.windows.firstMatch.screenshot().image if screenshotData.count == 3 { let minKey = screenshotData.keys.sorted().first! screenshotData.removeValue(forKey: minKey) } let screenshotWithRect = Utils.drawRectOnImage(image: screenshot, rect: element.frame) screenshotData[currentStep] = screenshotWithRect.pngData() let screenshotOfElement = element.screenshot().pngRepresentation if screenshotOfElementData.count == 3 { let minKey = screenshotOfElementData.keys.sorted().first! screenshotOfElementData.removeValue(forKey: minKey) } screenshotOfElementData[currentStep] = screenshotOfElement }

通过文本日志记录测试执行过程:

static func log(_ message: String) { print(message) let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss" let dateString = dateFormatter.string(from: Date()) let fileManager = FileManager.default do { try fileManager.createDirectory(atPath: logSavingPath, withIntermediateDirectories: true, attributes: nil) } catch { print("Error creating images directory: \(error)") } var fileURL: URL if #available(iOS 16.0, *) { fileURL = URL.init(filePath: logSavingPath).appendingPathComponent("log.txt") } else { fileURL = URL.init(fileURLWithPath: logSavingPath).appendingPathComponent("log.txt") } do { try "\(dateString) \(message)".appendLineToURL(fileURL: fileURL) } catch { print("Error writing to log file: \(error)") }

日志导出:

// To add the log files to the test results file, you can view it on your Mac. The test results file path: /User/Library/Developer/Xcode/DerivedData/AppStability-*/Logs. let zipFile = "\(NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0])/Logs.zip" let attachment = XCTAttachment(contentsOfFile: URL(fileURLWithPath: zipFile)) attachment.name = "Logs" attachment.lifetime = .keepAlways // Add the "Logs.zip" file to the end of test result file. add(attachment) Utils.log("The logs for test steps has been added to the end of test result file at /User/Library/Developer/Xcode/DerivedData/AppStability-*/Logs")

注:以上代码只是主体实现,了解相关细节可通过GitHub或Gitee查阅完整代码。

总结

总的来说实现起来并不是很困难,当然从程序使用角度而言,用户可自定义随机UI事件的UI元素范围和UI操作的范围以及测试执行的时长和时间间隔,因此需要对ios应用程序和Xcode的使用以及iOS UI事件有一定的了解,具体使用可查看完整工程中的示例。

感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取

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

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

相关文章

导师严选10个AI论文平台,助你轻松搞定本科论文!

导师严选10个AI论文平台&#xff0c;助你轻松搞定本科论文&#xff01; AI 工具如何帮你轻松应对论文写作难题 在当前的学术环境中&#xff0c;越来越多的本科生开始借助 AI 工具来提升论文写作效率。这些工具不仅能够帮助学生快速生成初稿&#xff0c;还能在降低 AIGC 率、保持…

工业大数据如何定义及其在制造业中的核心价值

工业大数据的定义与范畴 工业大数据并非传统企业数据的简单延伸&#xff0c;而是特指在工业场景下由设备、系统和业务流程产生的海量多模态数据集合。它与普通商业数据的区别主要体现在三个方面&#xff1a;数据来源的复杂性、实时性要求以及分析目的的差异性。工业数据往往来…

NJet MCP网关:让AI 从“能聊”到“能干”

在AI应用爆炸式增长的今天&#xff0c;你是否也面临这样的困境&#xff1f;想让AI分析最近的销售数据&#xff0c;却发现数据被锁在CRM、ERP等不同系统中&#xff0c;形成一个个孤岛。兴奋地给AI接上了十几个工具API&#xff0c;随之而来的却是密钥管理混乱、权限失控和安全漏洞…

图片批量压缩神器!一秒搞定,可对图片格式转换,压缩后画质依旧清晰~

下载链接 https://pan.freedw.com/s/40lE2p 软件介绍 图片批量压缩神器&#xff01;一秒搞定&#xff0c;可对图片格式转换&#xff0c;压缩后画质依旧清晰~ MSTech Image Resize 是一款适用于 Win系统的图片处理软件&#xff0c;语言为简体中文。它功能强大且操作简单&…

1秒搞定文件/文件夹批量重命名,效率狂飙200%!支持14种命名方法,使用完全免费,批量修改处理~

下载链接 https://pan.freedw.com/s/cebt4c 软件介绍 1秒搞定文件/文件夹批量重命名&#xff0c;效率狂飙200%&#xff01;支持14种命名方法&#xff0c;使用完全免费&#xff0c;批量修改处理~ 如果你有文件、文件夹需要重命名操作&#xff0c;那么这款完全免费且好用的文…

C盘瞬间多出10GB空间!电脑垃圾清理神器,支持重复文件清理、系统瘦身等,免安装无广告绿色版! 软媒清理大师

下载链接 https://pan.freedw.com/s/fCKLFP 软件简介 C盘瞬间多出10GB空间&#xff01;电脑垃圾清理神器&#xff0c;支持重复文件清理、系统瘦身等&#xff0c;免安装无广告绿色版&#xff01; 软媒清理大师 软媒清理大师最新版是一款功能全面的电脑清理工具。软媒清理大师…

电脑系统优化工具,免费且功能多Glary Utilities

下载链接 https://pan.freedw.com/s/HFXptd 软件介绍 Glary Utilities是一款免费系统清理与优化工具,是系统工具集合&#xff0c;能够修理、加速、增强和保护PC机。可清理系统垃圾文件&#xff0c;无效的注册表键值&#xff0c;上网记录等。它完全免费无广 软件特点 不用安…

你用Audiobookshelf 打造的专属有声书库,cpolar让它通勤、居家都超实用。

Audiobookshelf 作为一款开源的有声内容管理工具&#xff0c;核心功能覆盖有声书、播客的全流程管理&#xff0c;既能自动匹配音频封面、补全作者信息&#xff0c;也能精准记录多设备的收听进度&#xff0c;适配安卓 /iOS 手机、Windows/Mac 电脑、平板等多终端&#xff0c;尤其…

抠图新手必看~AI抠图免费使用,可替换背景,提高效率,替代ps抠图!

下载链接 https://pan.freedw.com/s/rcRXqK 软件介绍 抠图新手必看~AI抠图免费使用&#xff0c;可替换背景&#xff0c;提高效率&#xff0c;替代ps抠图&#xff01; 软件特点 完全免费软件可以在用户的本地计算机上运行&#xff0c;不需要网络连接支持 自动抠图和手动调节…

Spring Boot 核心接口与扩展点详细指南

Spring Boot 核心接口与扩展点详细指南引言在Spring Boot的便捷背后&#xff0c;隐藏着一套精妙而强大的扩展机制。无论是容器启动的瞬间&#xff0c;还是Bean生命的各个阶段&#xff0c;亦或是Web请求的完整链路&#xff0c;框架都为我们预留了丰富的扩展接口。这些接口如同Sp…

C# 封装、继承、多态 通俗解释

面向对象的三大特性&#xff08;封装、继承、多态&#xff09;核心是让代码更安全、更复用、更灵活&#xff0c;下面用「大白话 生活例子 极简代码」讲解&#xff0c;每个例子都能直接在 C# 控制台程序中运行。一、封装&#xff1a;藏细节、露接口&#xff0c;保护数据安全通…

无限制使用!Ai配音工具来了,免费文字转语音神器,支持多角色配音及一键生成视频字幕生成,祈风TTS

下载链接 https://pan.freedw.com/s/YBolZX 软件介绍 祈风 TTS 是一款由民间大神开发的免费配音软件&#xff0c;是一款完全免费的批量文字转语音工具&#xff0c;可以一键把多个文本生成不同的声音&#xff0c;且内置了非常多的人物音色&#xff0c;现在还支持长文本操作 软…

贵金属涨势愈发迅猛 背后核心动因深度解析

进入2026年1月&#xff0c;贵金属市场呈现“加速上涨、白银领跑”的态势&#xff0c;伦敦金现突破5000美元/盎司整数关口&#xff0c;最高触及5093.19美元/盎司&#xff1b;伦敦银现涨幅远超黄金&#xff0c;年内涨幅已超50%&#xff0c;涨势较去年四季度显著提速。这种迅猛涨势…

地下管网的“水质哨兵”如何实现72小时隐患预警?

地下管网水质监测系统是集感知、传输、处理、应用于一体的智能化在线监测体系&#xff0c;可实时采集管网关键节点水质数据&#xff0c;实现异常预警、污染溯源与运维优化&#xff0c;适配地下潮湿、腐蚀、信号弱等复杂环境&#xff0c;广泛用于市政排水、工业园区排污、黑臭水…

效果惊人的好!无需连网,本地离线跨平台一键AI抠图神器,开源免费使用,实用值得收藏 小宾AI抠图

下载链接 https://pan.freedw.com/s/S3fU02 软件介绍 这是我觉得现在功能最全的抠图软件了&#xff0c;效果很不错&#xff0c;而且有个单独的证件照抠图制作&#xff1b;使用开源模型 briaai/RMBG-1.4实现图像抠图,支持单张图像拖拽、粘贴图像和连接、和批量抠图&#xff0…

Pagehelper触发 JVM 类校验失败,Idea 却因 -noverify 藏了雷

问题现象 最近一个老的微服务引入了page-helper 6.0版本的 jar 包之后&#xff0c;微服务发布到环境上去之后直接启动不起来了&#xff0c;报 no such constructor 错误&#xff0c;但是&#xff0c;这个微服务在发布到环境上的时候在本地 Idea 里面启动过&#xff0c;但是在 …

Web测试和App测试的区别

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 相同点从软件测试方法看都需要进行功兼容性测试&#xff0c;能测试、性能测试、GUI测试&#xff0c;安全性测试&#xff0c;易用性测试等从软件测试流程看都需要…

2026成都壁挂炉维修优质服务推荐榜

2026成都壁挂炉维修优质服务推荐榜行业背景与筛选依据据《2026-2026中国家电维修行业发展白皮书》数据显示,成都地区壁挂炉保有量年增长率达18%,冬季供暖季维修需求环比提升47%。但市场服务存在技术水平参差不齐、响…

超纯水哪家口碑好?技术、服务与用户反馈全解析

市场分析 近年来,随着半导体制造、生物医药、高端科研等领域对水质要求的不断提升,超纯水设备市场需求持续增长。据行业数据显示,2026年中国超纯水市场规模已达到约120亿元,年增长率保持在15%以上。其中,半导体(占…

2026成都专业律师事务所推荐榜:成都遗产继承律师事务所、成都刑事律师事务所、成都交通事故罪辩护律师事务所、成都借款纠纷律师事务所选择指南

2026成都专业律师事务所推荐榜 引言据《2026中国刑事法律服务行业白皮书》数据显示,2026年全国刑事法律服务市场规模同比增长18%,其中成都地区因经济活跃度提升、企业合规意识增强,刑事纠纷案件量同比增长15%,刑事…