当前位置:首页 » 安卓系统 » android自动化

android自动化

发布时间: 2022-01-09 23:57:50

① 如何利用jenkins来做android自动化

jenkins来做android自动化首先要环境配置并启动Jenkins。
具体步骤如下:
1、 安装jdk建议1.6或以上版本,配置好环境变量。
2、 安装tomcat 安装完调试下tomcat是否正常。
3、 安装ant 载zip包,解压后配置好环境变量。
4、 安装jenkins war包,命名为Jenkins,拷贝到tomcat/webapps目录下。
5、 安装Android SDK 安装,完成后配置好Android_SDK_HOME环境变量。此步骤主要用于进行android自动化测试,若不进行此项可略过。

安装完成后启动tomcat/bin/startup.bat文件(linux下是startup.sh),在浏览器输入localhost:8080/jenkins,8080为tomcat端口,即可访问jenkins服务器。

接下来配置Jenkins:
1、 JDK配置 新增JDK,指定JDK名字和java_HOME
2、 ANT配置 新增ANT,指定ANT名字和ANT_HOME
3、 Maven配置 从略,本文未使用到Maven,具体配置方法参考Google。
4、 Subversion 选择1.6版本SVN,勾选Update default Subversion credentials cache after successful authentication
5、 通知 填写SMTP server、Default user E-mail suffix、System Admin E-mail Address、Jenkins URL、勾选Use SMTP Authentication,填写User Name、Password、Use SSL、SMTP port、Chareset(UTF-8) 、Default Content Type(默认)、Default Recipients(默认收件人),配置完成后可进行测试。
6、 Jenkins URL 配置该URL,用于别人访问。
最后是插件管理

1、 Hudson Subversion Plug-in,jenkins的svn插件。
2、 Android Emulator Plugin,android模拟器插件。
3、 JUnit Attachments Plugin,junit测试报告附件插件。
4、 Email-ext plugin,扩展插件。此处说明下,默认Jenkins只会发送构建失败的,需安装此插件才能自定义不同场景。
5、 Deploy to container Plugin远程发布插件。

② 怎样使用Appium进行Android自动化测试

1、Robotium——安卓测试工具 Robotium是安卓系统最常用的自动化测试工具,并且是一款免费的安卓UI测试工具。它适合于各种不同的安卓版本及其下行版本。软件开发者经常把它称作安卓。Robotium创建的测试使用Java写的。事实上,Robotium是一个个体测试数据库。 但是Robotium需要花费很长时间努力去创建测试,就像为了自动化程序创建的源代码。它不适合互动的软件系统,不能锁住和解锁智能手机。Robotium没有记录和播放功能,它不支持截屏。 2、MonkeyRunner——安卓App测试工具 MonkeyRunner是最流行的有自动化功能的安卓软件测试工具。MonkeyRunner比起Robotium要低端一些。它并不处理源代码。测试创建是用Python写的,其中可能使用记录工具,为了创建测试。MonkeyRunner可以在连接状态的PC或者模拟器上运行测试。它有一个应用程序接口可以控制智能手机或者模拟器。但手机APP测试工具的最大缺陷是每个设备都要编写脚本。另一个缺陷就是,每次测试程序发生改变时都要调整。 3、Ranorex——安卓App测试工具 Ranorex是一个不错的自动化测试工具,不仅最新版本,Android 2.2.以上版本都是可以的。Ranorex的好处在于它有详细的截屏报告。他可以通过WiFi上网连接智能手机或者平板电脑。通过这个 Android 工具,自动化的测试工程师可以详细描述数据驱动测试,但不包括 XML 数据格式。Ranorex可以很轻松地创建测试,自动化测试工程师只需点击鼠标。Ranorex允许附加的程序模块。这个模块可以被用于开发更为复杂的测试场景中。Ranorex是一个商业化的移动应用程序的工具;其许可价格是 1990欧元/年。Ranorex搜索相当慢;它需要 30 秒的时间来执行操作。其中一个必须为Ranorex文书的 APK 文件。否则它不能通过这个工具进行自动化测试,它只能在APK 文件下工作。 4、Appium——安卓自动化测试工具 Appium是为iOS和安卓系统创建的自动化测试框架,是一个免费工具。它支持 2.3 及更高版本的 Android 系统。Appium利用WebDriver界面运行测试。它支持许多编程语言,如 Java、 C#、Ruby和其他的WebDriver数据库。它可以在移动设备上控制 Safari 和Chrome。但是,一些自动化的测试工程师抱怨它提供的报告不足。它的缺点也减少了对于XPath在移动设备上的支持。 5、UI Automator——安卓自动化测试 谷歌最近推出了这一工具。它支持从4.1开始的安卓版本。我们应该选择另一个更早期的安卓应用程序进行自动化测试。UI Automator能够与各类安卓系统兼容,包括系统的应用程序。这使得UI Automator可以锁定和解锁智能手机或平板电脑。通过该工具创建的脚本可以在许多不同的安卓平台上执行。它允许复制用户的操作复杂的序列。UI Automator也可以利用外部按钮的装置调节,打开和关闭设备的按钮。 UI Automator可以与测试框架TestNG集成。在这种情况下,用户界面自动可以生成内容丰富和详细的报告,类似于由Ranorex生成的报告。此工具搜索速度还非常快。在许多安卓平台上测试后,软件测试专家认为UI Automator是质量最好的移动应用程序。它是安卓做好的应用程序之一,它由谷歌推出。 通常大约 80%的新软件的 bug 都会重现支持的平台。其余 20%出现在其他平台上。这意味着,在大多数情况下,事先测试软件产品比盲目使用更好。 目前, Android 4.1 版本安装了约 66%操作系统的设备。这就是为什么许多自动化的测试工程师经常决定UI Automator是最合适的解决方案。

