用adb命令组装PowerShell实用小工具——Android测试小助手

摘要:
工具的实现是基于adb和PowerShell的,支持adb通过USB和WIFI两种方式连接手机进行操作。前置工作1.需要安装adb;2.需要本机设置PowerShell脚本运行策略。脚本示例PowerShell例子如下:#获取当前app包名和活动名FunctionGetPkgAndActName(){#确保app处于激活状态$a=adbshelldumpsyswindowwindows|findstrFocu$b=$a-like"*mCurrentFocus*"$b=$b.Trim()$startIndex=$b.IndexOf("{")$endIndex=$b.IndexOf("}")$pkgAndActName=[2]return$pkgAndActName}#获取当前流量统计信息FunctionGetCurrFlow(){#确保app处于激活状态$pkgAndActName=GetPkgAndActName$pkgName=[0]$activityName=[1]$userId=[0]$rets=adbshellcat/proc/net/xt_qtaguid/stats|findstr$userIdforeach{$spices=$flow+=[int]$spices[5]+[int]$spices[7]}$flow/1000}#转换文件大小单位functionConvert-Size{[cmdletbinding()]paramswitch{"Bytes"{$value=$Value}"KB"{$value=$Value*1024}"MB"{$value=$Value*1024*1024}"GB"{$value=$Value*1024*1024*1024}"TB"{$value=$Value*1024*1024*1024*1024}}switch($To){"Bytes"{return$value}"KB"{$Value=$Value/1KB}"MB"{$Value=$Value/1MB}"GB"{$Value=$Value/1GB}"TB"{$Value=$Value/1TB}}return[Math]::Round}#获取当前安卓app的启动耗时functionCalcStartUpTime(){#确保app处于激活状态$packageInfo=adbshelldumpsysactivity|findstrmFocusedActivity$regex=[regex]"s??

[本文出自天外归云的博客园]

简介

APP性能测试一般对以下几个方面进行测试:
1.启动时间(可以通过本工具测试);
2.CPU的占用(可以通过本工具测试);
3.内存的占用(可以通过本工具测试);
4.流量的耗用(可以通过本工具测试);
5.电量的耗用(用户实际使用中感知即可)。
除了可以做以上这几个专项测试外,本工具还能进行monkey测试等等。
可以结合工作需要灵活自定义脚本,封装成自己工作中常用的工具。
工具的实现是基于adb和PowerShell的,支持adb通过USB和WIFI两种方式连接手机进行操作。

前置工作

1. 需要安装adb

2. 需要本机设置PowerShell脚本运行策略

脚本示例

PowerShell例子如下(不断更新):

