从事android客户端测试。微博:http://weibo.com/xingzunxi

发布新日志

  • android之monkey测试

    daniel_402 发布于 2012-07-17 20:09:33

    最近看了些android的工具测试,先说说monkey.基本也是看别人的经验来学习

    首先环境变量path先设置一下android的sdk下的adb命令.
    cmd下运行adb,可以看到abd的信息

    monkey是android框架下的一个命令行工具,模拟用户的操作事件向设备或者模拟机发送随即的命令.可以自己设定事件响应次数,从而验证程序在长时间按键下的稳定性.它只能指定需要测试的程序包.

    而它兄弟monkeyrunner和他完全不同,monkeyrunner之后还要研究研究




    我启动一个模拟机和一个设备机,察看设备连接状态


    这时候你要abd shell 他会返回more than one device and emulator
    解决为加参数
    比如
    adb -s 1000460fa54a shell

    ls命令查看当前目录

    ..
    data/data下面都是包名
    ls data/data

     
    随便找一个sohu的新闻客户端测试,如果包多不好找,就跟linux下找文件的一样用法

    输入monkey -p com.sohu.newsclient -v 50
    -p 表示对象包,-v 表示反馈信息级别  50事件数

    基本用法很多参数包括基本导航事件,系统按键事件如下抄过来的
    事件
    -s <seed>
    伪随机数生成器的 seed 值。如果用相同的 seed 值再次运行 Monkey ,它将生成相同的事件序列。
    –throttle <milliseconds>
    在事件之间插入固定延迟。通过这个选项可以减缓 Monkey 的执行速度。如果不指定该选项, Monkey 将不会被延迟,事件将尽可能快地被产成。
    –pct-touch <percent>
    调整触摸事件的百分比 ( 触摸事件是一个 down-up 事件,它发生在屏幕上的某单一位置 ) 。
    –pct-motion <percent>
    调整动作事件的百分比 ( 动作事件由屏幕上某处的一个 down 事件、一系列 的伪随机事件和一个 up 事件组成 ) 。
    –pct-trackball <percent>
    调整轨迹事件的百分比 ( 轨迹事件由一个或几个随机的移动组成,有时还伴随有点击 ) 。
    –pct-nav <percent>
    调整“基本”导航事件的百分比 ( 导航事件由来自方向输入设备的 up/down/left/right 组成 ) 。
    –pct-majornav <percent>
    调整“主要”导航事件的百分比 ( 这些导航事件通常引发图形界面中的动作,如: 5-way 键盘的中间按键、回退按键、菜单按键 )
    –pct-syskeys <percent>
    调整“系统”按键事件的百分比 ( 这些按键通常被保留,由系统使用,如 Home 、 Back 、 Start Call 、 End Call 及音量控制键 ) 。
    –pct-appswitch <percent>
    调整启动 Activity 的百分比。在随机间隔里, Monkey 将执行一个 startActivity () 调用,作为最大程度覆盖包中全部 Activity 的一种方法。
    –pct-anyevent <percent>
    调整其它类型事件的百分比。它包罗了所有其它类型的事件,如:按键、其它不常用的设备按钮、等等。
    约束限制
    -p <allowed-package-name>
    如 果用此参数指定了一个或几个包, Monkey 将只允许系统启动这些包里的 Activity 。如果你的应用程序还需要访问其它包里的 Activity( 如选择取一个联系人 ) ,那些包也需要在此同时指定。如果不指定任何包, Monkey 将允许系统启动全部包里的 Activity 。要指定多个包,需要使用多个 -p 选项,每个 -p 选项只能用于一个包。
    -c <main-category>
    如 果用此参数指定了一个或几个类别, Monkey 将只允许系统启动被这些类别中的某个类别列出的 Activity 。如果不指定任何类别, Monkey 将选择下列类别中列出的 Activity : Intent.CATEGORY_LAUNCHER 或 Intent.CATEGORY_MONKEY 。要指定多个类别,需要使用多个 -c 选项,每个 -c 选项只能用于一个类别。
    调试
    –dbg-no-events
    设 置此选项, Monkey 将执行初始启动,进入到一个测试 Activity ,然后不会再进一步生成事件。为了得到最佳结果,把它与 -v 、一个或几个包约束、以及一个保持 Monkey 运行 30 秒或更长时间的非零值联合起来,从而提供一个环境,可以监视应用程序所调用的包之间的转换。
    –hprof
    设置此选项,将在 Monkey 事件序列之前和之后立即生成 profiling 报告。这将会在 data/misc 中生成大文件 (~5Mb) ,所以要小心使用它。
    –ignore-crashes
    通常,当应用程序崩溃或发生任何失控异常时, Monkey 将停止运行。如果设置此选项, Monkey 将继续向系统发送事件,直到计数完成。
    –ignore-timeouts
    通常,当应用程序发生任何超时错误 ( 如“ Application Not Responding ”对话框 ) 时, Monkey 将停止运行。如果设置此选项, Monkey 将继续向系统发送事件,直到计数完成。
    –ignore-security-exceptions
    通常,当应用程序发生许可错误 ( 如启动一个需要某些许可的 Activity) 时, Monkey 将停止运行。如果设置了此选项, Monkey 将继续向系统发送事件,直到计数完成。
    –kill-process-after-error
    通常,当 Monkey 由于一个错误而停止时,出错的应用程序将继续处于运行状态。当设置了此选项时,将会通知系统停止发生错误的进程。注意,正常的 ( 成功的 ) 结束,并没有停止启动的进程,设备只是在结束事件之后,简单地保持在最后的状态。
    –monitor-native-crashes
    监视并报告 Android 系统中本地代码的崩溃事件。如果设置了 –kill-process-after-error ,系统将停止运行。
    –wait-dbg
    停止执行中的 Monkey ,直到有调试器和它相连接。


  • 【转】Android中对Log日志文件的分析

    yanfang_zheng 发布于 2012-08-24 12:59:25

    一,Bug出现了, 需要“干掉”它 

    bug一听挺吓人的,但是只要你懂了,android里的bug是很好解决的,因为android里提供了LOG机制,具体的底层代码,以后在来分析,只要你会看bug,

    android里应用开发也就很简单了。

    那我们先来看看android里的ANR,怎么出现ANR呢,很简单。

              # adb shell

              # cd data/app

             #  monkey   -p  com.xxx.xxx   -v   3000      (com.xxx.xxx是你应用程序的包名,如果想知道monkey详细用法,执行  monkey  help  )

             实际上很多优秀android应用都会出现ANR,比如UC浏览器,360等等,如果你有兴趣可以回去试试,

          这样,ANR出现了。 开始做修改准备工作  ,得到log文件。

    有人问log文件在哪儿?
    一般在/data/log下面(但是真机才有的)。你可以通过执行命令adb shell进去看看,用pull把log文件拉到你的电脑里
     
    好,得到log文件了,我们就准备开始工作了 。 我将详细的log文件上传到附件供大家参考。

    下载地址为  http://download.csdn.net/detail/andy_android/3785393

    二,Log的种类

              android.util.Log常用的方法有以下六个:Log.v() Log.d() Log.i() Log.w() , Log.e()以及Log.a() (android 4.0新增加的)。根据首字母对应             VERBOSEDEBUG,INFO,WARNERROR,Assert。

              1、Log.v 的调试颜色为黑色的,任何消息都会输出,这里的v代表verbose啰嗦的意思,平时使用就是Log.v("","");

              2、Log.d的输出颜色是蓝色的,仅输出debug调试的意思,但他会输出上层的信息,过滤起来可以通过DDMS的Logcat标签来选择.

              3、Log.i的输出为绿色,一般提示性的消息information,它不会输出Log.v和Log.d的信息,但会显示i、w和e的信息

             4、Log.w的意思为橙色,可以看作为warning警告,一般需要我们注意优化Android代码,同时选择它后还会输出Log.e的信息。

             5、Log.e为红色,可以想到error错误,这里仅显示红色的错误信息,这些错误就需要我们认真的分析,查看栈的信息了。

             6    Log.a为4.0新增加的。

              启动Eclipse,打开DDMS大家可以在LogCat里看见(前提是android 4.0的ADT)

    三,如何分析和研究Log文件,如何看日志信息 Logandroid中的地位非常重要,要是作为一个android程序员不能过分析log这关,算是android没有入门吧。 下面我们就来说说如何处理log文件。

    Log分为Fatal和ANR

    什么时候会有Log文件的产生?
    Log
    的产生大家都知道, 大家也都知道通过DDMS来看log(这个就不用说了),但什么时候会产生log文件呢?一般在如下几种情况会产生log文件。 
    1
    ,程序异常退出,uncausedexception      (Fatal)
    2
    ,程序强制关闭,ForceClosed (简称FC)       (Fatal)
    3
    ,程序无响应,ApplicationNo Response(简称ANR)

                                   ANR出现的情况有以下两种

                                           A  界面操作按钮的点击等待响应时间超过5秒

                                           B  HandleMessage回调函数执行超过10秒,BroadcasterReciver里的onRecive()方法处理超过10秒

    4,手动生成。


    拿到一个日志文件,要分成多段来看。log文件很长,其中包含十几个小单元信息,但不要被吓到,事实上他主要由三大块儿组成 。

    1
    ,系统基本信息,包括 内存,CPU,进程队列,虚拟内存 , 垃圾回收等信息 。------MEMORY INFO (/proc/meminfo) ------
    ------CPU INFO (top -n 1 -d 1 -m 30 -t) ------
    ------PROCRANK (procrank) ------
    ------VIRTUAL MEMORY STATS (/proc/vmstat) ------
    ------VMALLOC INFO (/proc/vmallocinfo) ------

    格式如下:
    ------MEMORY INFO (/proc/meminfo) ------
    MemTotal:        347076 kB
    MemFree:          56408 kB
    Buffers:           7192 kB
    Cached:          104064 kB
    SwapCached:           0 kB
    Active:          192592 kB
    Inactive:         40548 kB
    Active(anon):    129040 kB
    Inactive(anon):    1104 kB
    Active(file):     63552 kB
    Inactive(file):   39444 kB
    Unevictable:       7112 kB
    Mlocked:              0kB
    SwapTotal:            0 kB
    SwapFree:             0 kB
    Dirty:               44kB
    Writeback:            0 kB
    AnonPages:       129028 kB
    Mapped:           73728 kB
    Shmem:             1148kB
    Slab:             13072kB
    SReclaimable:      4564 kB
    SUnreclaim:        8508 kB
    KernelStack:       3472 kB
    PageTables:       12172 kB
    NFS_Unstable:         0 kB
    Bounce:               0kB
    WritebackTmp:         0 kB
    CommitLimit:     173536 kB
    Committed_AS:   7394524 kB
    VmallocTotal:    319488 kB
    VmallocUsed:      90752 kB
    VmallocChunk:    181252 kB


    2
    ,事件信息, 也是我们主要分析的信息 。
    ------VMALLOC INFO (/proc/vmallocinfo) ------
    ------EVENT INFO (/proc/vmallocinfo) ------

    格式如下:
    ------SYSTEM LOG (logcat -b system -v time -d *:v) ------
    01-1516:41:43.671 W/PackageManager( 2466): Unknown permissioncom.wsomacp.permission.PROVIDER in package com.android.mms
    01-1516:41:43.671 I/ActivityManager( 2466): Force stopping packagecom.android.mms uid=10092
    01-1516:41:43.675 I/UsageStats( 2466): Something wrong here, didn't expectcom.sec.android.app.twlauncher to be paused
    01-1516:41:44.108 I/ActivityManager( 2466): Start proccom.sec.android.widgetapp.infoalarm for servicecom.sec.android.widgetapp.infoalarm/.engine.DataService: pid=20634uid=10005 gids={3003, 1015, 3002}
    01-1516:41:44.175 W/ActivityManager( 2466): Activity pause timeout forHistoryRecord{48589868com.sec.android.app.twlauncher/.Launcher}
    01-1516:41:50.864 I/KeyInputQueue( 2466): Input event
    01-1516:41:50.866 D/KeyInputQueue( 2466): screenCaptureKeyFlag setting0
    01-1516:41:50.882 I/PowerManagerService( 2466): Ulight 0->7|0
    01-1516:41:50.882 I/PowerManagerService( 2466): Setting target 2: cur=0.0target=70 delta=4.6666665 nominalCurrentValue=0
    01-1516:41:50.882 I/PowerManagerService( 2466): Scheduling lightanimator!
    01-1516:41:51.706 D/PowerManagerService( 2466): enableLightSensortrue
    01-1516:41:51.929 I/KeyInputQueue( 2466): Input event
    01-1516:41:51.933 W/WindowManager( 2466): No focus window, dropping:KeyEvent{action=0 code=26 repeat=0 meta=0 scancode=26mFlags=9}



    3
    ,虚拟机信息, 包括进程的,线程的跟踪信息,这是用来跟踪进程和线程具体点的好地方。 
    ------VM TRACES JUST NOW (/data/anr/traces.txt.bugreport: 2011-01-1516:49:02) ------
    ------VM TRACES AT LAST ANR (/data/anr/traces.txt: 2011-01-15 16:49:02)------


    格式如下:
    -----pid 21161 at 2011-01-15 16:49:01 -----
    Cmdline: com.android.mms

    DALVIKTHREADS:
    "main"prio=5 tid=1 NATIVE
      |group="main" sCount=1 dsCount=0 s=N bj=0x4001d8d0self=0xccc8
      |sysTid=21161 nice=0 sched=0/0 cgrp=default handle=-1345017808
      |schedstat=( 4151552996 5342265329 10995 )
      atandroid.media.MediaPlayer._reset(Native Method)
      atandroid.media.MediaPlayer.reset(MediaPlayer.java:1218)
      atandroid.widget.VideoView.release(VideoView.java:499)
      atandroid.widget.VideoView.access$2100(VideoView.java:50)
      atandroid.widget.VideoView$6.surfaceDestroyed(VideoView.java:489)
      atandroid.view.SurfaceView.reportSurfaceDestroyed(SurfaceView.java:572)
      atandroid.view.SurfaceView.updateWindow(SurfaceView.java:476)
      atandroid.view.SurfaceView.onWindowVisibilityChanged(SurfaceView.java:206)
      atandroid.view.View.dispatchDetachedFromWindow(View.java:6082)
      atandroid.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1156)
      atandroid.view.ViewGroup.removeAllViewsInLayout(ViewGroup.java:2296)
      atandroid.view.ViewGroup.removeAllViews(ViewGroup.java:2254)
      atcom.android.mms.ui.SlideView.reset(SlideView.java:687)
      atcom.android.mms.ui.SlideshowPresenter.presentSlide(SlideshowPresenter.java:189)
      atcom.android.mms.ui.SlideshowPresenter$3.run(SlideshowPresenter.java:531)
      atandroid.os.Handler.handleCallback(Handler.java:587)
      atandroid.os.Handler.dispatchMessage(Handler.java:92)
      atandroid.os.Looper.loop(Looper.java:123)
      atandroid.app.ActivityThread.main(ActivityThread.java:4627)
      atjava.lang.reflect.Method.invokeNative(Native Method)
      atjava.lang.reflect.Method.invoke(Method.java:521)
      atcom.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
      atcom.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
      atdalvik.system.NativeStart.main(NativeMethod)

    ---------------------------------------------------------------------------------------------------------------------------------------
    闲话少说,我总结了观察log文件的基本步骤。1,如果是ANR问题, 则搜索“ANR”关键词。 快速定位到关键事件信息 。
    2
    ,如果是ForceClosed和其它异常退出信息,则搜索"Fatal"关键词,快速定位到关键事件信息 。
    3
    ,定位到关键事件信息后, 如果信息不够明确的,再去搜索应用程序包的虚拟机信息,查看具体的进程和线程跟踪的日志,来定位到代码。 

    用这种方法,出现问题,根本不需要断点调试, 直接定位到问题,屡试不爽 。 
    下面,我们就开始来分析这个例子的log

    打开log文件, 由于是ANR错误,因此搜索"ANR",为何要加空格呢,你加上和去掉比较一下就知道了 。可以屏蔽掉不少保存到anr.log文件的无效信息。 

    定位到关键的事件信息如下:
    01-1516:49:02.433 E/ActivityManager( 2466): ANR in com.android.mms(com.android.mms/.ui.SlideshowActivity)
    01-1516:49:02.433 E/ActivityManager( 2466): Reason:keyDispatchingTimedOut
    01-1516:49:02.433 E/ActivityManager( 2466): Load: 0.6 / 0.61 / 0.42
    01-1516:49:02.433 E/ActivityManager( 2466): CPU usage from 1337225ms to57ms ago:
    01-1516:49:02.433 E/ActivityManager( 2466):   sensorserver_ya:8% = 0% user + 8% kernel / faults: 40 minor
    ......


    01-1516:49:02.433 E/ActivityManager( 2466):  -com.android.mms:0% = 0% user + 0% kernel
    01-1516:49:02.433 E/ActivityManager( 2466):  -flush-179:8: 0% =0% user + 0% kernel
    01-1516:49:02.433 E/ActivityManager( 2466): TOTAL: 25% = 10% user + 14%kernel + 0% iowait + 0% irq + 0% softirq
    01-1516:49:02.436 I/        ( 2466):dumpmesg >"/data/log/dumpstate_app_anr.log"


    我们用自然语言来描述一下日志,这也算是一种能力吧。 
    01-1516:49:02.433 E/ActivityManager( 2466): ANR in com.android.mms(com.android.mms/.ui.SlideshowActivity)
    翻译:在16:492433毫秒的时候ActivityManager

  • android 加载图片,内存溢出问题

    jwzhangjie 发布于 2013-02-18 08:48:16

    首先解析一下基本的知识:

    位图模式,bitmap颜色位数是1位

    灰度模式,bitmap颜色位数是8位,和256色一样

    RGB模式,bitmap颜色位数是24位 在RGB模式下,一个像素对应的是红、绿、蓝三个字节

    CMYK模式,bitmap颜色位数是32位  在CMYK模式下,一个像素对应的是青、品、黄、黑四个字节

    图像文件的字节数(Byte) = 图像分辨率*颜色深度/8(bit/8)

    例如:一幅640*480图像分辨率、RGB色一般为24位真彩色,图像未经压缩的数据容量为:640X480X24/8=921600字节=900KB(1KB=l千字节=1024字节)。

    注:一个图像文件占的磁盘空间大小还和磁盘的文件格式有关。如:NTFS最小单位为4KB 所以图像文件大小肯定是4KB的倍数。但是有图图片压缩算法的存在,图片文件在保存时,体积要比在内存的大小小得多,如640x480的图片文件大小一般只在200K~300K。这也是为什么,加载几MB的图片文件,会导致JVM内存溢出,导致OutofMemoryException的原因。

    由上面的公式,我们可以得出,加载的图片所占的内存大小,取决于其分辨率颜色数


    再了解一下,android读取解析图片的方式,基本与Java的方式类型,通过文件输入流,然后进行解码,再转成图片格式;

    当然google的android也为我们封装好了若干方法,来方便快捷地完成这项工作,如ImageView的setImageBitmap,setImageResource,BitmapFactory的decodeResource等,但是尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存;
    因此,改用先通过BitmapFactory.decodeStream方法,创建出一个bitmap,再将其设为ImageView的source,加载显示。decodeStream最大的秘密在于其直接调用JNI-->nativeDecodeAsset()来完成decode,无需再使用java层的createBitmap,从而节省了java层的空间。


    在使用decodeStream读取图片时,再加上Config参数,就可以更有效地控制加载目标的内存大小,从而更有效阻止抛OutofMemoryException异常,下面用一段代码说明:

    java代码:

    public static Bitmap readBitmapAutoSize(String filePath, int outWidth, int outHeight) {  
                    //outWidth和outHeight是目标图片的最大宽度和高度,用作限制
            FileInputStream fs = null;
            BufferedInputStream bs = null;
            try {
                fs = new FileInputStream(filePath);
                bs = new BufferedInputStream(fs);
                BitmapFactory.Options ptions = setBitmapOption(filePath, outWidth, outHeight);
                return BitmapFactory.decodeStream(bs, null, options);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    bs.close();
                    fs.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            return null;
        }
      
    private static BitmapFactory.Options setBitmapOption(String file, int width, int height) {
            BitmapFactory.Options pt = new BitmapFactory.Options();
            opt.inJustDecodeBounds = true;          
                    //设置只是解码图片的边距,此操作目的是度量图片的实际宽度和高度
            BitmapFactory.decodeFile(file, opt);
      
            int utWidth = opt.outWidth; //获得图片的实际高和宽
            int utHeight = opt.outHeight;
            opt.inDither = false;
            opt.inPreferredConfig = Bitmap.Config.RGB_565;    
                    //设置加载图片的颜色数为16bit,默认是RGB_8888,表示24bit颜色和透明通道,但一般用不上
            opt.inSampleSize = 1;                          
                    //设置缩放比,1表示原比例,2表示原来的四分之一....
                    //计算缩放比
            if (outWidth != 0 && outHeight != 0 && width != 0 && height != 0) {
                int sampleSize = (outWidth / width + outHeight / height) / 2;
                opt.inSampleSize = sampleSize;
            }
      
            opt.inJustDecodeBounds = false;//最后把标志复原
            return opt;
        }
    另外,decodeStream直接拿的图片来读取字节码了, 不会根据机器的各种分辨率来自动适应, 使用了decodeStream之后,需要在hdpi和mdpi,ldpi中配置相应的图片资源, 否则在不同分辨率机器上都是同样大小(像素点数量),显示出来的大小就不对了。 可参考下面的代码:

    java代码:

    BitmapFactory.Options pts = new BitmapFactory.Options();
    //设置图片的DPI为当前手机的屏幕dpi
    opts.inTargetDensity = ctx.getResources().getDisplayMetrics().densityDpi;  
    opts.inScaled = true;
    最后要注意,图片的bitmap对象一般为大对象,不用了要注意主动回收:
    if(!bmp.isRecycle() ){
            bmp.recycle()   //回收图片所占的内存
            system.gc()  //提醒系统及时回收 
    }

  • Android LogCat使用详解

    ingwlhot0801 发布于 2013-01-10 14:19:55

    Android LogCat使用详解

     

    AndroidLogcat用于显示系统的调试信息,可在分别以下几个地方查看和调用logcat

     

     

    1.eclipseDebug模式或DDMS模式下的会有一个Logcat窗口,用于显示log日志

     

    只需在eclipse中启动Android模拟器,切换到DDMSdebug模式下,就会有Logcat窗口,窗口右上方有一系列图标,其中VDIWE五个图标为五个调试信息过滤器:

     

    V:不过滤输出所有调试信息 包括 VERBOSEDEBUGINFOWARNERROR

    Ddebug过滤器,输出DEBUGINFOWARNERROR调试信息

    Iinfo过滤器,输出INFOWARNERROR调试信息

    Wwaring过滤器,输出WARNERROR调试信息

    Eerror过滤器,只输出ERROR调试信息

     

     

    2.Android命令模式下,在启动一个模拟器是可以选择是否需要启动logcat

     

    Android Emulator命令的用法: emulator [options] [-qemu args]

    1.Android Emulator命令的用法: emulator [options] [-qemu args]

     

    启动模拟器命令:emulator -avd <name> -logcat <tags>;

    name:模拟器名字,tags调试信息过滤器类型

    例如:emulator -avd GPhone -logcat w

    启动GPhone模拟器并运行logcat显示调试信息,调试信息的过滤器是w(可替换为vdie),代表只显示waringerror两类调试信息。

     

    2.Android adb 命令:adb logcat [ <filter-spec> ] - View device log

    <filter-spec> == <priority>/<tag>,(pritrity标签,tag为过滤类型)

    例如:2.1adb logcat 显示所有调试信息

          2.2adb logcat *:w 显示waring过滤器过滤后的调试信息

          2.3adb logcat Test1:V Test2:D 显示标签为Test1的所有调试信息,以及显示标签为Test2Debug过滤器过滤后的调试信息

     

     

     

    3.Android程序中访问调试日志,并显示:

     

     

    摘自:http://www.javaeye.com/topic/477112

    logcat介绍命令选项。

    -s 默认设置过滤器

    -f      输出到日志文件

    -c 清除日志

    -d 获取日志

    -g 获取日志的大小

    -v      格式设置日志(见下面的格式打印格式)

     

     

    -v 格式

    brief W/tag ( 876): message

    process W( 876) message (tag)

    tag W/tag : message

    thread W( 876:0x37c) message

    raw message

    time 09-08 05:40:26.729 W/tag ( 876): message

    threadtime 09-08 05:40:26.729 876 892 W tag : message

    long [ 09-08 05:40:26.729 876:0x37c W/tag ] message

     

     

    代码例子:

     

    AndroidManifest.xml添加读取权限

    <uses-permission android:name="android.permission.READ_LOGS" /> 

     

    清除日志

    try {  

        Runtime.getRuntime().exec("logcat -c");  

    } catch(Exception e) {  

     

    获取日志

    try {  

        ArrayList<String> commandLine = new ArrayList<String>();  

        commandLine.add( "logcat");  

        commandLine.add( "-d");  

        commandLine.add( "-v");  

        commandLine.add( "time");  

        commandLine.add( "-s");  

        commandLine.add( "tag:W");  

        Process process = Runtime.getRuntime().exec( commandLine.toArray( new String[commandLine.size()]));  

        BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(process.getInputStream()), 1024);  

        String line = bufferedReader.readLine();  

        while ( line != null) {  

            log.append(line);  

            log.append("\n")  

        }  

       } catch ( IOException e) {   

    } 

     

    结果:

    09-08 09:44:42.267 W/tag     (  754): message1  

    09-08 09:44:42.709 W/tag     (  754): message2  

    09-08 09:44:43.187 W/tag     (  754): message3  

    09-08 09:44:45.295 E/tag     (  754): message8

  • 去除android系统通知栏中的广告

    liuyang0618 发布于 2013-02-05 13:44:59

    我相信现在有很大部分的android手机用户都遇到过这样的问题:android系统通知栏中总是莫名的弹出广告。如下图:

     

    今天就教大家如何揪出这个元凶。
    前提条件:安装有android SDK。
    首先,在网上下载android SDK,解压后的目录结构如下:

     

    接着,需要把adb.exe的路径配置到系统的Path下。如:E:\android-sdk\platform-tools
    再接着,我们需要将手机中的USB调试打开。如下图:
     
     
    使用cmd进入系统的命令行界面,我们使用adb shell,就可以进入android的底层。如果此时提示adb无法识别的,说明你没有配置好adb.exe的路径(E:\android-sdk\platform-tools)配置到path中.
    接着,我们就可以android底层目录中输入:
      dumpsys | grep StatusBarNotification (不区分大小写)
     
      ***************************
       有的用户手机可以不支持grep命令,这时可以只输入:dumpsys ,然后再得到的结果中“右键查找”一下“statusbarnoti”也是可以的。
      ***************************
     
    就可以搜到Notification list,也就是通知列表:

     

    从这个列表中我们就一目了然的知道的垃圾广告出现的应用:com.jecelyin.editor.app,如何你还是不知道他是什么应用你可以再网上一搜就有了。原来是:920文本编辑器,卸载即可。
     
    最后,还是建议官大的android手机使用的用户,安装android apk应用要选择靠谱的网址安装。当然,了解了本文的方法,你再也无需担心了。
     
  • 【转】android测试 教程

    zhanglisha 发布于 2013-03-15 14:10:12

    1、http://www.moandroid.com/?p=1135
    2、http://www.moandroid.com/?p=1182
    3、http://www.moandroid.com/?p=1223
    4、http://www.moandroid.com/?p=1296

    5、http://www.moandroid.com/?p=1280
    6、http://www.moandroid.com/?p=1095
  • 【转】android手机的monkey测试教程

    yanfang_zheng 发布于 2013-04-26 22:19:58

    Monkey是一个命令行工具 ,可以运行在模拟器里或实际设备中。它向系统发送伪随机的用户事件流,实现对正在开发的应用程序进行压力测试。Monkey包括许多选项,它们大致分为四大类:

      · 基本配置 选项,如设置尝试的事件数量。

      · 运行约束选项,如设置只对单独的一个包进行测试。

      · 事件类型 和频率。

      · 调试选项。

      在Monkey运行的时候,它生成事件,并把它们发给系统。同时,Monkey还对测试中的系统进行监测,对下列三种情况进行特殊处理:

      · 如果限定了Monkey运行在一个或几个特定的包上,那么它会监测试图转到其它包的操作,并对其进行阻止。

      · 如果应用程序崩溃或接收到任何失控异常 ,Monkey将停止并报错。

      · 如果应用程序产生了应用程序不响应(application not responding)的错误,Monkey将会停止并报错。

      按照选定的不同级别的反馈信息,在Monkey中还可以看到其执行过程报告和生成的事件。

      Monkey基本用法

      可以通过开发机器上的命令行或脚本来启动Monkey。由于Monkey运行在模拟器/设备环境中,所以必须用其环境中的shell来进行启动。可以通过在每条命令前加上adb shell来达到目的,也可以进入Shell后直接输入Monkey命令。基本语法如下:

      $ adb shell monkey [options]

      如果不指定options,Monkey将以无反馈模式启动,并把事件任意发送到安装 在目标环境中的全部包。下面是一个更为典型的命令行示例,它启动指定的应用程序,并向其发送500个伪随机事件:

      $ adb shell monkey -p your.package.name -v 500

      --v

      命令行的每一个 -v 将增加反馈信息的级别。 Level 0( 缺省值 ) 除启动提示、测试完成和最终结果之外,提供较少信息。 Level 1 提供较为详细的测试信息,如逐个发送到 Activity 的事件。 Level 2 提供更加详细的设置信息,如测试中被选中的或未被选中的 Activity 。

      事件

      -s <seed>

      伪随机数生成器的 seed 值。如果用相同的 seed 值再次运行 Monkey ,它将生成相同的事件序列。

      --throttle <milliseconds>

      在事件之间插入固定延迟。通过这个选项可以减缓 Monkey 的执行速度。如果不指定该选项, Monkey 将不会被延迟,事件将尽可能快地被产成。

      --pct-touch <percent>

      调整触摸事件的百分比 ( 触摸事件是一个 down-up 事件,它发生在屏幕上的某单一位置 ) 。

      --pct-motion <percent>

      调整动作事件的百分比 ( 动作事件由屏幕上某处的一个 down 事件、一系列 的伪随机事件和一个 up 事件组成 ) 。

      --pct-trackball <percent>

      调整轨迹事件的百分比 ( 轨迹事件由一个或几个随机的移动组成,有时还伴随有点击 ) 。

      --pct-nav <percent>

      调整“基本”导航事件的百分比 ( 导航事件由来自方向输入设备的 up/down/left/right 组成 ) 。

      --pct-majornav <percent>

      调整“主要”导航事件的百分比 ( 这些导航事件通常引发图形界面中的动作,如: 5-way 键盘的中间按键、回退按键、菜单按键 )--pct-syskeys <percent>

      调整“系统”按键事件的百分比 ( 这些按键通常被保留,由系统使用,如 Home 、 Back 、 Start Call 、 End Call 及音量控制键 ) 。

      --pct-appswitch <percent>

      调整启动 Activity 的百分比。在随机间隔里, Monkey 将执行一个 startActivity () 调用,作为最大程度覆盖包中全部 Activity 的一种方法。

      --pct-anyevent <percent>

      调整其它类型事件的百分比。它包罗了所有其它类型的事件,如:按键、其它不常用的设备按钮、等等。

      约束限制

      -p <allowed-package-name>

      如果用此参数指定了一个或几个包, Monkey 将只允许系统启动这些包里的 Activity 。如果你的应用程序还需要访问其它包里的 Activity( 如选择取一个联系人 ) ,那些包也需要在此同时指定。如果不指定任何包, Monkey 将允许系统启动全部包里的 Activity 。要指定多个包,需要使用多个 -p 选项,每个 -p 选项只能用于一个包。

      -c <main-category>

      如果用此参数指定了一个或几个类别, Monkey 将只允许系统启动被这些类别中的某个类别列出的 Activity 。如果不指定任何类别, Monkey 将选择下列类别中列出的 Activity : Intent.CATEGORY_LAUNCHER 或 Intent.CATEGORY_MONKEY 。要指定多个类别,需要使用多个 -c 选项,每个 -c 选项只能用于一个类别。

      调试

      --dbg-no-events

      设置此选项, Monkey 将执行初始启动,进入到一个测试 Activity ,然后不会再进一步生成事件。为了得到最佳结果,把它与 -v 、一个或几个包约束、以及一个保持 Monkey 运行 30 秒或更长时间的非零值联合起来,从而提供一个环境,可以监视应用程序所调用的包之间的转换。

      --hprof

      设置此选项,将在 Monkey 事件序列之前和之后立即生成 profiling 报告。这将会在 data/misc 中生成大文件 (~5Mb) ,所以要小心使用它。

      --ignore-crashes

      通常,当应用程序崩溃或发生任何失控异常时, Monkey 将停止运行。如果设置此选项, Monkey 将继续向系统发送事件,直到计数完成。

      --ignore-timeouts

      通常,当应用程序发生任何超时错误 ( 如“ Application Not Responding ”对话框 ) 时, Monkey 将停止运行。如果设置此选项, Monkey 将继续向系统发送事件,直到计数完成。

      --ignore-security-exceptions

      通常,当应用程序发生许可错误 ( 如启动一个需要某些许可的 Activity) 时, Monkey 将停止运行。如果设置了此选项, Monkey 将继续向系统发送事件,直到计数完成。

      --kill-process-after-error

      通常,当 Monkey 由于一个错误而停止时,出错的应用程序将继续处于运行状态。当设置了此选项时,将会通知系统停止发生错误的进程。注意,正常的 ( 成功的 ) 结束,并没有停止启动的进程,设备只是在结束事件之后,简单地保持在最后的状态。

      --monitor-native-crashes

      监视并报告 Android 系统中本地代码的崩溃事件。如果设置了 --kill-process-after-error ,系统将停止运行。

      --wait-dbg

      停止执行中的 Monkey ,直到有调试器和它相连接。

  • 【转】Android如何在测试程序中删除被测应用私有的原始数据

    yanfang_zheng 发布于 2013-05-21 21:46:59

    我们知道在Android App测试时,当我们想把应用程序恢复的初始状态,我们通常可以有以下几种做法:

      手动

      到Setting -> Apps -> 单击我们要测得应用程序 -> 选择Clear data

      这样重新启动App的时候,我们的程序就处于初始状态了。

      命令行

      当然我们也是可以使用命令行来操作的,比如:

    adb shell pm clear my.app.package

      只要把对应的包名,改成你自己的就可以了。

      自动化

      要是能自动化就更加完美了,这样我们就可以在我们的自动化Case里添加相应的恢复App原始状态的代码了,如此我们就可以保证我们的Case总是在一个一致的测试环境中,岂不更美?

      这里我找到了两种方法。

      方法一:在VBS脚本中添加代码,完成操作

    Set bjWsh = CreateObject("Wscript.Shell")
    objWsh.Run "adb shell pm clear my.app.package",1, True

      方法二:在Android Test Project中添加相应代码删除私有原始数据

    Context context = this.getInstrumentation().getTargetContext().getApplicationContext();
    Editor edit = context.getSharedPreferences(m_strPreferencesName, Context.MODE_PRIVATE).edit();
    edit.clear();
    edit.commit();

      当然我这里是删除名叫“m_strPreferencesName”的数据,如果我们想删除其他,或者所有的Share Preferences数据都是可以的。

      请注意:

      虽然Java 有Java.lang.runtime,我们可以通过它在运行时去执行Command命令,完成一些操作,但是在Android里,类似下面的代码就不可以:

    try
            {
                Runtime.getRuntime().exec("adb shell pm clear com.my.package");
            }
            catch(IOException ex)
            {
                ex.printStackTrace();
            }

      这里不会抛任何异常,而且也不会清除App的数据。

      这是因为Andorid的安全机制不允许一个App去删除另一个App的数据。

  • google开源工具列表(与测试相关)

    liangjz 发布于 2009-11-26 00:15:25

  • QTP学习视频

    Spark.lee 发布于 2009-06-15 09:52:16

    QTP 学习视频汇总

    为了自己查看比较方便,对BOOBOOKE内所有的QTP视频做个汇总贴.
    ================================================================================
    [V] QTP 9的新特性 1 - 英文视频
    http://www.boobooke.com/v/bbk1050
    是QTP 9软件中自带的视频讲座,英语讲座
    [V] QTP 9的新特性 2 - 英文视频
    http://www.boobooke.com/v/bbk1051
    QTP 9软件中自带的视频讲座,英语发音
    [V] QTP 9的新特性 3 - 英文视频
    http://www.boobooke.com/v/bbk1052
    QTP 9软件自带的视频讲座,英语发音,希望大家喜欢。
    这些视频都在QTP 9的安装目录的help目录下面。
    help目录包括了QTP全部的联机文档和帮助。
    ================================================================================
    [V] 小布老师QTP系列培训视频 - 1
    http://www.boobooke.com/v/bbk1043
    本讲讲了QTP的概述,希望大家喜欢。
    [V] 小布老师QTP系列培训视频 - 2
    http://www.boobooke.com/v/bbk1044
    本讲讲了测试规划,希望大家喜欢。
    [V] 小布老师QTP系列培训视频 - 3
    http://www.boobooke.com/v/bbk1045
    本讲讲了录制测试脚本,是使用QTP的第一步,希望大家喜欢。
    ================================================================================
    小强作品-零基础学习软件测试-qtp-目录
    1 qtp目录分析
    2 qtp界面分析
    3 qtp示例程序分析
    4 qtp学习指南
    5 qtp基本操作录制与回放
    6 qtp的三种录制方式
    7 增强help步骤
    8 checkpoint
    9 参数化
    10 Tools下的工具介绍
    11 qtp插件分析
    12 qtp测试用例设计考题
    13 vbs
    14 recovery Scenarios
    15 虚拟对象
    16 专家视图测试脚本开发
    17 qtp描述性编程
    18 qtp测试脚本编写规范

    [V] 小强老师系列作品:QTP的安装目录分析
    http://www.boobooke.com/v/bbk1590
    在本集中,小强老师向刚刚接触QTP的朋友介绍了QTP安装后的各个目录,重点介绍了大家需要关注的东西,希望对大家有帮助。
    [V] 小强老师系列作品:QTP界面剖析
    http://www.boobooke.com/v/bbk1594
    本集是承接上集,小强老师向刚刚接触QTP的朋友介绍了QTP的常用界面和菜单选项,希望对大家有帮助。
    [V] 小强老师系列作品:QTP示例程序之研究
    http://www.boobooke.com/v/bbk1598
    本集是承接上集,小强老师向刚刚接触QTP的朋友介绍了QTP自带的示例程序-飞机订票系统,别小看这个示例程序,小程序里面有大文章,且听小强老师给你道来, 希望对大家有帮助。
    [V] 小强老师系列作品:QTP学习指南
    http://www.boobooke.com/v/bbk1515
    在本集中,小强老师根据自己的经验和体会,向刚刚接触QTP的朋友介绍了如何学习QTP的一些方法和经验,希望对大家有帮助。
    [V] 小强老师系列作品:QTP脚本的录制和回放
    http://www.boobooke.com/v/bbk1591
    在本集中,小强老师向刚刚接触QTP的朋友介绍了QTP最基本的脚本录制回放的功能,希望对大家有帮助。
    [V] 小强老师系列作品:QTP三种录制方式
    http://www.boobooke.com/v/bbk1516
    这是该系列讲座的第三集。在本集中,小强老师向刚刚接触QTP的朋友介绍了QTP录制脚本的三种模式,希望对大家有帮助。
    [V] 小强老师系列作品:QTP检查点之研究
    http://www.boobooke.com/v/bbk1595
    本集是承接上集,小强老师向刚刚接触QTP的朋友介绍了QTP的重要功能 - 检查点,希望对大家有帮助。
    [V] 小强老师系列作品:QTP参数化之研究
    http://www.boobooke.com/v/bbk1599
    本集是承接上集,小强老师向刚刚接触QTP的朋友介绍了QTP重要的功能-参数化, 希望对大家有帮助。
    [V] 小强老师系列作品:QTP的常用工具阐释
    http://www.boobooke.com/v/bbk1589
    在本集中,小强老师向刚刚接触QTP的朋友介绍了QTP附带的常用工具,希望对大家有帮助。
    [V] 小强老师系列作品:QTP插件分析
    http://www.boobooke.com/v/bbk1689
    在本集中,小强老师向刚刚接触QTP的朋友介绍了QTP插件的基本知识,希望对大家有帮助。
    [V] 小强老师系列作品:QTP认证考试试题分析一则
    http://www.boobooke.com/v/bbk1575
    小强老师针对想入行软件测试行业的菜鸟级别的朋友,推出了零基础学习软件测试系列培训视频。
    在本集中,小强老师根据自己的经验和体会,向刚刚接触QTP的朋友介绍了如何QTP认证考试的一道典型题目的分析.
    [V] 小强老师系列作品:QTP中VBS介绍
    http://www.boobooke.com/v/bbk1621
    在本集中,小强老师给大家介绍了QTP脚本语言VBS的基本知识,希望大家喜欢。
    [V] 小强老师系列作品:QTP之场景恢复(Recovery Scenarios)
    http://www.boobooke.com/v/bbk1692
    在本集中,小强老师向刚刚接触QTP的朋友介绍了QTP的场景恢复(Recovery Scenarios)的基本知识,希望对大家有帮助。
    [V] 小强老师系列作品:QTP中的虚拟对象入门
    http://www.boobooke.com/v/bbk1695
    在本集中,小强老师向刚刚接触QTP的朋友介绍了QTP中虚拟对象的基本知识,希望对大家有帮助。
    [V] 小强老师系列作品:QTP之专家视图和测试脚本开发
    http://www.boobooke.com/v/bbk1690
    在本集中,小强老师向刚刚接触QTP的朋友介绍了QTP的专家视图,并介绍了脚本开发的几个重要对象,希望对大家有帮助。
    [V] 小强老师系列作品:QTP之描述性编程
    http://www.boobooke.com/v/bbk1691
    在本集中,小强老师向刚刚接触QTP的朋友介绍了QTP的描述性编程的基本知识,希望对大家有帮助。
    [V] 小强老师系列作品:QTP之测试脚本开发规范
    http://www.boobooke.com/v/bbk1693
    在本集中,小强老师向刚刚接触QTP的朋友介绍了QTP脚本开发的基本规范,希望对大家有帮助。
    [V] 小强老师系列作品:QTP脚本的增强一则
    http://www.boobooke.com/v/bbk1592
    本集是承接上集,小强老师向刚刚接触QTP的朋友介绍了如何对录制的脚本进行增强,希望对大家有帮助。

    小强作品:QTP之Excel操作
    http://www.boobooke.com/v/bbk2835

    小强作品:QTP之描述性编程实例
    http://www.boobooke.com/v/bbk2836

    小强作品:QTP之DLL
    小强老师又出新品,QTP中使用动态库DLL技术,希望大家喜欢!
    http://www.boobooke.com/v/bbk2834
    ==============================================================================
    Happy1tiann作品:使用QTP连接数据库
    在线观看: http://www.boobooke.com/v/bbk2017
    Happy1tian作品:QTP自动化对象模型
    在线观看: http://www.boobooke.com/v/bbk2098
    Happy1tian作品:QTP实战示例
    在线观看: http://www.boobooke.com/v/bbk2099
  • 修炼成QTP高手的十个步骤(转)

    shuishixingyu 发布于 2009-06-13 16:19:46

    1. VBscrīptQTP实用VBscrīpt作为测试脚本语言,因此需要掌握很多VBscrīpt的知识:
    2. 软件测试自动化框架
    3. QTPTutorial帮助文档Sources:'\help\QTTutorial.pdf' or '\help\Tutorial.chm' in QTP Install folder.
    4. QTP的用户指南Sources:'\help\QTUsersGuide.pdf' or '\help\MainUsersGuide.chm' in QTP Install folder.
    5. COM/DCOM技术主要是Excel, Word, Outlook等相关的COM技术:
    6. SQL
    7. XML
    8. HTML, DOM测试WEB应用程序时必须了解:
    9. HPQTP Knowledge Base包含很多实用的QTP技术文章:
    10. 一些有用的网站
Open Toolbar