③ Android自动化测试工具有哪些

1、 Robotium 安卓测试工具

Robotium是一款经常使用的自动化测试工具软件,支持Android。
Robotium是一个免费的Android UI测试工具。它适用于为不同的安卓版本和子版本测试自动化。软件开发人员经常把它描述为Android Selenium。Robotium测试是用java写的。事实上,Robotium是一个单元测试库。
但通过Robotium创建测试需要花费很多时间和努力,因为为了自动化测试还需要修改程序源代码。该工具也不适合与系统软件的交互,它不能锁定和解锁智能手机或平板电脑。Robotium也没有录制回放功能,也不提供截图。
2、MonkeyRunner 安卓应用测试

Monkeyrunner是一款流行的Android测试工具,用于自动化功能测试。
这个工具比Robotium更低一层次。这个不必处理源代码来做自动化测试。这个测试可以用Python写,并且可以使用录制工具来创建测试。
Monkeyrunner可以连接到电脑或模拟真实设备运行测试。该工具有一个接口,用它来控制智能手机,平板电脑或外部模拟器的Android代码。
这个测试工具的缺点是,它必须为每个设备编写脚本。另一个问题是,每次测试程序的用户界面变化都需要调整测试脚本。
3、Ronaorex 安卓测试应用工具
Ranrex 是一款不仅可以支持最新Android版本,也支持从Android2.2开始的早期版本和分支版本。
Ranorex的优势是它有详细的截屏报告。它能通过Wifi连接智能手机和平板电脑。
一个自动化测试工程师通过这个Android工具可以不用XML数据格式来详细编写数据驱动的测试。Ranorex工作室使自动化测试工程师只要点击鼠标就可容易地创建测试。它允许详细声明额外的程序模块,来用于在后期开发周期中测试更复杂的场景。
它是一个商业的移动应用工具,其许可价格为1990欧元。不过Ranorex搜索功能相当慢;它需要30秒来完成这样的操作。我们必须为Ranorex配备apk文件设备,否则无法通过这个工具实现自动化测试,因为它只能在APK文件设备上工作。

④ java appium android 怎么判断自动化

下载Maven工程配置文件pom.xml、测试应用 ContactManager.apk、测试代码AndroidContactsTest.java,下载地址见文后参考资料。
2
创建一个java工程
将pom.xml文件放到工程根目录下。
根目录下新建apps目录,ContactManager.apk文件放到apps目录下。
src目录下新建test/java目录,AndroidContactsTest.java文件放到src/test/java目录下。

3
修改AndroidContactsTest.java文件,修改内容如下截图。
修改内容为apk所在路径、模拟器的名称和版本信息。

4
启动模拟器和Appium
命令行运行appium,或者点击界面上最右边的Launch按钮。

5
进入java工程的根目录,运行Maven命令。
要测试所有的case,运行下面命令:
mvn test
或者测试某一个case,运行下面命令:
mvn test -Dtest=test.java.AndroidContactsTest
运行结束会在控制台输出测试结果。

END
开发包参考地址

开发包参考下载地址

⑤ android app自动化测试工具有哪些