#获取当前app包名和活动名
FunctionGetPkgAndActName () {
    #确保app处于激活状态
    $a = adb shell dumpsys window windows|findstr Focu
    $b = $a -like "*mCurrentFocus*"
    $b = $b.Trim()
    $startIndex = $b.IndexOf("{")
    $endIndex = $b.IndexOf("}")
    $pkgAndActName = (($b.Substring($startIndex+1,$endIndex-$startIndex-1)).split(" "))[2]
    return $pkgAndActName
}
#获取当前流量统计信息
FunctionGetCurrFlow () {
    #确保app处于激活状态
    $pkgAndActName =GetPkgAndActName
    $pkgName = ($pkgAndActName.split("/"))[0]
    $activityName = ($pkgAndActName.split("/"))[1]
    $userId = (((((adb shell dumpsys package $pkgName | findstr userId).Trim()).split("="))[1]).split(" "))[0]
    $rets = adb shell cat /proc/net/xt_qtaguid/stats | findstr $userId
    foreach ($ret in $rets)
    {
        $spices = ($ret.Split(" "))
        $flow += [int]$spices[5]+[int]$spices[7]
    }
    $flow/1000
}
#转换文件大小单位
function Convert-Size {            
    [cmdletbinding()]            
    param(            
        [validateset("Bytes","KB","MB","GB","TB")]            
        [string]$From,            
        [validateset("Bytes","KB","MB","GB","TB")]            
        [string]$To,            
        [Parameter(Mandatory=$true)]          
        [double]$Value,            
        [int]$Precision = 4
    )            
    switch($From) {            
        "Bytes" {$value = $Value}            
        "KB" {$value = $Value * 1024}            
        "MB" {$value = $Value * 1024 * 1024}            
        "GB" {$value = $Value * 1024 * 1024 * 1024}            
        "TB" {$value = $Value * 1024 * 1024 * 1024 * 1024}            
    }              
    switch ($To) {            
        "Bytes" {return $value}            
        "KB" {$Value = $Value/1KB}            
        "MB" {$Value = $Value/1MB}            
        "GB" {$Value = $Value/1GB}            
        "TB" {$Value = $Value/1TB}            
    }                 
    return [Math]::Round($value,$Precision,[MidPointRounding]::AwayFromZero)        
}
#获取当前安卓app的启动耗时
functionCalcStartUpTime () {
    #确保app处于激活状态
    $packageInfo = adb shell dumpsys activity |findstr mFocusedActivity
    $regex = [regex]"s??(S*)/(S*)??s"
    $s = $regex.Matches($packageInfo).Value
    $info = $s.SubString(1,$s.Length-1)
    $packageName = $info.split("/")[0]
    $activityName = $info.split("/")[1]
    adb shell am force-stop $packageName
    $result = adb shell am start -W $info |findstr WaitTime
    $result.replace("WaitTime","当前app启动耗时")
}
#获取当前安卓app的CPU占用情况(持续20次)
functionGetAppCPU () {
    #确保app处于激活状态
    $pkgAndActName =GetPkgAndActName
    $pkgName = ($pkgAndActName.split("/"))[0]
    $count = 0
    while ($count -lt 20) {
        adb shell top -n 1 | findstr $pkgName
        Start-Sleep -Seconds 1
        $count++
    }
}
#获取当前安卓app的内存占用情况(持续20次)
functionGetAppMem () {
    #确保app处于激活状态
    $pkgAndActName =GetPkgAndActName
    $pkgName = ($pkgAndActName.split("/"))[0]
    $count = 0
    while ($count -lt 20) {
        $appUsageRAMInfo = adb shell dumpsys meminfo $pkgName | findstr "TOTAL:"
        $infoRegex = [regex]"TOTAL:s*(d)*"
        $numRegex = [regex]"(d)+"
        $appUsageRAM = $numRegex.Matches($infoRegex.Matches($appUsageRAMInfo).Value).Value
        $totalRAMInfo = (adb shell dumpsys meminfo | findstr "RAM" | findstr "Total").replace(",","")
        $totalRAM = $numRegex.Matches($totalRAMInfo).Value
        "当前app占用内存:"+$appUsageRAM+",占用率为:"+([int]$appUsageRAM/[int]$totalRAM)*100+"%"
        Start-Sleep -Seconds 1
        $count++
    }
}
#开启ADB-WIFI模式
functionAdbWifiConnect () {
    #确保手机连上usb(成功开启ADB-WIFI模式后方可以拔线)
    $ipText = adb shell ifconfig | findstr "Bcast"
    $ipInfoReg = [regex]"inet addr:s*(d)+`.(d)+`.(d)+`.(d)+"
    $ipInfo = $ipInfoReg.Matches($ipText).Value
    $ipReg = [regex]"(d)+`.(d)+`.(d)+`.(d)+"
    $ip = $ipReg.Matches($ipInfo).Value
    adb disconnect $ip
    adb tcpip 5555
    adb connect $ip
}
#重连ADB-WIFI到指定ip
functionReconnectAdbWifi () {
    $ip= Read-Host "请输入手机ip"
    adb connect $ip
}
#主程序入口
while($true){
    Write-Host "输入数字进行选择" -ForegroundColor Green
    Write-Host "1 唤醒屏幕" -ForegroundColor Yellow
    Write-Host "2 输入文字" -ForegroundColor Yellow
    Write-Host "3 触发事件" -ForegroundColor Yellow
    Write-Host "4 向上滑动" -ForegroundColor Yellow
    Write-Host "5 向下滑动" -ForegroundColor Yellow
    Write-Host "6 向左滑动" -ForegroundColor Yellow
    Write-Host "7 向右滑动" -ForegroundColor Yellow
    Write-Host "8 删除输入" -ForegroundColor Yellow
    Write-Host "9 屏幕截图" -ForegroundColor Yellow
    Write-Host "10 获取手机分辨率" -ForegroundColor Yellow
    Write-Host "11 获取手机系统版本" -ForegroundColor Yellow
    Write-Host "12 获取当前app包名和活动名" -ForegroundColor Yellow
    Write-Host "13 流量统计" -ForegroundColor Yellow
    Write-Host "14 进行简单monkey测试" -ForegroundColor Yellow
    Write-Host "15 计算当前app的启动时间" -ForegroundColor Yellow
    Write-Host "16 获取当前安卓app的CPU占用情况(持续20次)" -ForegroundColor Yellow
    Write-Host "17 获取当前安卓app的内存占用情况(持续20次)" -ForegroundColor Yellow    
    Write-Host "18 开启ADB-WIFI模式" -ForegroundColor Yellow
    Write-Host "19 重连ADB-WIFI" -ForegroundColor Yellow
    $choice = Read-Host "请选择"
    switch($choice)
    {
        1 { adb shell input keyevent 26}
        2 { $text = Read-Host "输入文字";adb shell input text $text}
        3 { $event = Read-Host "输入事件代号";adb shell input keyevent $event}
        4 { adb shell input swipe 200 800 200 100}
        5 { adb shell input swipe 200 100 200 800}
        6 { adb shell input swipe 500 100 100 100}
        7 { adb shell input swipe 100 100 500 100}
        8{
            [int]$amount = Read-Host "输入要删除的字符数量"
            for($i=0;$i -lt $amount;$i++)
            { 
                adb shell input keyevent 67
            }
        }
        9{
            $result =adb devices
            $device_id = $result[1].Split()[0]
            adb -s $device_id shell /system/bin/screencap -p /sdcard/screenshot.png
            adb -s $device_id pull /sdcard/screenshot.png d:/screenshot.png
            D:screenshot.png
        }
        10{ adb shell wm size }
        11{ adb shell getprop ro.build.version.release }
        12{
            $pkgAndActName =GetPkgAndActName
            $pkgName = ($pkgAndActName.split("/"))[0]
            $activityName = ($pkgAndActName.split("/"))[1]
            "包名:"+$pkgName
            "活动名:"+$activityName
        }
        13{
            Read-Host "按任意键开始统计"
            $startFlow =GetCurrFlow
            Write-Host "流量监控中……`n" -ForegroundColor DarkMagenta
            Read-Host "按任意键结束统计"
            $endFlow =GetCurrFlow
            $consumedFlow = [int]$endFlow-[int]$startFlow
            $consumedFlowKb = Convert-Size -From KB -To KB -Value $consumedFlow
            $consumedFlowMb = Convert-Size -From KB -To MB -Value $consumedFlow
            "共消耗流量:"+$consumedFlowKb+"kb("+$consumedFlowMb+"mb)"
        }
        14{
            $count = Read-Host "请指定随机事件数"
            $pkgAndActName =GetPkgAndActName
            $pkgName = ($pkgAndActName.split("/"))[0]
            adb shell monkey -p $pkgName -v $count
        }
        15{
            CalcStartUpTime
        }
        16{
            GetAppCPU
        }
        17{
            GetAppMem
        }
        18{
            AdbWifiConnect
        }
        19{
            ReconnectAdbWifi
        }
    }
}

