打造一款快速高效且高度可复用的ios自动化测试工具
无需插桩!
高效率,每秒4-5个action!
轻量极简!
先致敬两个开源工具;
swiftmonkey
https://github.com/zalando/SwiftMonkey
因其直接使用了 苹果的私有api 如XCEventGenerator.tapAtTouchLocations 故执行速度极快。同时也用类似android monkey的事件生成机制,自身源源不断的产生如 tap,swipe,pinchIn等事件使其对被测app产生了极大的压力
缺点:需要插桩
XCTestWD
https://github.com/macacajs/XCTestWD
类似facebook wda的方式,在xcode中执行xcuitest时启动一个监听server,可通过外部发送命令来创建待测app对应session并启动app,同时也实现了dump tree 和依据xpath,id等来定位某个控件并操作这些控件
Fastmonkey
(https://github.com/zhangzhao4444/Fastmonkey)
结合两者优点并改造两者,在XCTestWD基础上实现一个server路由,外部命令时可引导启动app 并执行monkey
app插桩增加小手的反馈,可以更直观的看到其点击效率! (可选,实际不插也可monkey)
测试时会保存截图,及appcrash log(此处植入广告!)
1.monkey执行过程中跳出app,如何跳回继续跑monkey
增加一个定时执行的action,检测当前app,如果不是待测则重新launcher(其时更好的应该时reactive,但并没有找到类似api)
public func addXCTestCheckCurrentApp(interval:Int, appname:String, application:XCUIApplication) {
addAction(interval:interval){ [weak self] in
let current = XCTestWDFindElementUtils.getAppName(underElement: root!)
let isRunning = application.running
if current == appname && isRunning {
for i in 0 ..< application.alerts.count {
let alert = application.alerts.element(boundBy: i)
...
}
}else{
application.launch()
self!.sleep(5)2.登陆等业务流程如何解决
同样增加一个定时的action,检测当某个关键点出现时,往事件队列中插入一个业务事件
public func addXCTestAppLogin(interval:Int, application:XCUIApplication) {
addAction(interval:interval){ [weak self] in
if root != nil{
let usage = "xpath"
let tag = "//XCUIElementTypeOther[@name='登录']/XCUIElementTypeTextField"
let element = try? XCTestWDFindElementUtils.filterElement(usingText: usage, withvalue: tag, underElement: root!)
...
if element != nil {
self?.addXCTestLoginAction(application: application)
}
public func addXCTestLoginAction(application:XCUIApplication) {
addAction(){ [weak self] in
if root == nil{
return
}
let usage = "xpath"
let username = "//XCUIElementTypeOther[@name='登录']/XCUIElementTypeTextField"
let passwd = "//XCUIElementTypeOther[@name='登录']/XCUIElementTypeSecureTextField"
let button = "//XCUIElementTypeOther[@name='登录']//XCUIElementTypeStaticText[@name='登录']"
var element = try? XCTestWDFindElementUtils.filterElement(usingText: usage, withvalue: username, underElement: root!)
if let element = element {
let value = "abc"
...
let semaphore = DispatchSemaphore(value: 0)
let numberOfTaps = 1
self!.sharedXCEventGenerator.tapAtTouchLocations(locations, numberOfTaps: UInt(numberOfTaps), orientation: orientationValue) {
semaphore.signal()
}
semaphore.wait()实现基于控件的monkey
crash收集上报
性能数据

原文来自: TesterHome
声明:所有来源为“聚合数据”的内容信息,未经本网许可,不得转载!如对内容有异议或投诉,请与我们联系。邮箱:marketing@think-land.com
通过身份证号+姓名+人脸照片的一致性比对,系统与公安库中的身份证登记照比对,判断是否为同一人,核验用户信息真实性。
根据查询的IPv6地址,查询该IPv6所属的区域,城市级查询。
2026美加墨世界杯小组赛、1/16决赛、1/8决赛、1/4决赛、半决赛、季军赛、决赛赛程及积分榜
提供多种拟人音色,支持多语言及方言,并可在同一音色下输出多语言内容。系统可自适应语气,流畅处理复杂文本。
Nano Banana(gemini-2.5-flash-image 和 gemini-3-pro-image-preview图像模型)是图像生成与编辑的最佳选择,可集成 Nano Banana API,实现高速预览。