[安卓自动化测试] 001.UIAutomator初探

时间:2023-03-09 05:42:39
[安卓自动化测试] 001.UIAutomator初探

*:first-child {
margin-top: 0 !important; }
body > *:last-child {
margin-bottom: 0 !important; }

a {
color: #4183C4;
text-decoration: none; }
a.absent {
color: #cc0000; }
a.anchor {
display: block;
padding-left: 30px;
margin-left: -30px;
cursor: pointer;
position: absolute;
top: 0;
left: 0;
bottom: 0; }

h1, h2, h3, h4, h5, h6 {
margin: 20px 0 10px;
padding: 0;
font-weight: bold;
-webkit-font-smoothing: antialiased;
cursor: text;
position: relative; }

h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor, h5:hover a.anchor, h6:hover a.anchor {
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA09pVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoMTMuMCAyMDEyMDMwNS5tLjQxNSAyMDEyLzAzLzA1OjIxOjAwOjAwKSAgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OUM2NjlDQjI4ODBGMTFFMTg1ODlEODNERDJBRjUwQTQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OUM2NjlDQjM4ODBGMTFFMTg1ODlEODNERDJBRjUwQTQiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo5QzY2OUNCMDg4MEYxMUUxODU4OUQ4M0REMkFGNTBBNCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo5QzY2OUNCMTg4MEYxMUUxODU4OUQ4M0REMkFGNTBBNCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PsQhXeAAAABfSURBVHjaYvz//z8DJYCRUgMYQAbAMBQIAvEqkBQWXI6sHqwHiwG70TTBxGaiWwjCTGgOUgJiF1J8wMRAIUA34B4Q76HUBelAfJYSA0CuMIEaRP8wGIkGMA54bgQIMACAmkXJi0hKJQAAAABJRU5ErkJggg==) no-repeat 10px center;
text-decoration: none; }

h1 tt, h1 code {
font-size: inherit; }

h2 tt, h2 code {
font-size: inherit; }

h3 tt, h3 code {
font-size: inherit; }

h4 tt, h4 code {
font-size: inherit; }

h5 tt, h5 code {
font-size: inherit; }

h6 tt, h6 code {
font-size: inherit; }

h1 {
font-size: 28px;
color: black; }

h2 {
font-size: 24px;
border-bottom: 1px solid #cccccc;
color:#00ccff;
margin: 25px auto 12px auto;
padding-bottom: 2px;
}

h3 {
font-size: 18px;
color:#993300;}

h4 {
font-size: 16px; }

h5 {
font-size: 14px; }

h6 {
color: #777777;
font-size: 14px; }

p, blockquote, ul, ol, dl, li, table, pre {
margin: 0 0; }

/*hr {
background: transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAECAYAAACtBE5DAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OENDRjNBN0E2NTZBMTFFMEI3QjRBODM4NzJDMjlGNDgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OENDRjNBN0I2NTZBMTFFMEI3QjRBODM4NzJDMjlGNDgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo4Q0NGM0E3ODY1NkExMUUwQjdCNEE4Mzg3MkMyOUY0OCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo4Q0NGM0E3OTY1NkExMUUwQjdCNEE4Mzg3MkMyOUY0OCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PqqezsUAAAAfSURBVHjaYmRABcYwBiM2QSA4y4hNEKYDQxAEAAIMAHNGAzhkPOlYAAAAAElFTkSuQmCC) repeat-x 0 0;
border: 0 none;
color: #cccccc;
height: 4px;
padding: 0;
}*/
hr {
margin: 0 0 19px;
border: 0;
border-bottom: 1px solid #ccc;
}

body > h2:first-child {
margin-top: 0;
padding-top: 0; }
body > h1:first-child {
margin-top: 0;
padding-top: 0; }
body > h1:first-child + h2 {
margin-top: 0;
padding-top: 0; }
body > h3:first-child, body > h4:first-child, body > h5:first-child, body > h6:first-child {
margin-top: 0;
padding-top: 0; }

a:first-child h1, a:first-child h2, a:first-child h3, a:first-child h4, a:first-child h5, a:first-child h6 {
margin-top: 0;
padding-top: 0; }

h1 p, h2 p, h3 p, h4 p, h5 p, h6 p {
margin-top: 0; }

li p.first {
display: inline-block; }
li {
margin: 0; }
ul, ol {
padding-left: 30px; }

ul :first-child, ol :first-child {
margin-top: 0; }

dl {
padding: 0; }
dl dt {
font-size: 14px;
font-weight: bold;
font-style: italic;
padding: 0;
margin: 15px 0 5px; }
dl dt:first-child {
padding: 0; }
dl dt > :first-child {
margin-top: 0; }
dl dt > :last-child {
margin-bottom: 0; }
dl dd {
margin: 0 0 15px;
padding: 0 15px; }
dl dd > :first-child {
margin-top: 0; }
dl dd > :last-child {
margin-bottom: 0; }

blockquote {
border-left: 4px solid #dddddd;
padding: 0 15px;
color: #777777; }
blockquote > :first-child {
margin-top: 0; }
blockquote > :last-child {
margin-bottom: 0; }

/*table {
padding: 0;border-collapse: collapse; }
table tr {
border-top: 1px solid #cccccc;
background-color: white;
margin: 0;
padding: 0; }
table tr:nth-child(2n) {
background-color: #f8f8f8; }
table tr th {
font-weight: bold;
border: 1px solid #cccccc;
margin: 0;
padding: 6px 13px; }
table tr td {
border: 1px solid #cccccc;
margin: 0;
padding: 6px 13px; }
table tr th :first-child, table tr td :first-child {
margin-top: 0; }
table tr th :last-child, table tr td :last-child {
margin-bottom: 0; }*/

img {
max-width: 100%; }

span.frame {
display: block;
overflow: hidden; }
span.frame > span {
border: 1px solid #dddddd;
display: block;
float: left;
overflow: hidden;
margin: 13px 0 0;
padding: 7px;
width: auto; }
span.frame span img {
display: block;
float: left; }
span.frame span span {
clear: both;
color: #333333;
display: block;
padding: 5px 0 0; }
span.align-center {
display: block;
overflow: hidden;
clear: both; }
span.align-center > span {
display: block;
overflow: hidden;
margin: 13px auto 0;
text-align: center; }
span.align-center span img {
margin: 0 auto;
text-align: center; }
span.align-right {
display: block;
overflow: hidden;
clear: both; }
span.align-right > span {
display: block;
overflow: hidden;
margin: 13px 0 0;
text-align: right; }
span.align-right span img {
margin: 0;
text-align: right; }
span.float-left {
display: block;
margin-right: 13px;
overflow: hidden;
float: left; }
span.float-left span {
margin: 13px 0 0; }
span.float-right {
display: block;
margin-left: 13px;
overflow: hidden;
float: right; }
span.float-right > span {
display: block;
overflow: hidden;
margin: 13px auto 0;
text-align: right; }

code, tt {
margin: 0 2px;
padding: 0 0px;
white-space: nowrap;
/*background-color: #fff;*/
color: rgba(51, 102, 255, 255);
/*border: 1px solid #eaeaea;*/
/*background-color: #f8f8f8;*/
/*border-radius: 3px; */}

pre code {
margin: 0;
padding: 0;
white-space: pre;
border: none;
color: rgba(0, 0, 0, 255);
background: transparent; }

.highlight pre {
background-color: #f8f8f8;
border: 1px solid #cccccc;
font-size: 13px;
line-height: 19px;
overflow: auto;
padding: 6px 10px;
border-radius: 3px; }

pre {
background-color: #f8f8f8;
border: 1px solid #cccccc;
font-size: 14px;
line-height: 19px;
overflow: auto;
padding: 6px 10px;
border-radius: 3px; }
pre code, pre tt {
background-color: transparent;
border: none; }

sup {
font-size: 0.83em;
vertical-align: super;
line-height: 0;
}
* {
-webkit-print-color-adjust: exact;
}
@media screen and (min-width: 914px) {
body {
/*width: 854px;*/
/*margin:0 auto;*/
}
}
@media print {
table, pre {
page-break-inside: avoid;
}
pre {
word-wrap: break-word;
}
}

#cnblogs_post_body li ul li {
list-style-type: circle !important;
}
#cnblogs_post_body a {
text-decoration: none;
color: #4183C4;
}

#mainContent .postBody h2 {
margin: 25px auto 12px auto;
padding-bottom: 2px;
}
-->

