Android uiautomator 自动化测试如何打log,方便查看测试结果 android自动化测试使用uiautomator怎样获取c...
\u7528android uiautomator\u505a\u81ea\u52a8\u5316\u6d4b\u8bd5\uff0c\u600e\u4e48\u8fde\u63a5\u771f\u673a\u8fdb\u884cGoogle\u5728sdk4.0\u4ee5\u540e\u63d0\u4f9b\u4e86\u4e00\u4e2a\u81ea\u52a8\u5316\u89e3\u51b3\u65b9\u6848uiautomator\uff1a
\u4f18\u70b9\uff1a\u53ef\u4ee5\u8de8\u5e94\u7528\u4e86\uff1b\u8fd9\u53ef\u662f\u4eb2\u751f\u7684\uff1b
\u7f3a\u70b9\uff1a\u5fc5\u987bsdk4.0\u4ee5\u4e0a\u7248\u672c\uff1b\u8981\u60f3\u5b9e\u73b0\u7684\u597d\uff0c\u6700\u597d\u6709\u5f00\u53d1\u914d\u5408\uff1bjava\u9879\u76ee\u7f16\u8bd1\u4e3ajar\u540e\u9700\u8981push\u5230\u624b\u673a\u624d\u80fd\u8fd0\u884c\uff0c\u4e5f\u5c31\u662f\u8bf4\u5fc5\u987b\u6253\u5370\u65e5\u5fd7\u66b4\u529b\u8c03\u8bd5\u3002
Appium\u57fa\u4e8eAndroid InstrumentationFramework\u548cUIAutomator\uff0c\u4e5f\u5c31\u662f\u8bf4\u8fd9\u4e2a\u5de5\u5177\u662f\u53ef\u4ee5\u8de8\u5e94\u7528\u7684\u3002\u8bf4\u8fdc\u4e86\uff0c\u597d\u5427\uff0c\u4e3a\u4e86\u5e2e\u5927\u5bb6\u66f4\u5bb9\u6613\u7406\u89e3appium\u7684\u4f7f\u7528\uff0c\u6211\u8fd9\u91cc\u5c31\u8bb2\u4e00\u4e0buiautomator\u7684\u4f7f\u7528\u65b9\u6cd5\u3002
\u4f60\u5e94\u8be5\u6709android-sdk\u5427\uff0c\u5347\u7ea7\u52304.0\u4ee5\u4e0a\uff0c\u8fdb\u5165\u76ee\u5f55android-sdk\tools\uff0c\u4f60\u4f1a\u770b\u5230\u4e24\u4e2a\u6587\u4ef6\uff1a
traceview.bat \u548c uiautomatorviewer.bat\uff0c\u8fd9\u4fe9\u6587\u4ef6\u8ba9\u4f60\u60f3\u8d77\u4e86monkeyrunner\u4e86\u5427\uff0c\u662f\u7684\uff0ctraceview.bat\u5c31\u5bf9\u5e94\u4e8ehierarchyviewer.bat\uff0c\u7528\u6765\u67e5\u770b\u7a0b\u5e8f\u7684ui\u754c\u9762\u7684\uff0c\u901a\u5e38\u4e5f\u662f\u4f7f\u7528\u7ba1\u7406\u5458\u6743\u9650\u542f\u52a8\u7684\u3002
\u597d\u4e86\uff0c\u73b0\u5728\u7528eclipse\u521b\u5efa\u4e00\u4e2ajava project\uff0c\u662f\u7684\uff0c\u4f60\u6ca1\u770b\u9519\uff0c\u662fjava project\u4e0d\u662fandroid project\uff0c\u6dfb\u52a0\u5f15\u7528\uff1a
\u5728project.properties\u4e2d\u5185\u5bb9\u4e3a\uff1a
# Project target.
target= android-16
\u8fd9\u91cc\u7684android-16\u9700\u8981\u548c\u4e4b\u524d\u7684android.jar\u548cuiautomator.jar\u4f4d\u7f6e\u76f8\u4e00\u81f4\u3002
\u7136\u540e\u5462\uff1f\u5199\u4ee3\u7801\u5427\uff0c\u5efa\u7acb\u4e00\u4e2a\u7c7b\uff0c\u5f97\uff0c\u53d1\u4e2a\u7ed9\u5927\u5bb6\u53c2\u8003\uff1a
package com.uia.example.my;
import org.apache.http.util.EncodingUtils ;
import android.graphics.Bitmap ;
import android.graphics.BitmapFactory ;
import android.graphics.Rect ;
import android.os.Environment;
import com.android.uiautomator.core.UiObject;
import com.android.uiautomator.core.UiObjectNotFoundException;
import com.android.uiautomator.core.UiScrollable;
import com.android.uiautomator.core. UiSelector ;
import com.android.uiautomator.testrunner.UiAutomatorTestCase;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class TAppWorkAssistV1 extends UiAutomatorTestCase {
public String sLog ;
public File fout = null ;
public FileOutputStream outStream = null ;
public void write2file(String filename,String sData)
{
String sLog= "" ;
// \u521d\u59cb\u5316\u65e5\u5fd7\u6587\u4ef6
if (Environment. getExternalStorageState ().equals(Environment.MEDIA_MOUNTED )){
sLog = Environment. getExternalStorageDirectory().getAbsolutePath();
try {
fout = new File(sLog,filename);
outStream = new FileOutputStream( fout , true ); // \u6b64\u5904\u7684 true \u662fappend
sData=sData + "\n" ;
outStream .write(sData.getBytes());
outStream .flush();
outStream .close();
fout = null ;
}
catch (Exception e){
e.printStackTrace();
}
} else {
System. out .println( " \u8be5\u624b\u673a\u6ca1\u6709 SD \u5361 " );
}
}
public void testDemo() throws UiObjectNotFoundException {
//1. \u542f\u52a8 app
getUiDevice().pressHome();
UiObject allAppsButton = new UiObject( newUiSelector().description( "Apps" ));
allAppsButton.clickAndWaitForNewWindow();
UiObject appsTab = new UiObject( new UiSelector().text( "Apps" ));
appsTab.click();
UiScrollable appViews = new UiScrollable( newUiSelector().scrollable( true ));
UiObject settingsApp = appViews.getChildByText( newUiSelector().className(android.widget.TextView. class .getName()), "Efilm" );
settingsApp.clickAndWaitForNewWindow();
//2. \u8fdb\u5165\u4e3b\u754c\u9762
System. out .println( "into main view" );
System. out .println(getUiDevice().waitForWindowUpdate("com.eshore.efilm" , 60000));
System. out .println( "intoed main view" );
UiObject tv1 = new UiObject( new UiSelector().text( " \u5f71\u9662 " ));
tv1.click();
//3. \u70b9\u51fb\u5f71\u9662
UiObject oyy= new UiObject( new UiSelector().description("cinema_row" ));
System. out .println( "wait yingyuan come out" );
oyy.waitForExists(60000);
System. out .println( "yingyuan come out" );
oyy.clickAndWaitForNewWindow();
System. out .println( "click yingyuan" );
//4. \u573a\u6b21
UiObject occ= new UiObject( new UiSelector().description("LinearLayout10" ));
System. out .println( "wait changci come out" );
oyy.waitForExists(60000);
System. out .println( "changci come out" );
occ.clickAndWaitForNewWindow();
System. out .println( "click changci" );
//5. \u5ea7\u4f4d
UiObject oseat= new UiObject( new UiSelector().description("cinema_shows_list_item" ).index(0).childSelector( newUiSelector().description( "LinearLayout10" )));
System. out .println( "wait seat come out" );
oseat.waitForExists(5000);
int h=getUiDevice().getDisplayHeight();
int w=getUiDevice().getDisplayWidth();
System. out .println( "(h/2,w/2)=" +h/2+ "," +w/2);
getUiDevice().click(h/2,w/2);
//System.out.println("seat count:"+String.valueOf(oseat.getChildCount()));
//System.out.println("seat getText:"+ oseat.getText());
// \u622a\u5ea7\u4f4d\u56fe
Process process;
try {
process = Runtime. getRuntime ().exec( "screencap /mnt/sdcard/EfilmFailSnapShot01.png" );
try {
process.waitFor();
} catch (InterruptedException e) { // TODO Auto-generated catch block
e.printStackTrace();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//takeScreenShots("EfilmSeatSnapShot");
}
}
\u8fd9\u4e2a\u4f8b\u5b50\u662f\u968f\u4fbf\u5199\u7684\uff0c\u53ef\u80fd\u4e0d\u591f\u4e25\u8c28\u3002\u5927\u4f53\u5c31\u8fd9\u4e48\u4e2a\u60c5\u51b5\u5427\u3002\u4e0b\u4e00\u6b65\u5c31\u662f\u7f16\u8bd1\u6267\u884c\u4e86\uff0c\u5148\u63d2\u4e0a\u624b\u673ausb\u63a5\u53e3\uff0c\u7136\u540e\u6253\u5f00cmd\uff0c\u6267\u884c\uff1a
\u627e\u5230SDKID\uff0c\u4e5f\u5c31\u662fandroid create\u4e2d\u7684-t\u53c2\u6570:
cd C:\ PROGRAM\android-sdk\tools
android list
\u627e\u5230t\u53c2\u6570\u7684\u503c\u4ee5\u540e\uff1a
cd C:\ PROGRAM\android-sdk\tools
android create uitest-project -n TAppWorkAssistV1 -t 25 -p C:\android\u81ea\u52a8\u5316\Tv2.0\TestSetting
cd C:\android\u81ea\u52a8\u5316\Tv2.0\TestSetting
ant build
cd C:\android\u81ea\u52a8\u5316\Tv2.0\TestSetting\bin
adb push TAppWorkAssistV1.jar /data/local/tmp/
adb shell uiautomator runtest TAppWorkAssistV1.jar -c com.uia.example.my. TAppWorkAssistV1
\u770b\u4e86\u770b\uff0c\u597d\u50cf\u6ca1\u6709\u4ec0\u4e48\u7279\u522b\u503c\u5f97\u89e3\u91ca\u7684
-n TAppWorkAssistV1\uff1a\u7c7b\u540d
-p: \u9879\u76ee\u6240\u5728\u76ee\u5f55
Ant build \u628a\u8fd9\u4e2a\u7c7b\u7f16\u8bd1\u6210\u4e00\u4e2ajar\u5305\uff1aTAppWorkAssistV1.jar
\u7136\u540e\u628ajar\u5305push\u5230\u624b\u673a\u4e0a\uff0c\u8c03\u7528\u6267\u884c\u8fd9\u4e2a\u7c7b\u5c31\u53ef\u4ee5\u4e86
\u5927\u81f4\u662f\u8fd9\u4e48\u4e2a\u6b65\u9aa4\uff0c\u4e0d\u8fc7\u6709\u4e00\u4e2a\u975e\u5e38\u91cd\u8981\u7684\u7ec6\u8282\uff0c\u5c31\u662f\u5982\u679c\u4f60\u9700\u8981\u66f4\u7701\u5fc3\uff0c\u5c31\u6700\u597d\u628a\u754c\u9762\u5143\u7d20\uff0c\u65e0\u8bba\u52a8\u6001\u7684\u8fd8\u662f\u5e03\u5c40\u6587\u4ef6\u4e2d\u7684\uff0c\u90fd\u52a0\u4e0acontent-description\u5c5e\u6027\uff0c\u5e76\u4fdd\u8bc1\u552f\u4e00\u6027\uff0c\u6839\u636e\uff1a
UiSelector:description(String desc)
Set the search criteria to match thecontent-description property for a widget.
\u90a3\u5c31\u53ef\u4ee5\u7edf\u4e00\u53ea\u4f7f\u7528\u8fd9\u4e00\u4e2a\u5f15\u7528\u754c\u9762\u5143\u7d20\u7684\u65b9\u6cd5\u5c31\u884c\u4e86\uff0c\u5c31\u4e0d\u7528\u53bb\u60f3\u65b9\u8bbe\u6cd5\u5229\u7528\u5176\u5b83\u7684\u5c5e\u6027\u6765\u5f15\u7528\u4e86\u3002
Google\u5728sdk4.0\u4ee5\u540e\u63d0\u4f9b\u4e86\u4e00\u4e2a\u81ea\u52a8\u5316\u89e3\u51b3\u65b9\u6848uiautomator\uff1a \u4f18\u70b9\uff1a\u53ef\u4ee5\u8de8\u5e94\u7528\u4e86\uff1b\u8fd9\u53ef\u662f\u4eb2\u751f\u7684\uff1b \u7f3a\u70b9\uff1a\u5fc5\u987bsdk4.0\u4ee5\u4e0a\u7248\u672c\uff1b\u8981\u60f3\u5b9e\u73b0\u7684\u597d\uff0c\u6700\u597d\u6709\u5f00\u53d1\u914d\u5408\uff1bjava\u9879\u76ee\u7f16\u8bd1\u4e3ajar\u540e\u9700\u8981push\u5230\u624b\u673a\u624d\u80fd\u8fd0\u884c\uff0c\u4e5f\u5c31\u662f\u8bf4\u5fc5\u987b\u6253\u5370\u65e5\u5fd7\u66b4\u529b\u8c03\u8bd5\u3002
互相学习android自动化测试,请关注我的微博:weibo.com/ganchaojiang一、一个BUG引发的问题
如果研发过程中有一个BUG:“不断的切换手机语言出现花屏现象”。这个问题我们如何验证呢?我想,最好的方式应该是自动化测试。
那么,自动化测试可以完成哪些任务呢?
简单的说,那些重复性的测试工作,都可以交给自动化完成:
1、设置手机的语言
2、添加、删除、收藏联系人
3、拨号、挂断
4、甚至发送短信、收藏短信
如果需要上面的功能,那么就开始自动化之旅吧。
二、Android自动化测试简单介绍
Android自动化测试主要分为Monkeyrunner、Rubotium、UiAutomator、Monkey(在我看来这个不算)等。主要特点:
1、Monkeyrunner:优点:操作最为简单,可以录制测试脚本,可视化操作;缺点:主要生成坐标的自动化操作,移植性不强,功能最为局限;
2、Rubotium:主要针对某一个APK进行自动化测试,APK可以有源码,也可以没有源码,功能强大;缺点是针对APK操作,而且需要对APK重新签名(有工具),因此操作相对复杂;
3、UiAutomator:优点:可以对所有操作进行自动化,操作简单;缺点:Android版本需要高于4.0,无法根据控件ID操作,相对来说功能较为局限,但也够用了;
4、Monkey:准确来说,这不算是自动化测试,因为其只能产生随机的事件,无法按照既定的步骤操作;
由上面介绍可以有这样的结论:测试某个APK,可以选择Rubotium;测试过程可能涉及多个APK,选择UiAutomator;一些简单的测试,选择Monkeyrunner;
本文主要介绍UiAutomator的使用方法。
三、环境搭建
3.1、必备条件:
1、JDK
2、SDK(API高于15)
3、Eclipse(安装ADT插件)
4、ANT(用于编译生成jar)
3.2、简要步骤:
1、安装JDK并添加环境变量。
安装后,一定要通过JAVA_HOME的方式添加环境变量,即先建立JAVA_HOME变量,然后在path中添加%JAVA_HOME%\bin;
2、添加SDK环境变量。
一定要先建立ANDROID_HOME,然后把%ANDROID_HOME%\tools添加到path中;
3、安装Eclipse,并安装ADT插件。
4、安装ANT工具,并添加环境变量。
同样一定要先建立%ANT_HOME%变量,然后在path中添加%ANT_HOME%\bin
四、详细操作
4.1、建立工程
用Eclipse新建Java Project,注意,不是Android Project!
4.2、添加JUnit库
next->Libraries->Add Library
4.3、添加Android库
Add External JARs:
找到路径Android-sdk\platforms\android-17\下面的android.jar和uiautomator.jar添加进来:
所有库添加完应该是这个样子:
4.4、在src中添加包,然后添加class文件
文件内容为:
[java] view plaincopy
package com;
import com.android.uiautomator.core.UiObject;
import com.android.uiautomator.core.UiObjectNotFoundException;
import com.android.uiautomator.core.UiScrollable;
import com.android.uiautomator.core.UiSelector;
import com.android.uiautomator.testrunner.UiAutomatorTestCase;
public class Runner extends UiAutomatorTestCase {
public void testDemo() throws UiObjectNotFoundException {
getUiDevice().pressHome();
// 进入设置菜单
UiObject settingApp = new UiObject(new UiSelector().text("Settings"));
settingApp.click();
//休眠3秒
try {
Thread.sleep(3000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
// 进入语言和输入法设置
UiScrollable settingItems = new UiScrollable( new UiSelector().scrollable(true));
UiObject languageAndInputItem = settingItems.getChildByText(
new UiSelector().text("Language & input"), "Language & input", true);
languageAndInputItem.clickAndWaitForNewWindow();
}
}
上面工程路径在e:\workspace\AutoRunner,类全名为com.Runner,至于具体的作用我们现在不去关心。
4.5、找到SDK ID
CMD进入\Android-sdk\tools\目录下,运行命令:
android list
查看对应android版本的SDK的ID值,当前是60;
4.6、创建build文件
仍然在\Android-sdk\tools\目录下,运行命令:
android create uitest-project -n <name> -t <android-sdk-ID> -p <path>
比如:
android create uitest-project -n AutoRunner -t 60 -p e:\workspace\AutoRunner
上面的name就是将来生成的jar包的名字,可以自己定义,android-sdk-ID就是上面看到的6;path是Eclipse新建的工程的路径;运行命令后,将会在工程的根目录下生成build.xml文件。如果没生成,检查上面的步骤。
4.7、编译生成jar
CMD进入项目的工程目录,然后运行ant build,将使用ant编译生成jar,成功将会提示:
然后会在bin目录下生成jar文件。
4.8、push并运行jar
adb push <jar文件路径> data/local/tmp
adb shell uiautomator runtest <jar文件名> -c <工程中的类名,包含包名>
比如:
adb push e:\workspace\AutoRunner\bin\AutoRunner.jar data/local/tmp
adb shell uiautomator runtest AutoRunner.jar -c com.Runner
然后就能看到手机会按照Runner中的步骤自动执行。具体效果就是,进入设置菜单,然后再进入“语言和输入法”菜单
五、代码分析
我们从几个最重要的对象来介绍。
5.1、UiDevice对象
getUiDevice()的方法可以得到一个UiDevice的对象,通过这个对象可以完成一些针对设备的动作:
click(int x, int y)
----在(x,y)表示的像素地方点击
pressBack()
pressDelete()
pressEnter()
pressHome()
pressMenu()
pressSearch()
----点击相应的按键
wakeUp()
----当手机处于灭屏状态时,唤醒屏幕,并解锁。
swipe(startX, startY, endX, endY, steps)
----在手机上滑动,从(startX,startY)到(endX,endY)。steps表示滑动的这个距离分为几步完成,数目越少,滑动幅度越大。
setOrientationLeft()
setOrientationRight()
----将手机向相应方向旋转。
setOrientationNatural()
----将手机旋转状态回归正常。
5.2、UiSelector对象
这个对象可以理解为一种条件对象,描述的是一种条件,经常配合UiObject使用,可以得到某个(某些)符合条件的控件对象。
checked(boolean val)
----描述一种check状态为val的关系。
className(className)
----描述一种类名为className的对象关系
clickable(boolean val)
http://blog.csdn.net/g19920917/article/details/16131565
扩展阅读:wireless android auto ... 车机安装androidauto ... android automotive os12 ... android system webview ... my android tools pro ... android auto apk ... android苹果版下载 ... android下载安装app ... android messages ...