基于优秀的图像对比库opencv的测试工具,测试脚本使用Python编写,非常强大。如果你的app没有源码,可以选择它;或者你想做系统测试(跨app的测试),也可以选择它。其它的还是用下面说的那些个吧。
基于优秀的图像对比库opencv的测试工具,测试脚本使用Python编写,非常强大。如果你的app没有源码,可以选择它;或者你想做系统测试(跨app的测试),也可以选择它。其它的还是用下面说的那些个吧。
我通过其核心包sikuli-script.jar实现了android的sikuli化,暂时不打算开源。其实原理挺简单的,认真看过sikuli源码的应该都能写出来。
看lz的意思应该只是想问应用层的,我来说点应用层的
先说说开源的吧:
Robotium
Monkeyrunner
Robolectric
CTS
还有个新兴的测试工具,以前在GitHub看到,现在找不到了,好像是BDD类型的语法;现在还不成熟。
另外基于web的测试也有基于Selenium Webdriver 的 Android WebDriver:
有两种:
基于Remote Server的:官方提供了java接口的,但是Python版的官方里面却没有。我非常喜欢Python,所以自己实现了并且开源到了GitHub:https://github.com/truebit... 有问题大家可以提到上面
基于Instrumentation的:已经在Android SDK r14里面可以安装了
不开源的就多了,不过我见过的一般是以下几种思路:
1. 基于Android Java Instrumentation框架:
基于Robotium,比如bitbar的产品:http://bitbar.com/procts
基于Instrumentation,那就海了去了,很多公司自家写的工具都基于这个;另外Robotium就是基于这个的
2. 基于Android lib层的各种命令,比如sendevent,getevent, monkey, service这些,然后用各种语言封装

⑥ 如何实现一个android的log自动化分析工具

首先,让我们看一看AndroidLog的格式。下面这段log是以所谓的long格式打印出来的。从前面Logcat的介绍中可以知道,long格式会把时间,标签等作为单独的一行显示。

[ 12-09 21:39:35.510 396: 416 I/ActivityManager ]

Start procnet.coollet.infzmreader:umengService_v1 for service
net.coollet.infzmreader/com.umeng.message.

UmengService:pid=21745 uid=10039 gids={50039, 3003, 1015,1028}

[ 12-09 21:39:35.518 21745:21745I/dalvikvm ]

Turning on JNI app bug workarounds fortarget SDK version 8...

[ 12-09 21:39:35.611 21745:21745D/AgooService ]

onCreate()

我们以第一行为例:12-09 是日期,21:39:35.510是时间396是进程号,416是线程号;I代表log优先级,ActivityManager是log标签。

在应用开发中,这些信息的作用可能不是很大。但是在系统开发中,这些都是很重要的辅助信息。开发工程师分析的log很多都是由测试工程师抓取的,所以可能有些log根本就不是当时出错的log。如果出现这种情况,无论你怎么分析都不太可能得出正确的结论。如何能最大限度的避免这种情况呢?笔者就要求测试工程师报bug时必须填上bug发生的时间。这样结合log里的时间戳信息就能大致判断是否是发生错误时的log。而且根据测试工程师提供的bug发生时间点,开发工程师可以在长长的log信息中快速的定位错误的位置,缩小分析的范围。

同时我们也要注意,时间信息在log分析中可能被错误的使用。例如:在分析多线程相关的问题时,我们有时需要根据两段不同线程中log语句执行的先后顺序来判断错误发生的原因,但是我们不能以两段log在log文件中出现的先后做为判断的条件,这是因为在小段时间内两个线程输出log的先后是随机的,log打印的先后顺序并不完全等同于执行的顺序。那么我们是否能以log的时间戳来判断呢?同样是不可以,因为这个时间戳实际上是系统打印输出log时的时间,并不是调用log函数时的时间。遇到这种情况唯一的办法是在输出log前,调用系统时间函数获取当时时间,然后再通过log信息打印输出。这样虽然麻烦一点,但是只有这样取得的时间才是可靠的,才能做为我们判断的依据。

另外一种误用log中时间戳的情况是用它来分析程序的性能。一个有多年工作经验的工程师拿着他的性能分析结果给笔者看,但是笔者对这份和实际情况相差很远的报告表示怀疑,于是询问这位工程师是如何得出结论的。他的回答让笔者很惊讶,他计算所采用的数据就是log信息前面的时间戳。前面我们已经讲过,log前面时间戳和调用log函数的时间并不相同,这是由于系统缓冲log信息引起的,而且这两个时间的时间差并不固定。所以用log信息前附带的时间戳来计算两段log间代码的性能会有比较大的误差。正确的方法还是上面提到的:在程序中获取系统时间然后打印输出,利用我们打印的时间来计算所花费的时间。

了解了时间,我们再谈谈进程Id和线程Id,它们也是分析log时很重要的依据。我们看到的log文件,不同进程的log信息实际上是混杂在一起输出的,这给我们分析log带来了很大的麻烦。有时即使是一个函数内的两条相邻的log,也会出现不同进程的log交替输出的情况,也就是A进程的第一条log后面跟着的是B进程的第二条log,对于这样的组合如果不细心分析,就很容易得出错误的结论。这时一定要仔细看log前面的进程Id,把相同Id的log放到一起看。