UIAutomator初探

这篇文章你会学到的东西:
1、什么是自动化测试
2、有哪些测试
3、自动化测试工具
4、认识UIAutomator
5、用UIAutomator制作第一个自动化测试工具。

ps:笔者也是刚开始学习UIAutomator,若有错误的地方,或者有更好的操作方式,望请不吝赐教。

偷懒改变世界。
人们懒的走路,发明了汽车。
人们懒的爬楼梯,发明了电梯。
人们懒的洗衣服,发明了洗衣机。
人类的进步,离不开偷懒而又聪明的发明家。现在,一群偷懒而又聪明的程序员将偷懒上升到新的高度——利用程序来进行自动化测试。将测试员从繁琐的测试用例中解放出来,从此,可以一边喝着咖啡一边看着机器自动的执行测试,测试员不必看着测试用例重复进行无数次的测试步骤,也不必担心失误而导致不必要的错误,更不用担心压力测试而导致身心疲惫。UIAutomator就是这么一个被聪明的偷懒家发明出来的东西。我们可以使用它,来编写自动测试的代码,执行这些代码,就可以让机器自己执行测试,而我们,嘿嘿,去喝杯咖啡或者看看足球比赛吧。

什么是自动化测试

自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。

有哪些测试

1、Google CTS测试:兼容性测试,测试ROM的兼容性标准
2、实验室机器人测试,机械臂自动化模拟测试
3、Monkey Test 压力测试
4、End User Test 终端用户测试
对于美国的手机运营商,如:T-Mobile、Sprite、AT&T,他们都有自己一系列的手机性能测试、他们的测试项目、测试方法、测试过程,其实都是他们的商业机密,一个保证测试结果的严谨性,一个也保证了手机厂商能够不作弊的完成测试。所以千万不要学华X手机,在T-Mobile实验室偷拍手机机器人的软件、技术参数及其他机密信息,而被T-Mobile列入北美黑名单。逗比新闻

