转载地址:https://testerhome.com/topics/3461
今年年初的时候,公司让写个做自动化测试的工具,真头疼!我都没做过这,心里怕怕的,但交待我来做,我又不能不接,罢了,做!
因为没做过,我只学过些java,都毕业三四年了,哪记得那多,想着用python做,听说python容易上手,找了本python做GUI的书,全英文的,看了一遍,云里雾里的,没概念。思考再三,还是用java做,毕竟还有点基础不是,找了好几本用java做GUI的书,最后还是选中--《Java开发利器:Eclipse SWT/Jface核心应用》,这本书比较详细,靠谱。
这个工具点坐标就可以了吗?NO,要点控件,此前已经自学过uiautomator,也写过许多shell做自动化测试的脚本(Shell+sendevent),所以我考虑将uiautomator与shell结合起来做,写出来的测试脚本是一个个的shell脚本,用java做电脑端编写自动化测试脚本的工具。点击控件,我所想到的实现方法有两种:
通过uiautomator,通过传递参数到uiautomator脚本,将一些通用的方法,写出来,供shell来调用,比如我们可以在eclipse中,写一个ClickByText方法,然后在shell中调用,uiautomator runtest FileName.jar -c PackageName.ClassName -e text Phone,来点击text属性为Phone的控件。
public UiObject objByText(String text) throws UiObjectNotFoundException{
UiObject obj = new UiObject(new UiSelector().textMatches(text));
return obj;
}
通过uiautomator dump生成xml文件,通过shell分析这个xml档,方法可见:[https://testerhome.com/topics/2806]
所以,写出来的测试脚本,是shell脚本,我写了一个Template.sh,这里面包含所有的通用操作,比如Click,ClickByText,PinchIn等等,其他的测试用例,都去调用这里面的方法。当然,不仅仅包含这些按键的方法,还包含测试设备状态的一些方法,比如抓取某一进程memory(使用procrank命令)使用的大小保存到一xls表格中,等
可以点击控件,但是不能在本工具查看控件,控件查看需要通过uiautomatorviewer这个工具,被同仁反鐀,不方便,虽然自我感觉还行啊!我在eclipse中用uiautomator写测试用例的时候,也是要看uiautomatorviewer的控件啊,习惯了,所以不觉得有什么问题。没有用过的同仁就觉得,呀,你为什么不能把uiautomatorviewer上面显示的控件信息,显示到你的工具上去呢,那样多好。
对比uiautomator,我这还有一优点呢,选中一行,单击debug即可单步调试,而在eclipse中用uiautomator写测试用例时,则需要编译,push,最后才可执行
因为测试用例都是Shell脚本,所以可以在后台跑,但是不能进sleep模式,进sleep模式,shell会被挂起,直到唤醒后继续run
后来,我在testerhome看到了 @cpfeng0124的帖子[https://testerhome.com/topics/2632] ,这与我的想法刚好相反,我想在我的工具上加入uiautomatorviewer显示控件的信息,而这个贴子则是在uiautomatorviewer的基础上,加入了各种操作。但我没有找到uiautomatorviewer的源码,在群里一位叫文武不辉的同学的帮助下,找到了uiautomatorviewer的源码,然后我又基于uiautomatorviewer的源码,做了一新工具:
在开发过程中,就一同事用,各种bug,被她各种吐槽,各种不爽,唉,不过还好,虽然做的慢,但还是做出来了。
开始我默认是点击instance为1的控件,后台在开会时,同事问我,是否可以自动抓到第几个控件,比如在上图中,我们看到当前选中的是第三个text属性为Phone的控件,工具就会在选择Attribution operation > Click > text之后,自动点击text属性为Phone的第三个控件,并刷新点击操作后的屏幕与控件信息到工具上来,我在uiautomatorviewer的源码uiautomatorviewer.java中加入了一列,用来显示text,resource-id及content-desc是第几个,这里是判断text属性是第几个控件的代码,
if (((AttributePair) element).key.equals("text")) {
List<BasicTreeNode> totalTreeNode = mModel.getmNodelist();
for (int i=0; i<totalTreeNode.size(); i++) {
BasicTreeNode selectedNode = mModel.getSelectedNode();
if (selectedNode.equals(totalTreeNode.get(i))) {
//查找时,如果找到了当前选中的控件,则停止查找
break;
} else {
Object [] selectedElement = totalTreeNode.get(i).getAttributesArray();
for (int j=0; j<selectedElement.length; j++) {
if (((AttributePair) selectedElement[j]).key.equals("text")) {
//如果某一控件的text属性与当前选中的控件的text属性相同,则instance变量+1
if (((AttributePair) selectedElement[j]).value.equals(((AttributePair) element).value)) {
instance++;
}
}
}
}
}
return String.valueOf(instance);
}
KillUiautomator()
{
uiautomatorPID=`busybox ps|busybox grep uiautomator|busybox grep -v grep|busybox awk '{print $1}'`
if test ! "$uiautomatorPID" == ""
then
kill -9 $uiautomatorPID
fi
}
#这里调用的其实是uiautomator 中的UiDevice.getInstance().dumpWindowHierarchy(fileName);方法
uiautomator runtest /data/local/tmp/CommonAction.jar -c com.fih.liguo.GetAttributionXML&
busybox usleep 2000000
KillUiautomator
首先,得感谢,让你最先痛苦的人,是公司的上司吧,如果不是他,我也不打算做这工具,其他公司另一部门有一自动化工具,这个就不细说了。然后要感谢TesterHome让我从不同的大牛的帖子中学到了许多知识与想法,感谢我那一直吐槽我的同事,催我改进工具啊!
这个工具,还可以继续优化,编辑区域可以优化,做成shell脚本代码高亮,伸缩显示等效果,可以将ddms的部分功能移植过来,等等
在学习uiautomator2.0,同时想学一下espresso,以及html+css+javascript,用来做漂亮点的自动化测试报告。