来源和原理,如这个帖子 http://testerhome.com/topics/1050(默默的说一句这段代码不是我写的,也是以前一个前辈给我的)
本来有许多细节诸如 ui 还有一些 bug 需要调整的,但是最近要开始疯忙了,再加上越来越觉得自己基础不扎实,想把这一块赶紧弄完放一下,去深入学下 Android 测试本身的东西。
工具的原理:
1 在手机端调用 robotium 框架获取当前界面的所有 View,存入本地 xml 文件
2 PC 运行界面程序,用 adb 拉取 xml 文件并分析,然后界面展示出来
缺陷: (未来可能的解决方法)
1 界面各种细节需要调整 (重构界面)
2 获取的界面信息实际是一个 list,很不利于查找 (获取成 tree,同时展示成 tree)
3 只展示了截图,当点击具体一个 view 时,没有在截图上标明 (选择一个特定的 view 时,在截图上绘图)
4 需要导入 Robotium 包,操作略麻烦 (直接对 Instrumentation 封装)
5 界面程序是 python 写的,但是环境问题一直没有打包 exe 成功
优点:
1 不需要 root 啊!!!
2 开发如果使用的自定义的组件,可以显示出组件名(在 uiautomatorviewer 里边只会显示基类的类名,hierarchyviewer 未尝试)
3 几乎 100% 可以识别出 id
4 支持将界面信息存储在 PC 本地,并且离线直接读取本地文件
5 手机端提供三个调用入口,方便实现通过脚本自动获取所有所需界面的信息
使用方法:
1 新建一个 Android 测试工程,填好各项配置
2 导入 robotium 框架和 getinfo.jar
robotium 地址:http://www.robotium.cn/download
getInfo.jar 地址:http://pan.baidu.com/s/1ANfL8
请保证该处打钩:
3 getInfo.jar 提供三个方法,在测试脚本中使用其中一个
GetCurrentInfo gci = new GetCurrentInfo(solo);
//每隔5s获取一次界面元素
gci.loopGetInfo();
//每隔time毫秒获取一次界面元素
gci.loopGetInfo(int time);
//获取一次界面元素(loop暂时无用,可以随便赋值)
gci.getCurrentInfo(boolean loop);
以 gci.loopGetInfo();为例:建立一个普通的测试任务,新建一个测试方法:
public class GetInfoTest extends ActivityInstrumentationTestCase2 {
private static final String LAUNCHER_ACTIVITY_FULL_CLASSNAME = "yourTestAppPackageName";
private Solo solo;
public GetInfoTest() throws ClassNotFoundException {
super(Class.forName(LAUNCHER_ACTIVITY_FULL_CLASSNAME));
}
protected void setUp() throws Exception {
solo = new Solo(getInstrumentation(), getActivity());
}
public void tearDown() throws Exception {...}
public void testGetInfo() {
GetCurrentInfo gci = new GetCurrentInfo(solo);
gci.loopGetInfo();
}
}
4 执行该方法,因为 loopGetInfo() 中使用了 while(true) 循环,所有不手动中止测试,会一直运行(最简便的是直接退出被测应用)
你需要做的是,在每个你需要的界面停留至少 5s
5 运行 PC 端程序 getinfoviewer.py
运行之前需要安装环境(哪位同学能帮忙生成下 exe,就不需要这些环境了……):
Python2.7 下载地址:https://www.python.org/downloads/
PyQt4 下载地址:http://www.riverbankcomputing.co.uk/software/pyqt/download/
pyqt 选择对应 python 版本的安装包,如下:
还可以安装个 pyDev 的 eclipse 插件(非必须):
http://sourceforge.net/projects/pydev/files/ 可以百度如果安装和配置 PyDev 插件
解压http://pan.baidu.com/s/15xzZKgetinfoviewer.py,点击开始,执行
需要保证 adb devices 返回只有一个设备,按 ‘检测’ 按钮可以检测设备情况
按理论,步骤 4 和 5 无先后
额……因为调试用的是盒子,所以截图显示不全,如果是手机,是可以显示完全的
6 如何载入本地的信息
ps:如果在测试脚本中使用 gci.getCurrentInfo(boolean loop),并增加脚本,每次新的测试包都可以跑一遍,然后使用文本比对工具查看是否有更改的 UI
这个工具,可能实际并不实用,但是已经基本实现当时所想,也因为这个想法,督促自己学了 Python 和 PyQt,相当于是一个练习之作吧。
半成品作品,等以后工作稳定下来并且闲一点,再更新吧。
有任何建议,bug,请告诉我
已更新 github,多谢关注!
~~(╯﹏╰) b 换了台电脑终于把 32 位的 exe 成功打出来了,已经更新到 github,如果没有 python 和 pyqt 环境也没关系~(≧▽≦)/~啦啦啦