自动化测试工具

MonkeyRunner

monkeyRunner提供一个API来控制Android设备。可以写一个Python脚本来安装应用、运行应用、发送键值、截图。monkeyRunner对python进行了封装,加入一些针对Android设备的类。可以完全用python脚本来实现这些功能。适用于压力测试。

Instrumentation

基于Android单个Activity的测试框架。适用于白盒测试

Robotium

一个优秀的测试框架,基于Instrumentation的二次封装。使用于白盒测试

QTP

一个web上的自动化测试工具,通过录制脚本来实现自动化测试。

UIAutomator

目前最佳的UI自动化测试框架。基于Android4.x+系统,专业UI自动化测试,可以模拟用户操作手机的各种行为。编写快速,可以使用大部分Android Api、无需前面,没有Activity限制。

认识UIAutomator

UIAutomator,翻译过来就是Android UI 自动化测试,在Android4.1版本中推出了UiAutomator测试框架,此框架一改过去较麻烦的UI自动化测试,和解放了过去诸多枷锁,让UI自动化测试变得非常容易和简单。

用UIAutomator制作第一个自动化测试工具

我们用UIAutomator制作一个自动化测试工具,它只有一个简单的能力——帮助我们按手机的Home键。

第一步:创建一个测试工程

我们用ADT来创建一个测试工程。

创建一个java Project。

选中菜单栏->File->New->Java Project就可以创建一个java工程了。
如图所示:

[安卓自动化测试] 001.UIAutomator初探

添加必备的jar包。

在工程目录下新建libs包。里面存放从Android SDK的platform/android-19/目录下获取的两个jar包:android.jar和uiautomator.jar。把这两个jar包丢到libs目录下。并build path 配置好这两个jar包。

编写测试用例类。

我们创建了一个Test类,它继承了UiAutomatorTestCase类。我们在此编写一个测试用例方法。它的作用是按下手机的home键。因为UiAutomator遵循Junit3,所以方法前都要带test。代码如下:

package com.babybus.uiautomator.demo001;

import com.android.uiautomator.core.UiDevice;
import com.android.uiautomator.testrunner.UiAutomatorTestCase; public class Test extends UiAutomatorTestCase { public void testPressHomeKey() { UiDevice.getInstance().pressHome();
}
}

  

第二步:创建build.xml
在终端执行脚本

在终端输入代码:

android create uitest-project -n [jar name] -t 1 -p[project path]

android create uitest-project 表示说要创建一个uitest-project项目
-n 这个项目的名称
-t 需要用到的android SDK的id。我们可以在终端执行android list来查看用的sdk的id编号。如下图:


[安卓自动化测试] 001.UIAutomator初探


-p 工程目录
输入好代码回车,如下图:

[安卓自动化测试] 001.UIAutomator初探

会在工程目录下创建build.xml.刷新工程,如图所示:
[安卓自动化测试] 001.UIAutomator初探

第三步:修改build.xml

我们把build.xml第二行的help改成build。代码如下:

<project name="BBUIAutomator" default="build">
第四步:编译,生成自动化测试jar包。
编译

执行命令:ant -buildfile [build.xml路径] 或者你也可以cd到工程目录下,执行命令:ant -buildfile build.xml,回车,如下图:
[安卓自动化测试] 001.UIAutomator初探
出现BUILD SUCCESSFUL,就表示编译成功了。我们会在bin目录下,发现编译好的jar包。
[安卓自动化测试] 001.UIAutomator初探

第五步:push jar包到手机
我们需要把这个生成的自动化测试jar包push到手机的data/local/tmp目录下。

执行命令:

adb push [jar path] /data/local/tmp

终端运行结果如下:
[安卓自动化测试] 001.UIAutomator初探

第六步:执行jar包里面的自动测试代码。这里如果正确,应该看到好像有一个隐形人,按下了手机的Home键。

执行命令:

adb shell uiautomator runtest [jar name] -c [类名(完整类名)]

回车,等几秒,你会看到手机好像有个人按了home建,屏幕返回到Home页面。 命令输出结果如下:
[安卓自动化测试] 001.UIAutomator初探

[安卓自动化测试] 001.UIAutomator初探

本站文章为宝宝巴士 SD.Team原创,转载务必在明显处注明:(作者官方网站:宝宝巴士
转载自【宝宝巴士SuperDo团队】 原文链接: http://www.cnblogs.com/superdo/p/4493142.html