基于 uiautomator 与 shell 的自动化测试工具

转载地址: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表格中,等
  

基于 uiautomator 与 shell 的自动化测试工具_第1张图片

  可以点击控件,但是不能在本工具查看控件,控件查看需要通过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信息?

  开始我默认是点击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);
                     }
在使用uiautomator dump过程中发现,有时会发生uiaumator进程死锁,导致我的测试脚本卡死,不再继续执行,这里我通过shell判断,如果2秒钟后,进程仍在,将它杀掉:
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,用来做漂亮点的自动化测试报告。

你可能感兴趣的:(Appium)