AppCrawler简介
AppCrawler是一个国产的Android UI自动化测试工具(也可以测IOS),有较为详细的说明文档和社区支持,且目前仍然在更新。支持默认遍历测试和配置遍历测试。
AppCrawler环境搭建及运行
需要的工具:Appium, Android SDK, java, appcrawler.jar
默认运行:
命令行进入appcrawler.jar所在文件夹,
输入java –jar appcrawler.jar –a osc.apk
带配置文件:
输入java –jar appcrawler.jar –c conf/test.yml –a osc.apk
也可以在配置文件中指定测试apk,appium,超时时间,断言,需要访问的包等:
输入java –jar appcrawler.jar –c conf/test.yml -p android
或java –jar appcrawler.jar –c conf/test.yml -p ios
AppCrawler原码分析
使用Scala编程语言(类似java,运行在JVM上)
AppCrawler.scala是程序入口,负责:
1. 解析命令行中的命令(代码直接写在里面了,感觉如果分一个类出来会更清晰)
2. 解析配置文件(还是直接写在类里面,代码很多)
3. 设定测试app和设定appium的端口
4. 解析文件路径(如配置文件和app的路径),发现可以支持“http”, “ftp”, “https”, “file”,即可以测试非本地app
2. 解析配置文件(还是直接写在类里面,代码很多)
3. 设定测试app和设定appium的端口
4. 解析文件路径(如配置文件和app的路径),发现可以支持“http”, “ftp”, “https”, “file”,即可以测试非本地app
AppiumClient.scala负责与appium交互:
1. 监听appium进程的信息(执行成功,执行失败,停止等),从appium获得包名和activity
2. 通过xpath找到组件,对重名的id只使用第一个。每隔5秒找一次,找10次后如果还找不到,则放弃
3. 对组件的操作(如:滑动,点击,长按等)进行定义,动作是随机取的(类似monkey,方法名也叫monkey),位置信息用的是通过xpath找到的x,y坐标
4. 对每次操作之后的界面截屏(如果界面改变的话)
5. 获取页面结构(最多3次)解析xpath的时候拿到一个节点树,对树中所有节点遍历,具体实现在TreeNode.scala和Tree(应该是某库函数)
1. 监听appium进程的信息(执行成功,执行失败,停止等),从appium获得包名和activity
2. 通过xpath找到组件,对重名的id只使用第一个。每隔5秒找一次,找10次后如果还找不到,则放弃
3. 对组件的操作(如:滑动,点击,长按等)进行定义,动作是随机取的(类似monkey,方法名也叫monkey),位置信息用的是通过xpath找到的x,y坐标
4. 对每次操作之后的界面截屏(如果界面改变的话)
5. 获取页面结构(最多3次)解析xpath的时候拿到一个节点树,对树中所有节点遍历,具体实现在TreeNode.scala和Tree(应该是某库函数)
控件点击:一次还是多次?
1. “定义url是遍历的关键. 这是一门艺术”——注释原文
2. URIElement.scala类负责组件的uri定义(如:xueqiu/xxxActivity )
3. 根据注释:
uri用来代表唯一的控件, 每个特定的命名控件只被点击一次. 所以这个element的构造决定了控件是否可被点击多次
比如某个输入框被命名为url=xueqiu id=input, 那么就只能被点击一次
如果url修改为url=xueqiu/xxxActivity id=input 就可以被点击多次
1. “定义url是遍历的关键. 这是一门艺术”——注释原文
2. URIElement.scala类负责组件的uri定义(如:xueqiu/xxxActivity )
3. 根据注释:
uri用来代表唯一的控件, 每个特定的命名控件只被点击一次. 所以这个element的构造决定了控件是否可被点击多次
比如某个输入框被命名为url=xueqiu id=input, 那么就只能被点击一次
如果url修改为url=xueqiu/xxxActivity id=input 就可以被点击多次
URIElementStore.scala负责记录控件是否被点击
1. 使用枚举类型, Clicked表示已遍历,Skiped = Value表示跳过
2. 使用elementStore(Map类型)存储被点击的组件列表。联系URIElement.scala,如果组件url=xueqiu,key只有1个,所以只能点一次。如果组件url=xueqiu/xxxActivity,由于可能是不同Activity中的,所以可以点击多次
1. 使用枚举类型, Clicked表示已遍历,Skiped = Value表示跳过
2. 使用elementStore(Map类型)存储被点击的组件列表。联系URIElement.scala,如果组件url=xueqiu,key只有1个,所以只能点一次。如果组件url=xueqiu/xxxActivity,由于可能是不同Activity中的,所以可以点击多次
测试OSChina
工具问题分析
1. 测试速度可能比较慢,会对重复的界面进行点击
2. 对比三次测试,一方面是在相似的组件中可能漏掉比较重要的组件,另一方面是为了追求测试覆盖,重复点击了相似的界面组件。两者不能很好地平衡
3. 配置文件有一定的局限性,有时不能很好地表达测试者的意图
4. 不能自动输入文本信息
2. 对比三次测试,一方面是在相似的组件中可能漏掉比较重要的组件,另一方面是为了追求测试覆盖,重复点击了相似的界面组件。两者不能很好地平衡
3. 配置文件有一定的局限性,有时不能很好地表达测试者的意图
4. 不能自动输入文本信息
写在最后
AppCrawler最新的版本2.1.1即将推出,将要实现的新功能:
自动化测试web
自动化测试app游戏
自动化测试web
自动化测试app游戏
访问https://github.com/seveniruby/AppCrawler获得详细信息