Android uiautomator 自动化测试如何打log,方便查看测试结果 android自动化测试使用uiautomator怎样获取c...

\u7528android uiautomator\u505a\u81ea\u52a8\u5316\u6d4b\u8bd5\uff0c\u600e\u4e48\u8fde\u63a5\u771f\u673a\u8fdb\u884c

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
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 ...

本站交流只代表网友个人观点,与本站立场无关
欢迎反馈与建议,请联系电邮
2024© 车视网