乐趣区

关于软件测试:利器-AppCrawler-自动遍历测试工具实践一

本文为霍格沃兹测试学院学院学员课程学习笔记,零碎学习交换文末加群。AppCrawler 是由霍格沃兹测试学院校长思寒开源的一个我的项目, 通过名字咱们大略也能猜出个方向,Crawler 是爬虫的意思,App 的爬虫,遍历 App:官网 GitHub 上对这款工具的解释是:一个基于主动遍历的 App 爬虫工具。反对 Android 和 iOS,反对真机和模拟器。最大的特点是灵活性,可通过配置来设定遍历的规定。这里顺便提一下的是谷歌也公布了一款主动遍历的工具,名字简直一样,叫做 App  Crawler (差了一个空格),设计的思维也统一,然而这款工具目前还在开发欠缺中,思寒大佬的工具比谷歌的早了两年工夫,厉害啊!Google App Crawler 链接:https://developer.android.com… 上面来看看 AppCrawler 的作用和价值。需要背景
‘ fill=’%23FFFFFF’%3E%3Crect x=’249′ y=’126′ width=’1’ height=’1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)
互联网的业务需要背景:业务变更疾速业务线泛滥业务流程简单依赖第三方接口较多测试工作常见问题:UI 自动化只能笼罩外围业务逻辑,新性能来不及上自动化产品业务测试量较大,新版公布后,老性能来不及全面回归,容易漏测工夫长,强度大的工作后,人容易产生困乏,对数字的位数,文字的显示等错误信息的敏感度降落产品的界面深度很深,且蕴含大量的展现信息性能专项测试回归难度大:内存透露、健壮性测试、弱网等测试太多这个时候咱们须要一种伎俩,能够达到两方面的目标:Code less: UI 自动化用例保护老本降到最低 Automate:  尽可能的自动化笼罩回归业务而主动遍历就能够满足咱们对上述的业务的需要;接着再来看咱们对主动遍历测试的一些需要,既然要用主动遍历,那么具体要等到什么样的成果?工具抉择

2.1 遍历工具需要主动遍历的需要:可控:能够定义遍历的门路,指定须要测试的业务,保障外围业务的笼罩优先级可定制:可实现主动输出、主动滑动等根底行为后果剖析:点击前后的截图比照后果的数据建模 2.2 工具比照 2.2.1 Monkey 首先来看业界用的较早也是常常听过的一款工具—— Monkey 参考链接:Monkey 官网链接:https://developer.android.com… Monkey Script:https://github.com/gb112211/A… 这是 Android 官网提供的一个工具,在 Android 的官网咱们能够看到对这款工具的解释如下:

没错,谷歌本来设计这款工具是为了对 App 进行压力测试的,而并不是主动遍历测试,留神的是这里的压力测试并不是咱们平时意义上的对服务端的压力,而是对 App 前端的压力。上面是思寒对 App 压力测试的起因解释:谷歌晚期在设计 Android 的时候,Android 须要响应滑动、输出、音量、电话等事件,晚期 activity 设计不欠缺的时候,谷歌心愿测试 activity 的性能,把所有的数据批量化的输入给 activity,看 activity 一秒钟能够解决多少数据。所以晚期 Monkey 是用来做 Android 的一个压力测试的工具。因为 Monkey 在测试过程中的“随机”性,凑巧能够被用来做主动遍历测试,然而 monkey 的毛病行业很显著,就是不满足咱们的两个主动遍历需要:可控性和可定制。毛病:不反对业务行为定制,无奈灵便的管制,常常会点到内部的 App 无奈回归原测试 App;或者点击到登记和退出,造成无奈持续前面的测试;因而 monkey 在通过调研理解后没有成为咱们做主动遍历测试的首选。2.2.2 MaximMaxim 也是一款主动遍历工具,由咱们国内的一名叫做 zhangzhao 的工程师开发,官网给出的定义是:An efficient Android Monkey Tester, available for emulators and real devices 基于遍历规定的高性能 Android Monkey,实用于真机 / 模拟器的 APP UI 压力测试。官网 GitHub 地址:https://github.com/zhangzhao4… 咱们来看看这款工具的优缺点:长处:基于 Monkey 二次开发,也用了一些 AppCrawler 的设计思路,领有定制化性能;因为底层基于了 Monkey,所以运行速度还是比拟快的;毛病:因为是基于 Monkey,所以不具备跨平台性,只能测试 Android,不能测试 iOS,Web 等;这款工具没有开源,然而能够间接应用,在 GitHub 上下载后依据官网阐明操作即可,这里不做重点阐明。重点来看一下工具的特点和选择性:- 配置文件,官网给出了配置文件的示例,以 json 格局进行编写:

接触过 AppCrawler 后会发现写法十分类似,只不过 AppCrawler 是以 YAML 文件进行书写。抉择:这也是一款很优良的工具,可在肯定水平上进行定制,如果只测试 Android 零碎的话,能够思考选用 Maxim 做主动遍历,速度绝对较快;如果想要跨平台或者对开源工具进行二次开发,那就要 AppCrawler 退场了。2.2.3 AppCrawler 再来看明天的配角 AppCrawler,看看它为何满足咱们的测试需要,它的优缺点有在哪里。先来看它与其余框架的关系构造 与其余框架的关系 

长处:跨平台性:AppCrawler 是基于 Appium 开发的,所以反对 Android 和 iOS。可控性:对测试的页面,控件类型的抉择,测试的深度等都可自在管制;可定制:可自定义操作,如输出,滑动等;毛病:运行速度较慢:AppCrawler 是基于 Appium 开发具备了跨平台的长处,然而也因为这层封装造成了运行速度绝对较慢;应用门槛高:正因为应用灵活性的问题,也造成了应用门槛的进步,次要基于 YAML 文件中应用 Appium 的相干技术常识进行配置,这就对使用者有了肯定的技术要求;装置和启动
‘ fill=’%23FFFFFF’%3E%3Crect x=’249′ y=’126′ width=’1’ height=’1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)
3.1 下载因为较大,官网也给出了打包后的百度网盘下载地址 最新版本下载地址: https://pan.baidu.com/s/1dE0JDCH 这里以目前最新的 2.4.0 为例 

如何本人编译打包:1)从 GitHub 上 Clone 源码,以后开源的最新 2.4.0 版本对应的分支是 2.3.1 AppCrawler 官网 GitHub 地址:https://github.com/seveniruby…