不同进程的log有这样的问题,不同的线程输出的log当然也存在着相同的问题。Logcat加上-vthread就能打印出线程Id。但是有一点也要引起注意,就是Android的线程Id和我们平时所讲的Linux线程Id并不完全等同。首先,在Android系统中,C++层使用的Linux获取线程Id的函数gettid()是不能得到线程Id的,调用gettid()实际上返回的是进程Id。作为替代,我们可以调用pthread_self()得到一个唯一的值来标示当前的native线程。Android也提供了一个函数androidGetThreaId()来获取线程Id,这个函数实际上就是在调用pthread_self函数。但是在Java层线程Id又是另外一个值,Java层的线程Id是通过调用Thread的getId方法得到的,这个方法的返回值实际上来自Android在每个进程的java层中维护的一个全局变量,所以这个值和C++层所获得的值并不相同。这也是我们分析log时要注意的问题,如果是Java层线程Id,一般值会比较小,几百左右;如果是C++层的线程,值会比较大。在前里面的log样本中,就能很容易的看出,第一条log是Jave层输出的log,第二条是native层输出的。明白了这些,我们在分析log时就不要看见两段log前面的线程Id不相同就得出是两个不同线程log的简单结论,还要注意Jave层和native层的区别,这样才能防止被误导。

AndroidLog的优先级在打印输出时会被转换成V,I,D,W,E等简单的字符标记。在做系统log分析时,我们很难把一个log文件从头看到尾,都是利用搜索工具来查找出错的标记。比如搜索“E/”来看看有没有指示错误的log。所以如果参与系统开发的每个工程师都能遵守Android定义的优先级含义来输出log,这会让我们繁重的log分析工作变得相对轻松些。

Android比较常见的严重问题有两大类,一是程序发生崩溃;二是产生了ANR。程序崩溃和ANR既可能发生在java层,也可能发生在native层。如果问题发生在java层,出错的原因一般比较容易定位。如果是native层的问题,在很多情况下,解决问题就不是那么的容易了。我们先看一个java层的崩溃例子:

I/ActivityManager( 396): Start proccom.test.crash for activity com.test.crash/.MainActivity:
pid=1760 uid=10065 gids={50065, 1028}

D/AndroidRuntime( 1760): Shutting downVM

W/dalvikvm( 1760): threadid=1: threadexiting with uncaught exception(group=0x40c38930)

E/AndroidRuntime( 1760): FATALEXCEPTION: main

E/AndroidRuntime( 1760):java.lang.RuntimeException: Unable to start activityComponentInfo
{com.test.crash/com.test.crash.MainActivity}:java.lang.NullPointerException

E/AndroidRuntime( 1760): atandroid.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)

E/AndroidRuntime( 1760): atandroid.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)

E/AndroidRuntime( 1760): atandroid.app.ActivityThread.access$600(ActivityThread.java:141)

E/AndroidRuntime( 1760): atandroid.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)

E/AndroidRuntime( 1760): atandroid.os.Handler.dispatchMessage(Handler.java:99)

E/AndroidRuntime( 1760): atandroid.os.Looper.loop(Looper.java:137)

E/AndroidRuntime( 1760): atandroid.app.ActivityThread.main(ActivityThread.java:5050)

E/AndroidRuntime( 1760): atjava.lang.reflect.Method.invokeNative(NativeMethod)

E/AndroidRuntime( 1760): atjava.lang.reflect.Method.invoke(Method.java:511)

E/AndroidRuntime( 1760): atcom.android.internal.os.ZygoteInit$MethodAndArgsCaller.run
(ZygoteInit.java:793)

E/AndroidRuntime( 1760): atcom.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)

E/AndroidRuntime( 1760): atdalvik.system.NativeStart.main(NativeMethod)

E/AndroidRuntime( 1760): Caused by:java.lang.NullPointerException

E/AndroidRuntime( 1760): atcom.test.crash.MainActivity.setViewText(MainActivity.java:29)

E/AndroidRuntime( 1760): atcom.test.crash.MainActivity.onCreate(MainActivity.java:17)

E/AndroidRuntime( 1760): atandroid.app.Activity.performCreate(Activity.java:5104)

E/AndroidRuntime( 1760): atandroid.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)

E/AndroidRuntime( 1760): atandroid.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)

E/AndroidRuntime( 1760): ... 11more

I/Process ( 1760): Sending signal.PID: 1760 SIG: 9

W/ActivityManager( 396): Force finishing activitycom.test.crash/.MainActivity

Jave层的代码发生crash问题时,系统往往会打印出很详细的出错信息。比如上面这个例子,不但给出了出错的原因,还有出错的文件和行数。根据这些信息,我们会很容易的定位问题所在。native层的crash虽然也有栈log信息输出,但是就不那么容易看懂了。下面我们再看一个native层crash的例子:

F/libc ( 2102): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread2102 (testapp)

D/dalvikvm(26630):GC_FOR_ALLOC freed 604K, 11% free 11980K/13368K, paused 36ms, total36ms

I/dalvikvm-heap(26630):Grow heap (frag case) to 11.831MB for 102416-byteallocation

D/dalvikvm(26630):GC_FOR_ALLOC freed 1K, 11% free 12078K/13472K, paused 34ms, total34ms

I/DEBUG ( 127):*** *** *** *** *** *** *** *** *** *** *** *** *** *** ******

I/DEBUG ( 127):Build fingerprint:
'Android/full_maguro/maguro:4.2.2/JDQ39/eng.liuchao.20130619.201255:userdebug/test-keys'

I/DEBUG ( 127):Revision: '9'

I/DEBUG ( 127):pid: 2102, tid: 2102, name: testapp >>>./testapp <<<
I/DEBUG ( 127):signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr00000000

I/DEBUG ( 127): r0 00000020 r173696874 r2 400ff520 r300000000

I/DEBUG ( 127): r4 400ff469 r5beb4ab24 r6 00000001 r7beb4ab2c

I/DEBUG ( 127): r8 00000000 r900000000 sl 00000000 fpbeb4ab1c

I/DEBUG ( 127): ip 4009b5dc spbeb4aae8 lr 400ff46f pc400ff45e cpsr 60000030

I/DEBUG ( 127): d0 000000004108dae8 d1 4108ced84108cec8

I/DEBUG ( 127): d2 4108cef84108cee8 d3 4108cf184108cf08

I/DEBUG ( 127): d4 4108c5a84108c598 d5 4108ca084108c5b8

I/DEBUG ( 127): d6 4108ce684108ce58 d7 4108ce884108ce78

I/DEBUG ( 127): d8 0000000000000000 d9 0000000000000000

I/DEBUG ( 127): d10 0000000000000000 d110000000000000000

I/DEBUG ( 127): d120000000000000000 d130000000000000000

I/DEBUG ( 127): d14 0000000000000000 d150000000000000000

I/DEBUG ( 127): d16 c1dcf7c087fec8b4 d173f50624dd2f1a9fc

I/DEBUG ( 127): d18 41c7b1ac89800000 d190000000000000000

I/DEBUG ( 127): d20 0000000000000000 d210000000000000000

I/DEBUG ( 127): d22 0000000000000000 d230000000000000000

I/DEBUG ( 127): d24 0000000000000000 d250000000000000000

I/DEBUG ( 127): d26 0000000000000000 d270000000000000000

I/DEBUG ( 127): d28 0000000000000000 d290000000000000000

I/DEBUG ( 127): d30 0000000000000000 d310000000000000000

I/DEBUG ( 127): scr 00000010

I/DEBUG ( 127):

I/DEBUG ( 127):backtrace:

I/DEBUG ( 127): #00 pc0000045e /system/bin/testapp

I/DEBUG ( 127): #01 pc0000046b /system/bin/testapp

I/DEBUG ( 127): #02 pc0001271f /system/lib/libc.so (__libc_init+38)

I/DEBUG ( 127): #03 pc00000400 /system/bin/testapp

I/DEBUG ( 127):

I/DEBUG ( 127):stack:

I/DEBUG ( 127): beb4aaa8 000000c8
I/DEBUG ( 127): beb4aaac 00000000
I/DEBUG ( 127): beb4aab0 00000000
I/DEBUG ( 127): beb4aab4 401cbee0 /system/bin/linker

I/DEBUG ( 127): beb4aab8 00001000
I/DEBUG ( 127): beb4aabc 4020191d /system/lib/libc.so (__libc_fini)

I/DEBUG ( 127): beb4aac0 4020191d /system/lib/libc.so (__libc_fini)

I/DEBUG ( 127): beb4aac4 40100eac /system/bin/testapp

I/DEBUG ( 127): beb4aac8 00000000
I/DEBUG ( 127): beb4aacc 400ff469 /system/bin/testapp

I/DEBUG ( 127): beb4aad0 beb4ab24 [stack]

I/DEBUG ( 127): beb4aad4 00000001
I/DEBUG ( 127): beb4aad8 beb4ab2c [stack]

I/DEBUG ( 127): beb4aadc 00000000
I/DEBUG ( 127): beb4aae0 df0027ad
I/DEBUG ( 127): beb4aae4 00000000
I/DEBUG ( 127): #00 beb4aae8 00000000
I/DEBUG ( 127): ........ ........

I/DEBUG ( 127): #01 beb4aae8 00000000
I/DEBUG ( 127): beb4aaec 401e9721 /system/lib/libc.so (__libc_init+40)