可以根据实际测试过程中反复手点的过程进行组装调配。比如在反复测试登录的情况下,就要反复输入密码,如果来回用手点就比较麻烦,用这个小工具的话就非常轻松了,按一下上再敲一下回车就搞定了。

以下是进行统计指定时间内android应用流量的消耗:

用adb命令组装PowerShell实用小工具——Android测试小助手第1张

计算当前app的内存占用情况:

用adb命令组装PowerShell实用小工具——Android测试小助手第2张

退出:ctrl+c

免责声明:文章转载自《用adb命令组装PowerShell实用小工具——Android测试小助手》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇zabbix的聚合图形配置实战案例C++隐藏任务栏图标下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

必应词典使用体验及改进建议

必应词典使用体验及改进建议 一、发现的BUG 1、使用PC客户端(版本号3.5.0),因为是第一次使用必应词典,之前一直习惯用有道,有自己的生词本,以xml格式保存,这次希望通过必应词典把有道词典旧有的生词本中的内容同步到必应词典当中来,结果发生了如下的事情: 选择导入 点打开出现弹窗: 我觉得很纳闷:都是xml格式的文件,为什么有道能正确打开并解析...

阿里巴巴开源技术汇总:115个软件(四)

阿里巴巴开源技术汇总:115个软件(四) 摘要: 阿里巴巴开源技术汇总:115个软件(四)今天发布了!在前面三期中相信大家已经浏览了很多优秀的开源作品,领略到了开源的魅力。我们相信今天第四期的内容也不会令广大的读者失望的,下面让我们跟随着云栖社区一起看看在这期汇总里又会踊跃出什么优秀的作品吧! 阿里巴巴开源技术汇总:115个软件(四)今天发布了!在前...

钉钉前端开发

钉钉前端开发 钉钉一年半多,罗列一些常用的功能和网址,着重前端部分,毕竟前端开发哇。 希望有所帮助,有不足之处,希望指点下哈! 目前主要使用的是,第三方应用开发,大致感觉就是基于钉钉的H5页面,在钉钉中打开。  初步理解 先抛开钉钉官方推荐的NowaGUI开发工具,以及推荐saltUI样式库。大致理解如下。 那如果是不涉及到钉钉功能的常规H5页面,由管理员...

怎么在iPhone手机安装测试包,并且调试APP内的H5应用

安装步骤 电脑下载iTools,以Mac平台为例。iTools下载地址 使用数据线将Mac与iPhone链接 选中iTools【应用】一栏,点击下面安装按钮后,选择需要安装的ipa包即可 调试步骤 在Mac中,打开Safari浏览器,打开h5启动的项目,比如http://localhost:3000/test Safari浏览器 -> 偏...

无法创建文件夹或文件问题的解决的方法

   问题现象:我们的软件执行在Windows server 2003系统上,软件是一个接受文件软件,将接受的文件存于一个目录下,当执行到一定的时候,大概目录下有10w个文件的时候,就弹出“无法创建目录或文件”对话框,这是是我们catch到的异常。 问题原因: 可能有两种: 一、我们是不是使用了Windows server 的磁盘限额功能,限制了每一个用...

Python3网络学习案例一:Ping详解

1. 使用Ping做什么ping用于确定本地主机是否能与另一台主机成功交换(发送与接收)数据包,再根据返回的信息,就可以推断TCP/IP参数是否设置正确,以及运行是否正常、网络是否通畅等。 2. 效果CMD命令: Python程序: 3. 在验证两台主机是否能正常联通时做了什么验证的过程就像打电话一样,我们如果要知道自己能否给另一个人交流就给他打一个电...