2)切换到分支:git checkout 2.3.1 3)执行 mvn clean compile 4)应用 maven 构建:执行 mvn assembly:single 命令进行编译即可装置:AppCrawler 自身是个 jar 包,不须要装置,须要装置的是运行时所依赖的环境:Java 版本:Java8、Java10 (未测试过,作者说反对)Appium:Appium 1.8 以上 因为 AppCrawler 是基于 Appium 开发的,所以 Appium 的环境是必不可少的 Appium 的装置形式可参考另外一篇博客:  Windows (Win10)、Mac 下装置 Appium;查看帮忙文档:间接应用命令 java -jar appcrawler-2.4.0-jar-with-dependencies.jar,能够看到如下帮忙文档信息 相干参数含意和局部注解如下:$ java -jar appcrawler-2.4.0-jar-with-dependencies.jar—————-AppCrawler 2.4.0 [霍格沃兹测试开发学社特地纪念版]Appium 1.8.1 Java8 testedapp 爬虫, 用于主动遍历测试. 反对 Android 和 iOS, 反对真机和模拟器我的项目地址: https://github.com/seveniruby/AppCrawler——————————–Usage: appcrawler [options] -a, –app <value> Android 或者 iOS 的文件地址, 能够是网络地址, 赋值给 appium 的 app 选项 #装置 App,理论中应用较少 -e, –encoding <value> set encoding, such as UTF-8 GBK #在 Windows 下可能会产生乱码,对其编码格局进行设置 -c, –conf <value> 配置文件地址 #简单且重要,是 AppCrawler 定制的外围 -p, –platform <value> 平台类型 android 或者 ios, 默认会依据 app 后缀名主动判断 -t, –maxTime <value> 最大运行工夫. 单位为秒. 超过此值会退出. 默认最长运行 3 个小时 -u, –appium <value> appium 的 url 地址 #运行依赖于 appium,不加此参数就应用默认的 appium 地址端口 -o, –output <value> 遍历后果的保留目录. 外面会寄存遍历生成的截图, 思维导图和日志 –capability k1=v1,k2=v2… # 和 appium 的 capability 设置统一 appium capability 选项, 这个参数会笼罩 - c 指定的配置模板参数, 用于在模板配置之上的参数微调 -r, –report <value> 输入 html 和 xml 报告 –template <value> 输入代码模板 –master <value> master 的 diff.yml 文件地址 –candidate <value> candidate 环境的 diff.yml 文件 –diff 执行 diff 比照 -vv, –verbose 是否展现更多 debug 信息 –demo 生成 demo 配置文件学习应用办法 –help 示例 appcrawler -a xueqiu.apkappcrawler -a xueqiu.apk –capability noReset=trueappcrawler -c conf/xueqiu.json -p android -o result/appcrawler -c xueqiu.json –capability udid=[你的 udid] -a Snowball.appappcrawler -c xueqiu.json -a Snowball.app -u 4730appcrawler -c xueqiu.json -a Snowball.app -u http://127.0.0.1:4730/wd/hub# 生成 demo 例子 appcrawler –demo# 启动曾经装置过的 appappcrawler –capability “appPackage=com.xueqiu.android,appActivity=.view.WelcomeActivityAlias”# 从曾经完结的后果中从新生成报告 appcrawler –report result/# 新老版本比照 appcrawler –candidate result/ –master pre/ –report ./ 这里顺便说一下的是以后版本的 diff 性能还不欠缺,也绝对较简单,目前先不做深入研究 Quick Start:1)启动 appium $ appium[Appium] Welcome to Appium v1.14.1[Appium] Appium REST http interface listener started on 0.0.0.0:47232)启动模拟器或真机,保障 adb devices 可有找到你的设施 $ adb devicesList of devices attachedFKFBB19120151100 device3)依据参考文档中的命令, 启动遍历一个曾经装置过的 App (以示例中的雪球 App 为例): java -jar appcrawler-2.4.0-jar-with-dependencies.jar –capability “appPackage=com.xueqiu.android,appActivity=.view.WelcomeActivityAlias” 这个命令执行后会以默认的形式去执行用例, 而后遍历遍历准则:它的遍历准则是,找页面的里档次最深的元素,也就是处于核心地位元素会被优先遍历局部遍历成果展现:

测试后果如果没有应用 -o 参数指定 log 输入的门路,AppCrawler 就会在当前目录下生成以工夫为命名的文件夹,外面保留了所有的数据,文件、截图、log $ ls20191129154742appcrawler-2.4.0-jar-with-dependencies.jar 关上文件夹会发现如下,每一步都会进行截图 (这也是速度变慢的起因之一吧) 以及对于的 dom 文件,这里会看到有几个 steps 文件,这个只是随便点了某个操作来告知用户正在操作,真正的执行步骤是从这之后开始。
‘ fill=’%23FFFFFF’%3E%3Crect x=’249′ y=’126′ width=’1’ height=’1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)
测试报告在测试 log 中有一个 index.html 文件,关上它会看到方才运行的测试报告,AppCrawler 会把每一次点击当做一个测试用例,没一个页面当做是一个测试套件;将界面和界面内的控件点击模仿成了测试套件和测试用例的关系;

胜利的用 Succeed 示意,Canceled 是遍历的时候发现有这个可点击的控件,然而最初却没遍历到的控件。