I/DEBUG ( 127): #02 beb4aaf0 beb4ab08 [stack]

I/DEBUG ( 127): beb4aaf4 00000000
I/DEBUG ( 127): beb4aaf8 00000000
I/DEBUG ( 127): beb4aafc 00000000
I/DEBUG ( 127): beb4ab00 00000000
I/DEBUG ( 127): beb4ab04 400ff404 /system/bin/testapp

I/DEBUG ( 127):

这个log就不那么容易懂了,但是还是能从中看出很多信息,让我们一起来学习如何分析这种log。首先看下面这行:

pid: 2102, tid: 2102,name: testapp >>>./testapp <<<
从这一行我们可以知道crash进程的pid和tid,前文我们已经提到过,Android调用gettid函数得到的实际是进程Id号,所以这里的pid和tid相同。知道进程号后我们可以往前翻翻log,看看该进程最后一次打印的log是什么,这样能缩小一点范围。

接下来内容是进程名和启动参数。再接下来的一行比较重要了,它告诉了我们从系统角度看,出错的原因:

signal 11 (SIGSEGV), code 1(SEGV_MAPERR), fault addr 00000000

signal11是Linux定义的信号之一,含义是Invalidmemory reference,无效的内存引用。加上后面的“faultaddr 00000000”我们基本可以判定这是一个空指针导致的crash。当然这是笔者为了讲解而特地制造的一个Crash的例子,比较容易判断,大部分实际的例子可能就没有那么容易了。

再接下来的log打印出了cpu的所有寄存器的信息和堆栈的信息,这里面最重要的是从堆栈中得到的backtrace信息:

I/DEBUG ( 127):backtrace:

I/DEBUG ( 127): #00 pc0000045e /system/bin/testapp

I/DEBUG ( 127): #01 pc0000046b /system/bin/testapp

I/DEBUG ( 127): #02 pc0001271f /system/lib/libc.so (__libc_init+38)

I/DEBUG ( 127): #03 pc00000400 /system/bin/testapp

因为实际的运行系统里没有符号信息,所以打印出的log里看不出文件名和行数。这就需要我们借助编译时留下的符号信息表来翻译了。Android提供了一个工具可以来做这种翻译工作:arm-eabi-addr2line,位于prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin目录下。用法很简单:

#./arm-eabi-addr2line -f -eout/target/proct/hammerhead/symbols/system/bin/testapp0x0000045e

参数-f表示打印函数名;参数-e表示带符号表的模块路径;最后是要转换的地址。这条命令在笔者的编译环境中得到的结果是:

memcpy /home/rd/compile/android-4.4_r1.2/bionic/libc/include/string.h:108

剩余三个地址翻译如下:

main /home/rd/compile/android-4.4_r1.2/packages/apps/testapp/app_main.cpp:38

out_vformat /home/rd/compile/android-4.4_r1.2/bionic/libc/bionic/libc_logging.cpp:361

_start libgcc2.c:0

利用这些信息我们很快就能定位问题了。不过这样手动一条一条的翻译比较麻烦,笔者使用的是从网上找到的一个脚本,可以一次翻译所有的行,有需要的读者可以在网上找一找。

了解了如何分析普通的Log文件,下面让我们再看看如何分析ANR的Log文件。

⑦ 如何选择Android自动化框架的几点拙见

首先由于我自己也是个新手,也是在学习各种框架然后给公司项目选定相应自动化框架,研究移动自动化测试框架也就近段时间而已,所以我只能从我自己今天为止的认知角度给各个框架抒发我自己的拙见,你看是否能从中接纳一二吧(对于我自己的话还需要再花一段时间去学习各个框架才能确定哪个/些是适合我们项目的了,也许到时我会写个正式的总结)。

根据你的要求,应该不会考虑MonkeyRunner和Robotium,但我还是想跟你说下其实Robotium还是挺不错的,如果你没有考虑跨进程调用其他APP的话。至于MonkeyRunner我就不大推荐了,你可以看下我对金阳光老师的一个评论的回复《MonkenRunner通过HierarchyViewer定位控件的方法和建议》(文章最后我干脆也贴出来了)。至于Robotium,你对比下本人博客里面各个框架编写的Note的测试示例就可以看出来Robotium相对其他框架会简介很多,况且发展的比UIAutomator和Appium长久很多,所以也应该会更成熟,和Eclipse集成调试起来也很方便。比起后两者如果有不足的话我觉得就以下几点吧:

1. 所有的操作抽象到一个Solo类里面,缺乏面向对象的编程思想,有时会让人不适应。如果你熟悉C语言等面向过程的语言思想的话应该没有问题。
2. 获取控件的方法比较缺乏,大概就几种:通过Text,ID, ClassName,Index。没有后两者的多种多样
3. 跨进程:因为底层使用Instrument框架,测试包和被测应用包打包在一起作为一个进程运行而线程间通过instrumentaiton进行通信,导致了逃不出这个进程设沙箱(sandbox)
4. 做不了模拟键盘的测试(但同时这个也是Robotium非常巨大的优点,因为不像后两者那样需要调用键盘导致输入的各种各样的问题),因为Robotium输入读出其实是直接对控件的text属性进行操作没有通过键盘驱动的,你如果做过UI编程应该就明白我的意思了,因为记住你的测试代码和目标应用是打包在同一个进程中的,同一个进程中想访问另外一个线程的某个变量,运用相应的IPC(Interprocess Communication)机制当然是没有问题的了。

然后到了你问的主题UIAutomator和Appium的对比,我个人是这样看的:

1. UIAutomator是亲爹(google)生的,所以可以保证后续的开发维护力量,除非google倒闭(这里我有点不懂的是为什么google对Monkeyrunner的态度这么让人摸不着头脑,具体请看以上我说的对MonkeyRunner的评论)
2. Appium虽然不是亲爹生的,但是干爹实力雄厚把它武装的无所不能(android,ios,firefox,browser通杀),单单以android来说,底层用得还是UIAutomator,所以只要它能及时跟上UIAutomator的更新,功能上面我不是很担心。
3. 但是也这是Appium的这种架构:UIautomator/seledroid<->Appium Server<->Selenium/AppiumDriver<->Test Case (《Appium架构框架图整理》http://blog.csdn.net/zhutian/article/details/39453505),导致框架有点复杂,当问题出现的时候调试起来比较难以定位,不知道哪个模块出错了。但是说道调试,总比UIAutomator好,起码Appium可以直接集成到eclipse上面进行debug,UiAutomator却每次都要push到目标机器然后再去执行,怎么调试呢?到现在为止我知道的只能原始的print了。
4. 向下兼容问题:Appium可以通过底层UIAutomator/Selendroid(不记得是不是这名字了)通杀;UIAutomator只能在API Level
17(包含)以上使用
5.语言支持:appium基本通杀,UIAutomator用java足矣
6.跨平台:如你所说的只是android两者都没有问题,如果往后需要扩展到ios,那么建议appium
7.bug数量:UIAutomator有的问题Appium都会有,UIAutomator没有的问题Appium也有可能有^_^(不过我还是很看好Appium的)
8. 输入问题,都有bug,具体请查看我相应blog,特别是中文输入,这就是为什么我刚才特意提出Robotum的原因之一
9. WebView支持:UIAutomator据说今年年初已经开始支持,个人没有这方面要求所以没研究;Appium的框架用的Selenium本身就是PC上最流行的开源Web测试框架,所以必然支持了。注意这你你要有点android编程知识了,WebView指的不仅是WebView控件还包含如用sencha+phonegap把webview封装成一个跨平台app的情况了,具体如果不清楚请google。

其他区别我现在就没有想到了,希望能帮助到你,从我自己的角度来看,我觉得UIAutomator继续往前发展是必然的了,但是它不可能最终支持ios。至于Appium我同样有很大的信心它会继续往好的方向发展,且考虑到它的跨平台支持,基于node.js(现在非常流行哦),兼容性等,我如果是你的话我会考虑用Appium的(抛开Robotium不说,如果你又要考虑的话就需要你根据我之前说的再总结下了^_^)。

我觉得这个可以类比之前的微软和Borland的关系,API是Windows,但是IDE是Borland的,各专所长了。可惜(或者庆幸)后来微软发力一下把Borland打得满地找牙一蹶不振,不过这是题外话了,略过......

对了,我有可能会对这封邮件整理下发到博客了,也希望其他网友能评点一二给你出主意。今晚本来想看下easy_monkey的知识了,给你写这个email变成临时性总结了。^_^

给金阳光老师评论的回复如下(关于MonkeyRunner的个人观点)
-----------------------------------------------------------------------------------------------------------------
回复haorenmin2008:首先膜拜下,金老师大驾光临蓬荜生辉啊!
对于后者,确实如此,UIAutomator需要API Level17(包含)以上。
对于前者,因为还没有MonkeyRunner的项目经验,所以是否很强大我就不敢妄加评论了,但是在我近来的tryout过程中,鄙人有以下的一些不成熟的认知:

1. 感觉功能不是很稳定,之前尝试一个MonkeyDevice的getProperty方法,竟然有时成功有时失败。
2. 性能不好,特别是当我们要用到hierarchyviewer的功能的时候很明显。
3. 只能用MonkeyImage的sameAs做截屏的对比,虽然加上hierarchyviewer后可以用它的getText,但还是很有限。
4. 控件定位方面主要是坐标点和HierarchyViewer提供的根据ID。前这儿在UI布局稍微有调整位置的话就需要跟着变动,没有像其他控件类框架那样做高层抽象除非换控件不然都不需要怎么变动;后者的话很多控件是没有id或者是有多个控件id相同的。
5. 可调试性也不强(起码我摸索了这几天没有发现一个很好的调试方法,比如IDE Ecilpse等的集成调试方法)
6. HierarchyViewer的稳定性也让我担忧,碰到过几次取控件信息的时候报exception的。
7. 资料稀缺,不仅网络,google也一样
8. Google支持让人觉得摸不着头脑,sdk给出的API和官方提供的API竟然不一致,以MonkeyDevice为例子,而sdk多出来的API竟然还不能用,google出来的信息不超过10个page,还要很多都是重复的石沉大海的网友报的问题。
9. 再一个的我真心搞不懂为什么本身java写的库非要搞个jython来调用,首先我不说性能损耗(这点肯定是有的,native库当然用native语言调用效率最好嘛),我想在eclipse上对以下的"device."做自动补全是做不到的“device = MonkeyRunner.waitForConnection()\n device.",而只有直接调用个构造函数实例化的device = MonkeyDevice(xxx)才能做到,这个我不相信是我配置的问题,换了个jython标准编译器以调用标准库问题同样存在。

⑧ android手机系统如何运用自动化有哪些自动化测试软件

有自动化测试的工具,主要是针对Android软件的功能测试的, 你可以去搜索一下DroidPilot,非常简单易用,应该能满足你的要求

⑨ android自动化测试框架有哪些

1、Monkey是Android SDK自带的测试工具,在测试过程中会向系统发送伪随机的用户事件流,如按键输入、触摸屏输入、手势输入等),实现对正在开发的应用程序进行压力测试,也有日志输出。实际上该工具只能做程序做一些压力测试,由于测试事件和数据都是随机的,不能自定义,所以有很大的局限性。
2、MonkeyRunner也是Android SDK提供的测试工具。严格意义上来说MonkeyRunner其实是一个Api工具包,比Monkey强大,可以编写测试脚本来自定义数据、事件。缺点是脚本用Python来写,对测试人员来说要求较高,有比较大的学习成本。

