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事件有一定的了解具体使用可查看完整工程中的示例。感谢每一个认真阅读我文章的人礼尚往来总是要有的虽然不是什么很值钱的东西如果你用得到的话可以直接拿走这些资料对于【软件测试】的朋友来说应该是最全面最完整的备战仓库这个仓库也陪伴上万个测试工程师们走过最艰难的路程希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取

相关新闻

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

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

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

2026/7/9 3:17:25 阅读更多 →
导师严选10个AI论文平台,助你轻松搞定本科论文!

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

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

2026/7/7 11:59:33 阅读更多 →
CDN与边缘缓存策略——静态、动态与签名鉴权的组合拳

CDN与边缘缓存策略——静态、动态与签名鉴权的组合拳

写在前面,本人目前处于求职中,如有合适内推岗位,请加:lpshiyue 感谢。同时还望大家一键三连,赚点奶粉钱。本系列已完结,完整版阅读课联系本人 现代内容分发不是简单的缓存填充,而是静态加速、动…

2026/7/3 18:57:01 阅读更多 →

最新新闻

2026医院时钟系统排名TOP1是谁?全维度实力解析

2026医院时钟系统排名TOP1是谁?全维度实力解析

速览摘要本文基于公开可查的行业数据,对2026年国内医院时钟系统赛道T1梯队品牌进行全维度对比排名,适用人群包含医院基建/信息科采购人员、弱电工程商、手术室净化工程承包商等相关需求方。排名维度权重依次为中标数据40%、用户口碑30%、资质合规20%、产…

2026/7/10 9:04:39 阅读更多 →
如何在现代电脑上通过Xenia Canary重温Xbox 360经典游戏?实用安装与优化指南

如何在现代电脑上通过Xenia Canary重温Xbox 360经典游戏?实用安装与优化指南

如何在现代电脑上通过Xenia Canary重温Xbox 360经典游戏?实用安装与优化指南 【免费下载链接】xenia-canary Xbox 360 Emulator Research Project 项目地址: https://gitcode.com/gh_mirrors/xe/xenia-canary Xenia Canary是一款开源免费的Xbox 360模拟器研…

2026/7/10 9:02:39 阅读更多 →
SVPWM 空间矢量调制:从 MATLAB/Simulink 仿真到 STM32 实现,谐波降低 15%

SVPWM 空间矢量调制:从 MATLAB/Simulink 仿真到 STM32 实现,谐波降低 15%

SVPWM空间矢量调制技术:从MATLAB仿真到STM32嵌入式实现的工程实践引言:电力电子调制的技术演进在工业电机控制领域,如何高效精确地驱动三相电机一直是核心技术挑战。传统SPWM(正弦脉宽调制)技术虽然简单易实现&#xf…

2026/7/10 9:00:39 阅读更多 →
从自动化到主动智治:迈克生物携手华为推动医学检验智慧化实验室升级

从自动化到主动智治:迈克生物携手华为推动医学检验智慧化实验室升级

2026年7月8日,迈克生物股份有限公司与华为技术有限公司在华为松山湖园区签署深化合作协议。双方将聚焦数智技术与体外诊断产业深度融合,围绕智慧化实验室、集团全球一朵云、智能制造平台建设及鸿蒙IVD设备联合创新等领域展开深度协作,推动医学…

2026/7/10 8:58:38 阅读更多 →
基于AI Agent与MCP协议的渗透测试辅助工具VulnClaw实战指南

基于AI Agent与MCP协议的渗透测试辅助工具VulnClaw实战指南

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 1. VulnClaw 是什么?它能解决什么实际问题? 如果你正在学习或从事网络安全、渗透测试,或者对 AI A…

2026/7/10 8:56:38 阅读更多 →
STM32F429ZI与CMT-8540S-SMT嵌入式音频开发实战

STM32F429ZI与CMT-8540S-SMT嵌入式音频开发实战

1. 为什么选择STM32F429ZI与CMT-8540S-SMT组合 在嵌入式音频开发领域,硬件选型往往决定了项目的上限。STM32F429ZI这颗基于ARM Cortex-M4内核的微控制器,内置了2个专用音频PLL和全双工IS接口,时钟精度可达0.5%。这意味着它能够直接输出符合IS…

2026/7/10 8:52:36 阅读更多 →

日新闻

STM32与LTC1864高精度ADC的SPI通信实现

STM32与LTC1864高精度ADC的SPI通信实现

1. 项目背景与核心需求在工业控制和嵌入式系统开发中,模拟信号与数字系统的无缝集成一直是工程师面临的关键挑战。LTC1864作为一款16位高精度ADC转换器,配合STM32F101ZG这类主流微控制器,能够构建高性能的模拟信号采集系统。这种组合特别适合…

2026/7/10 0:03:07 阅读更多 →
猫抓插件:浏览器资源嗅探与视频下载的终极解决方案

猫抓插件:浏览器资源嗅探与视频下载的终极解决方案

猫抓插件:浏览器资源嗅探与视频下载的终极解决方案 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 还在为网页视频无法下载而烦恼吗&am…

2026/7/10 0:05:09 阅读更多 →
直流有刷电机驱动方案:TC78H653FTG与MKV46F256VLH16应用

直流有刷电机驱动方案:TC78H653FTG与MKV46F256VLH16应用

1. 直流有刷电机驱动方案概述在工业自动化和消费电子领域,直流有刷电机因其结构简单、控制方便、成本低廉等优势,仍然是许多应用场景的首选驱动方案。TC78H653FTG作为东芝推出的新一代H桥驱动器,与MKV46F256VLH16微控制器配合使用&#xff0c…

2026/7/10 0:05:09 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/8 16:14:06 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/9 13:46:46 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/9 21:41:05 阅读更多 →

月新闻