报告中也能够查看对应页面操作事件的截图 
‘ fill=’%23FFFFFF’%3E%3Crect x=’249′ y=’126′ width=’1’ height=’1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)
测试 log 在生成的文件夹中有 appcrawler.log,外面记录了具体的执行步骤的 log 信息(加上 -vv 参数运行的话会失去更多更多的 log 信息) 

 截取局部 log 展现如下:2019-11-29 15:48:10 INFO [Crawler.996.doElementAction] current element = MainActivity.tag=ImageView.depth=242019-11-29 15:48:10 INFO [Crawler.997.doElementAction] current index = 22019-11-29 15:48:10 INFO [Crawler.998.doElementAction] current action = click2019-11-29 15:48:10 INFO [Crawler.999.doElementAction] current xpath = //[@resource-id=”com.xueqiu.android:id/decor_content_parent”]//[@resource-id=”android:id/content”]//[@resource-id=”com.xueqiu.android:id/mainContent”]//[@resource-id=”com.xueqiu.android:id/main_content”]//[@resource-id=”com.xueqiu.android:id/pager”]//[@resource-id=”com.xueqiu.android:id/layout_refresh”]//[@resource-id=”com.xueqiu.android:id/list”]//[@resource-id=”com.xueqiu.android:id/today_topic_container”]//[@resource-id=”com.xueqiu.android:id/time_line_topic_item_case2″]//[@resource-id=”com.xueqiu.android:id/today_topic_container”]//[@resource-id=”com.xueqiu.android:id/time_line_topic_footer”]//[@resource-id=”com.xueqiu.android:id/feedback”]2019-11-29 15:48:10 INFO [Crawler.1000.doElementAction] current url = MainActivity2019-11-29 15:48:10 INFO [Crawler.1001.doElementAction] current tag path =hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.view.ViewGroup/androidx.viewpager.widget.ViewPager/android.widget.RelativeLayout/android.view.ViewGroup/androidx.recyclerview.widget.RecyclerView/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.RelativeLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.FrameLayout/android.widget.ImageView2019-11-29 15:48:10 INFO [Crawler.1002.doElementAction] current file name = MainActivity.tag=ImageView.depth=242019-11-29 15:48:10 INFO [Crawler.1071.doElementAction] need input click2019-11-29 15:48:10 INFO [AppiumClient.53.findElementByURI] find by uri element= MainActivity.tag=ImageView.depth=242019-11-29 15:48:10 INFO [AppiumClient.245.findElementsByURI] findElementByAndroidUIAutomator new UiSelector().className(“android.widget.ImageView”)2019-11-29 15:48:10 INFO [AppiumClient.60.findElementByURI] find by xpath success2019-11-29 15:48:10 INFO [Crawler.1080.doElementAction] mark 20191129154742/1_Steps.tag=.name=NOT_FOUND.clicked.png to 20191129154742/2_MainActivity.tag=ImageView.depth=24.click.png2019-11-29 15:48:10 INFO [AppiumClient.141.mark] read from 20191129154742/1_Steps.tag=.name=NOT_FOUND.clicked.png2019-11-29 15:48:11 INFO [AppiumClient.154.mark] write png 20191129154742/1_Steps.tag=.name=NOT_FOUND.clicked.png2019-11-29 15:48:11 INFO [AppiumClient.161.mark] ImageIO.write newImageName 20191129154742/2_MainActivity.tag=ImageView.depth=24.click.png2019-11-29 15:48:11 INFO [Crawler.1095.$anonfun$doElementAction$5] click elementindex 等于几就示意第几次事件,action 示意以后的操作,xpath 就示意以后操作的元素的 xpath 表达式。补充阐明
‘ fill=’%23FFFFFF’%3E%3Crect x=’249′ y=’126′ width=’1’ height=’1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)
总说 AppCrawler 慢,其余工具绝对较快,起因为何,先来看他们的架构组成 – appcrawler- appium、atx- appium on Uiautomator2 server、atx on Uiautomator2、maxim、adb shell uiautomator、改良版本 Uiautomator2 server- Uiautomator2- AccessibilityService 底层有个叫 AccessibleServices 货色,它能够获取 Android 所有界面的控件,uiautomator 获取元素进行操作的时候就是靠 AccessibleServices 去获取控件,而后去触发肯定的行为,uiautomator 就是将其进行了包装;基于 uiautomator,Appium 开发了一个 uiautomator server,ATX 开发了一个 uiautomator2,maxim 就处于这一层。Appium 走的是 HTTP 协定,ATX 走的是 JSON-RPC 协定,AppCrawler 处于最上层 所以 AppCrawler 因为多了两层封装,再加上运行过程中退出了截图(能够在配置中勾销,然而勾销后不利于后果的查看),运行起来天然就慢了。改良冀望:前期冀望 AppCrawler 团队能够将其依据需要指定底层操作,绕过很多不必要的流程来减少效率,这样性能十分欠缺的同时也能保障效率到这里只是实现了 AppCrawler 的一个根本意识,既然提到了它的定制化的特点,就须要通过配置文件来实现了,下一篇将进行具体的介绍。

退出移动版