⑩ 如何用android studio写自动化测试

1、build.gradle里,dependencies下增加 androidTestCompile 'com.jayway.android.robotium:robotium-solo:5.1’。如果缺少这个配置,则在测试代码里将无法用到robotium的包。
2、我们项目的代码结构是老式的,所以需要重新设置test的地址,即在android.sourceSets下新增 androidTest.setRoot('tests’)。可以取tests外的其他名字,然后在跟build.gradle同级的地方建立这个文件夹,没有更多额外设置的话,测试代码的放置需要按照新式结构,即tests\java下。如果没有正确配置,则这个测试代码将不可见。

除了代码改动外,如果要在Android Studio里面跑,则还需要额外配置:
菜单Run -> Edit Configuration,在Android Tests下新增条目,然后正确配置,就可以了:选择哪个Mole,选择测试的范围(Mole或Package等),选择Target Device。
这个是配置的东西,没有办法提交到Git。

下面是个简单的例子,我们的app在测试的环境下会先弹出一个选环境的AlertDialog,所以需要clickOnText:
/**
* Created by Samuel Cai on 5/20/14.
*/
public class MainActivityTest extends {

private Solo solo;

public MainActivityTest() {
super(LogoActivity.class);
}

@Override
public void setUp() throws Exception {
super.setUp();
solo = new Solo(getInstrumentation(), getActivity());
}

public void testNavigateToHomeScreen() throws Exception {
//choose environment
solo.waitForDialogToOpen();
solo.clickOnText("qa");
solo.clickOnButton("OK");

//assert home screen finished loading.
assertTrue(solo.waitForText("Diapering"));
}
}

热点内容
3k我的使命脚本 发布:2024-09-20 18:11:43 浏览:689
建设银行密码怎么设置 发布:2024-09-20 18:11:04 浏览:95
聚合脚本平台 发布:2024-09-20 17:51:55 浏览:180
访问拦截怎么解除安卓 发布:2024-09-20 17:28:48 浏览:275
萝卜干存储 发布:2024-09-20 17:21:37 浏览:716
苹果手机如何迁移软件到安卓手机 发布:2024-09-20 17:21:34 浏览:692
查看服务器ip限制 发布:2024-09-20 16:56:27 浏览:389
p搜系统只缓存1页为什么 发布:2024-09-20 16:48:51 浏览:841
上网的账号和密码是什么东西 发布:2024-09-20 16:31:31 浏览:613
安卓手机王者荣耀如何调超高视距 发布:2024-09-20 16:31:30 浏览:429