掌握聚合最新动态了解行业最新趋势
API接口,开发服务,免费咨询服务

实现无需插桩的 iOS monkey 自动化工具 fastmonkey

打造一款快速高效且高度可复用的ios自动化测试工具

优势

  1. 无需插桩!

  2. 高效率,每秒4-5个action!

  3. 轻量极简!


原理

先致敬两个开源工具;

  1. swiftmonkey
    https://github.com/zalando/SwiftMonkey
    因其直接使用了 苹果的私有api 如XCEventGenerator.tapAtTouchLocations 故执行速度极快。同时也用类似android monkey的事件生成机制,自身源源不断的产生如 tap,swipe,pinchIn等事件使其对被测app产生了极大的压力
    缺点:需要插桩

  2. XCTestWD 
    https://github.com/macacajs/XCTestWD
    类似facebook wda的方式,在xcode中执行xcuitest时启动一个监听server,可通过外部发送命令来创建待测app对应session并启动app,同时也实现了dump tree 和依据xpath,id等来定位某个控件并操作这些控件

  3. 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()

未来

  1. 实现基于控件的monkey

  2. crash收集上报

  3. 性能数据

原文来自: TesterHome

声明:所有来源为“聚合数据”的内容信息,未经本网许可,不得转载!如对内容有异议或投诉,请与我们联系。邮箱:marketing@think-land.com

  • 个人/企业涉诉查询

    通过企业关键词查询企业涉松详情,如裁判文书、开庭公告、执行公告、失信公告、案件流程等等。

    通过企业关键词查询企业涉松详情,如裁判文书、开庭公告、执行公告、失信公告、案件流程等等。

  • 账号黑产风险识别

    根据手机号来查询是否命中黑产风险

    根据手机号来查询是否命中黑产风险

  • IP反查域名

    IP反查域名是通过IP查询相关联的域名信息的功能,它提供IP地址历史上绑定过的域名信息。

    IP反查域名是通过IP查询相关联的域名信息的功能,它提供IP地址历史上绑定过的域名信息。

  • 人脸卫士

    结合权威身份认证的精准人脸风险查询服务,提升人脸应用及身份认证生态的安全性。人脸风险情报库,覆盖范围广、准确性高,数据权威可靠。

    结合权威身份认证的精准人脸风险查询服务,提升人脸应用及身份认证生态的安全性。人脸风险情报库,覆盖范围广、准确性高,数据权威可靠。

  • 全国城市空气质量

    全国城市和站点空气质量查询,污染物浓度及空气质量分指数、空气质量指数、首要污染物及空气质量级别、健康指引及建议采取的措施等。

    全国城市和站点空气质量查询,污染物浓度及空气质量分指数、空气质量指数、首要污染物及空气质量级别、健康指引及建议采取的措施等。

0512-88869195
数 据 驱 动 未 来
Data Drives The Future