ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

原创|批处理|Monkey自动测试工具批处理版

2021-11-30 23:02:34  阅读:428  来源: 互联网

标签:Monkey package 批处理 app ECHO apk 测试工具 android com


Monkey自动测试工具批处理版

背景

        多年之前,用批处理写的一个Monkey自动化测试工具,可以自动进行Monkey自动化测试;

        可以设定黑名单/白名单/随机Monkey测试,入门之作,仅供参考。

文末有完整源码获取方法




使用方法

将以下代码复制后,保存为*.bat批处理文件即可执行;或者新建一个记事本文件,将复制的代码粘贴进去,然后将文件名后缀改为*.bat,双击即可执行;

运行指南

Monkey_Test   Copyright HRD

【工具说明】
monkey测试脚本,用于Android monkey测试,默认随机进行APK测试,若指定一个包名或者多个包名,请参考如下修改方法;

1.通过更改配置文件config.conf的各项参数,来决定测试哪个APK以及测试的次数;
2.通过设置黑名单和白名单,来决定测试哪些APK;
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@


[appinfo]
appCnName=HRD		----------------------------------------APK/OS的中文名字,改成实际名字,方便识别
appEnName=HRD		----------------------------------------APK/OS的英文名字,改成实际名字,方便识别
appversion=V1.0.0	----------------------------------------APK/OS的版本号
packageName=com.mediatek.camera		------------------------APK的包名,填上实际测试的APK包名,包名获取参考【获取设备所有APK名字与包名】

packageName=
package---Name=com.android.settings	------------------------若要执行此项测试,将package和Name中间的"---"删除掉即可
package---Name=com.mediatek.camera	------------------------若要执行此项测试,将package和Name中间的"---"删除掉即可
package---Name=com.android.wallpaper	------------------------若要执行此项测试,将package和Name中间的"---"删除掉即可
package---Name=com.android.settings -p com.android.wallpaper -p com.android.calculator2 -p com.mediatek.camera		------此项为运行多个APK

BlacklistTest=1		----------------------------------------若设置为1,则会做排除黑名单的随机monkey测试
WhitelistTest=0		----------------------------------------若设置为1,则会做只测试白名单的随机monkey测试
Cycle=10000		----------------------------------------APK的循环测试次数
delay=500               ----------------------------------------每次操作间隔的时间

特别注意:
1.以上package---Name中间的"---"删除掉之后,配置文件中只能同时存在一个packageName,否则程序会出错;
2.黑名单和白名单只能同时存在一个有效的设置项,即如果BlacklistTest=1,则必须WhitelistTest=0;反之WhitelistTest=1,则必须BlacklistTest=0;如果两个都设置为有效,程序会发生未知错误;


备注:
指定测试多个包的方法:

adb shell monkey -p com.android.settings -p com.mediatek.camera -p com.android.calculator2

即packageName=XXX -p XXX -p XXX -p XXX -p XXX

上面的XXX指的是APK的包名,每多一个包名,需要在前面加上-p的参数,字母必须为小写,大写会报错;

如:
packageName=com.android.settings -p com.android.wallpaper -p com.android.calculator2 -p com.mediatek.camera



@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2.monkey测试的monkey log会按照日期\时间的格式进行保存,同一台设备多次运行monkey测试,LOG会按照当前具体时间做区分;

3.monkey测试完成后,logcat日志也会保存在同一个目录下;

4.monkey测试完成后,会进行设备截屏,便于查找及追溯问题点;



【使用方法】
a、保存脚本:拷贝Tools目录中的config.conf文件至新版本工具中的Tools目录下;

b、修改配置:修改 config.conf 中内容为你需要测试的 APP/OS 对应的信息;

c、执行脚本:双击 Monkey_Test.bat 即可;

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
【更新日志】

20170116 V1.0 初版,功能初步完成,待更新;

20170117 V1.1 更新:
1.apk包名清单按照当前日期命名;
2.未插入设备之前将不会进行任何创建LOG目录的操作;
3.新增多个配置文件为预选包名,在package和Name中间加上"---"即可进行参数注销;
4.默认设定为随机测试;
5.新增多个APK包名测试的配置文件支持;
6.统一实时信息输出格式;
7.在monkey log中增加开始和结束的时间,便于追溯;
8.修复Windows10系统下注释内容报错问题;

20170218 强制结束正在执行的monkey测试_20170218_v1.2 更新:
1.修复成功执行后不显示结果的bug;

20170414_V1.2 更新:
1.可以手动设置每次操作间隔时间,默认为500,单位为毫秒(1秒=1000毫秒);
2.修复部分bug;

20170418_v1.3 更新:
1.新增如果程序崩溃或者出现异常时,monkey测试不会停止的功能,直道达到设定次数;

20170602_v1.4 更新:
1.全面优化整体架构和提示信息;
2.新增黑名单的monkey测试,测试时在配置文件config.conf中若设置BlacklistTest=1,则进行黑名单测试,黑名单中的包名不会被测试到;
3.新增白名单的monkey测试,测试时在配置文件config.conf中若设置WhitelistTest=1,则进行白名单测试,只会测试到白名单中的包名;
4.注意事项:
黑名单和白名单只能同时存在一个有效的设置项,
即如果BlacklistTest=1,则必须WhitelistTest=0;
  反之WhitelistTest=1,则必须BlacklistTest=0;
如果两个都设置为有效,程序会发生未知错误;
5.黑名单的创建方法:创建一个blacklist.txt的文本文件,文件里每一行只能放一个包名,另一个包名必须换行;
6.白名单的创建方法:创建一个whitelist.txt的文本文件,文件里每一行只能放一个包名,另一个包名必须换行;

20170606 V2.0 更新:
1.全面重构monkey命令,防止程序中途停止;
2.monkey测试的LOG改为保存到平板内部存储:/sdcard/MonkeyLog.txt;
3.如果机器重复执行monkey测试,程序会自动检测是否存在monkeyLog,若有则以时间命名后将其备份到/sdcard/MonkeyLogBackup/目录下,便于后续查看Log;

20170613 V2.1 更新:
1.修改所有条件下的Moneky测试的Log过滤级别为2,即输出所有测试信息到MonkeyLog.txt里面;


20170614 V2.2 更新:
1.正常的MonkeyLog保存位置不变,新增Moneky error log保存位置为/sdcard/MonkeyError.txt,后面每进行一次Moneky测试都会自动备份MonkeyLog.txt和MonkeyError.txt;
2.修改触摸操作的事件总数量为50%;

20170824 V2.3 更新:
1.修复部分bug;
2.优化读取的软件版本信息;
3.新增可以循环执行monkey测试,执行完一台机器后,按任意键执行下一台,方便多台机器可以依次执行;








@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

【脚本讲解】

a、核心:Monkey命令

adb shell monkey -p %packageName% -s %c_time% --throttle 100 -v -v -v 10000
-p %packageName% 
	指定测试包名,%packageName%变量值来自文件config.conf中的packageName对应的值。
-s %c_time% 
	%c_time%为执行脚本当时的时间(小时、分、秒),以时间为值即达到随机目的,也为后续需要再模拟此次测试提供事件序列。 
--throttle 100
 	代表间隔时间,即每次操作的时间间隔,此命令的含义就是增加500ms的时间间隔。
  
-v -v -v 10000
	-v -v -v日志级别 Level 2,最详细的日志,包括了测试中选中/未选中的Activity信息。10000即执行10000次随机事件。 

核心指令2:
adb shell monkey --ignore-crashes --ignore-timeouts --kill-process-after-error --ignore-security-exceptions --throttle 1000 -v -v -v 200000


【Android获取包名的方法】

标签: it	
方法一:
adb shell pm list package -f
将获取手机内所有apk对应的包名和路径
方法二:
adb shell dumpsys window w | findstr \/ | findstr name=
先打开需要查找的apk后,再敲入以上命令
方法三:
C:\Users\Administrator>adb shell
shell@ONDA:/ $  logcat | grep Android.intent.category.LAUNCHER
方法四:
adb shell dumpsys activity > d:\log.txt
先启动需要的查找的apk,再敲入以上命令,在stack #1下查找cmp=
方法五:
C:\Users\Administrator>adb shell
shell@ONDA:/ $ logcat | grep START
先启动需要查找的apk,再敲入以上命令,找到最后一个ActivityManager
方法六:
使用aapt   
//aapt是sdk自带的一个工具,在sdk\builds-tools\目录下
1.以QQ音乐为例,命令行中切换到aapt.exe目录执行:aapt dump badging C:\Users\Administrator\Desktop\xxxxx.apk
2.运行后的结果中以下两行分别是应用包名package和入口activity名称
package: name='com.company.xxxx
launchable-activity: name='com.company.xxxx.activity.AppStarterActivity'
方法七:
查看AndroidManifest.xml
1.使用apktool反编译app:apktool d xxxxx.apk E:\apk\tmp
2.打开AndroidManifest.xml
manifest节点的package属性值是应用的包名:
查找android.intent.action.MAIN和android.intent.category.LAUNCHER对应的activity,该activity对应的android:name属性既是入口activity名称,
android.intent.action.MAIN决定应用程序最先启动的Activity
android.intent.category.LAUNCHER决定应用程序是否显示在程序列表里

附件

1.将MonkeyLog复制到当前目录下_V2.0_20170829.bat

@ECHO off

set Str=将MonkeyLog复制到当前目录下_V2.0_20170829 by Ruida

set PCpath=.\Log

title %Str%
ECHO.
ECHO       %Str%
ECHO.

dir /AD %PCpath%

:start
color 1f

ECHO 等待Android设备插入...
ECHO.
ECHO wait-for-device
ECHO.
adb wait-for-device
ECHO.
ECHO Start...
ECHO.
ECHO 已识别到Android设备...
ECHO.
ECHO 正在检查是否存在旧的Log文件,若存在将自动删除...

ECHO.

if exist %PCpath%\ rd /s /q %PCpath%\ && ECHO 正在删除旧的Log文件... && ECHO.

if not exist %PCpath% md %PCpath%

ECHO 正在复制中,请稍候...
ECHO.
title 正在复制中,请稍候...
ECHO.
adb pull /sdcard/MonkeyLogBackUp/. %PCpath%

adb pull /sdcard/MonkeyLog.txt %PCpath%

adb pull /sdcard/MonkeyError.txt %PCpath%

start %PCpath%

goto :eof




2.强制结束正在执行的monkey测试_v1.4_20171017.bat

@ECHO OFF
setlocal enabledelayedexpansion
color 0E
TITLE 强制结束正在执行的monkey测试_v1.4_20171017
ECHO.
ECHO 强制结束正在执行的monkey测试_v1.4_20171017
ECHO.
ECHO 等待设备插入...
:start
del /a/f/q shellps.log
ECHO wait-for-device
adb wait-for-device
ECHO.
ECHO Start ...
color 1F
ECHO.

:APKALL
adb shell ps>shellps.log
For /f "tokens=2 delims= " %%a in ('type shellps.log ^| find /i "com.android.commands.monkey"') do set APKPIN=%%a
echo APKPIN=%APKPIN%
ping -n 2 127.0.0.1>nul
if not defined APKPIN goto NOPIN
ECHO adb shell kill %APKPIN%
adb shell kill %APKPIN%
ECHO.[ INFO ] 操作完成...
ECHO.[ INFO ] 已成功关闭正在运行的Monkey后台进程,5S后程序自动退出...
color 2f
del /a/f/q shellps.log
timeout 1
goto :eof




:NOPIN
COLOR CF
ECHO.
ECHO.[ INFO ] 未发现Monkey后台进程,5S后程序自动退出...
ECHO.
del /a/f/q shellps.log
timeout 1
exit

3.获取设备所有的包名.bat

echo wait-for-device
adb wait-for-device
adb shell pm list package -f >apklist.log
echo read success !!!

获取结果

package:/system/priv-app/CtsShimPrivPrebuilt/CtsShimPrivPrebuilt.apk=com.android.cts.priv.ctsshim
package:/system/app/YouTube/YouTube.apk=com.google.android.youtube
package:/system/priv-app/GoogleExtServices/GoogleExtServices.apk=com.google.android.ext.services
package:/system/priv-app/TelephonyProvider/TelephonyProvider.apk=com.android.providers.telephony
package:/system/priv-app/Velvet/Velvet.apk=com.google.android.googlequicksearchbox
package:/system/priv-app/CalendarProvider/CalendarProvider.apk=com.android.providers.calendar
package:/system/priv-app/MediaProvider/MediaProvider.apk=com.android.providers.media
package:/system/priv-app/GoogleOneTimeInitializer/GoogleOneTimeInitializer.apk=com.google.android.onetimeinitializer
package:/system/app/GoogleExtShared/GoogleExtShared.apk=com.google.android.ext.shared
package:/system/priv-app/WallpaperCropper/WallpaperCropper.apk=com.android.wallpapercropper
package:/system/priv-app/DocumentsUI/DocumentsUI.apk=com.android.documentsui
package:/system/priv-app/ExternalStorageProvider/ExternalStorageProvider.apk=com.android.externalstorage
package:/system/app/HTMLViewer/HTMLViewer.apk=com.android.htmlviewer
package:/system/priv-app/MmsService/MmsService.apk=com.android.mms.service
package:/system/priv-app/DownloadProvider/DownloadProvider.apk=com.android.providers.downloads
package:/system/priv-app/ConfigUpdater/ConfigUpdater.apk=com.google.android.configupdater
package:/system/app/SoundRecorder/SoundRecorder.apk=com.android.soundrecorder
package:/system/priv-app/DefaultContainerService/DefaultContainerService.apk=com.android.defcontainer
package:/system/app/DownloadProviderUi/DownloadProviderUi.apk=com.android.providers.downloads.ui
package:/system/priv-app/Phonesky/Phonesky.apk=com.android.vending
package:/system/app/PacProcessor/PacProcessor.apk=com.android.pacprocessor
package:/system/app/CertInstaller/CertInstaller.apk=com.android.certinstaller
package:/system/app/RKUpdateService/RKUpdateService.apk=android.rockchip.update.service
package:/system/framework/framework-res.apk=android
package:/system/priv-app/Contacts/Contacts.apk=com.android.contacts
package:/system/app/Camera2/Camera2.apk=com.android.camera2
package:/system/app/EasterEgg/EasterEgg.apk=com.android.egg
package:/system/priv-app/MtpDocumentsProvider/MtpDocumentsProvider.apk=com.android.mtp
package:/system/app/Launcher3/Launcher3.apk=com.android.launcher3
package:/system/priv-app/BackupRestoreConfirmation/BackupRestoreConfirmation.apk=com.android.backupconfirm
package:/system/priv-app/StatementService/StatementService.apk=com.android.statementservice
package:/system/app/Gmail2/Gmail2.apk=com.google.android.gm
package:/system/priv-app/SetupWizard/SetupWizard.apk=com.google.android.setupwizard
package:/system/app/RkApkinstaller/RkApkinstaller.apk=com.android.apkinstaller
package:/system/priv-app/SettingsProvider/SettingsProvider.apk=com.android.providers.settings
package:/system/priv-app/SharedStorageBackup/SharedStorageBackup.apk=com.android.sharedstoragebackup
package:/system/app/Music2/Music2.apk=com.google.android.music
package:/system/app/PrintSpooler/PrintSpooler.apk=com.android.printspooler
package:/system/app/BasicDreams/BasicDreams.apk=com.android.dreams.basic
package:/system/app/RkExplorer/RkExplorer.apk=com.android.rk
package:/system/priv-app/InputDevices/InputDevices.apk=com.android.inputdevices
package:/system/priv-app/MusicFX/MusicFX.apk=com.android.musicfx
package:/system/app/Drive/Drive.apk=com.google.android.apps.docs
package:/system/app/Maps/Maps.apk=com.google.android.apps.maps
package:/system/app/WebViewGoogle/WebViewGoogle.apk=com.google.android.webview
package:/system/priv-app/Telecom/Telecom.apk=com.android.server.telecom
package:/system/app/GoogleContactsSyncAdapter/GoogleContactsSyncAdapter.apk=com.google.android.syncadapters.contacts
package:/system/app/KeyChain/KeyChain.apk=com.android.keychain
package:/system/app/Chrome/Chrome.apk=com.android.chrome
package:/system/priv-app/GooglePackageInstaller/GooglePackageInstaller.apk=com.google.android.packageinstaller
package:/system/priv-app/GmsCore/GmsCore.apk=com.google.android.gms
package:/system/priv-app/GoogleServicesFramework/GoogleServicesFramework.apk=com.google.android.gsf
package:/system/app/GoogleTTS/GoogleTTS.apk=com.google.android.tts
package:/system/priv-app/GooglePartnerSetup/GooglePartnerSetup.apk=com.google.android.partnersetup
package:/system/app/Videos/Videos.apk=com.google.android.videos
package:/system/priv-app/ProxyHandler/ProxyHandler.apk=com.android.proxyhandler
package:/system/app/LatinIME/LatinIME.apk=com.android.inputmethod.latin
package:/system/priv-app/GoogleFeedback/GoogleFeedback.apk=com.google.android.feedback
package:/system/app/GooglePrintRecommendationService/GooglePrintRecommendationService.apk=com.google.android.printservice.recommendation
package:/system/app/Photos/Photos.apk=com.google.android.apps.photos
package:/system/app/CalendarGoogle/CalendarGoogle.apk=com.google.android.calendar
package:/system/priv-app/ManagedProvisioning/ManagedProvisioning.apk=com.android.managedprovisioning
package:/system/app/MediaFloat/MediaFloat.apk=com.android.rk.mediafloat
package:/system/app/PhotoTable/PhotoTable.apk=com.android.dreams.phototable
package:/system/app/PartnerBookmarksProvider/PartnerBookmarksProvider.apk=com.android.providers.partnerbookmarks
package:/system/priv-app/GoogleLoginService/GoogleLoginService.apk=com.google.android.gsf.login
package:/system/app/WAPPushManager/WAPPushManager.apk=com.android.smspush
package:/system/app/LiveWallpapersPicker/LiveWallpapersPicker.apk=com.android.wallpaper.livepicker
package:/system/priv-app/StressTest/StressTest.apk=com.cghs.stresstest
package:/system/priv-app/GoogleBackupTransport/GoogleBackupTransport.apk=com.google.android.backuptransport
package:/system/priv-app/StorageManager/StorageManager.apk=com.android.storagemanager
package:/system/app/OpenWnn/OpenWnn.apk=jp.co.omronsoft.openwnn
package:/system/app/BookmarkProvider/BookmarkProvider.apk=com.android.bookmarkprovider
package:/system/priv-app/Settings/Settings.apk=com.android.settings
package:/system/app/Lightning/Lightning.apk=acr.browser.barebones
package:/system/app/ExactCalculator/ExactCalculator.apk=com.android.calculator2
package:/system/app/CtsShimPrebuilt/CtsShimPrebuilt.apk=com.android.cts.ctsshim
package:/system/priv-app/VpnDialogs/VpnDialogs.apk=com.android.vpndialogs
package:/system/app/Hangouts/Hangouts.apk=com.google.android.talk
package:/system/priv-app/TeleService/TeleService.apk=com.android.phone
package:/system/priv-app/Shell/Shell.apk=com.android.shell
package:/system/app/WallpaperBackup/WallpaperBackup.apk=com.android.wallpaperbackup
package:/system/priv-app/BlockedNumberProvider/BlockedNumberProvider.apk=com.android.providers.blockednumber
package:/system/app/UserDictionaryProvider/UserDictionaryProvider.apk=com.android.providers.userdictionary
package:/system/priv-app/FusedLocation/FusedLocation.apk=com.android.location.fused
package:/system/app/DeskClock/DeskClock.apk=com.android.deskclock
package:/system/priv-app/SystemUI/SystemUI.apk=com.android.systemui
package:/system/priv-app/DeviceTest/DeviceTest.apk=com.DeviceTest
package:/system/app/WallpaperPicker/WallpaperPicker.apk=com.android.wallpaperpicker
package:/system/priv-app/ContactsProvider/ContactsProvider.apk=com.android.providers.contacts
package:/system/app/CaptivePortalLogin/CaptivePortalLogin.apk=com.android.captiveportallogin
package:/system/app/RkVideoPlayer/RkVideoPlayer.apk=android.rk.RockVideoPlayer

主入口:Monkey_Test_V2.3_20181026.bat

@ECHO OFF
setlocal enableDelayedexpansion
color 1F
title Monkey自动测试脚本_Log生成到本机_V2.3_20181026 by HRD

ECHO        ==============================================================
ECHO        ******                                                  ******
ECHO        ******                 Monkey  测试工具                 ******
ECHO        *****                                                    *****
ECHO        ****                   作者:HRD                        ***
ECHO        *****                                                     ****
ECHO        ******                 版本:V2.3                       ******
ECHO        ******                                                  ******
ECHO        ******                 时间:2018.10.26                 ******
ECHO        ==============================================================

IF NOT EXIST .\Tools\config.conf GOTO EXIT
::if exist .\Tools\*.log del /f /q .\Tools\*.log

For /f "tokens=2 delims==" %%a in ('type .\Tools\config.conf ^| find /i "PackageName"') do set PackageName=%%a
For /f "tokens=2 delims==" %%a in ('type .\Tools\config.conf ^| find /i "AppCnName"') do set AppCnName=%%a
For /f "tokens=2 delims==" %%a in ('type .\Tools\config.conf ^| find /i "AppEnName"') do set AppEnName=%%a
For /f "tokens=2 delims==" %%a in ('type .\Tools\config.conf ^| find /i "AppVersion"') do set AppVersion=%%a
For /f "tokens=2 delims==" %%a in ('type .\Tools\config.conf ^| find /i "Cycle"') do set Cycle=%%a
For /f "tokens=2 delims==" %%a in ('type .\Tools\config.conf ^| find /i "Delay"') do set Delay=%%a
For /f "tokens=2 delims==" %%a in ('type .\Tools\config.conf ^| find /i "LogPath"') do set LogPath=%%a

ECHO.
ECHO 准备Monkey测试...
ECHO.
ECHO 读取config.conf中测试配置信息...
ECHO @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
ECHO.
type .\Tools\config.conf
ECHO.
ECHO @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
ECHO.
ECHO 请确认以上信息是否正确(按任意键可跳过此步骤)...
timeout 10


:start
color 1f
SET c_date=%date:~0,4%%date:~5,2%%date:~8,2%
SET c_time=%time:~0,2%
IF /i %c_time% LSS 10 ( SET c_time=0%time:~1,1% )
SET c_time=%c_time%%time:~3,2%%time:~6,2%

::SET LogFileName=%c_date%%c_time%_MonkeyLog.txt
SET LogFileName=MonkeyLog.txt

ECHO.
ECHO Monkey Log保存位置为: %LogPath%/%LogFileName%
ECHO.
ECHO Monkey Error Log保存位置为: %LogPath%/MonkeyError.txt
ECHO.

ECHO.
ECHO 等待设备插入...
ECHO wait-for-device
adb wait-for-device
ECHO.
ECHO Start ...
color 9F
adb root
ping -n 2 127.0.0.1>nul
adb root
adb remount
adb remount

set File=DeviceInfo.log

adb shell cat /system/build.prop>%File%
For /f "tokens=2 delims==" %%a in ('type %File% ^| find /i "ro.build.version.release"') do set androidOS=%%a
For /f "tokens=2 delims==" %%a in ('type %File% ^| find /i "ro.product.model"') do set model=%%a
For /f "tokens=2 delims==" %%a in ('type %File% ^| find /i "ro.product.brand"') do set brand=%%a
For /f "tokens=2 delims==" %%a in ('type %File% ^| find /i "ro.build.version.security_patch"') do set security_patch=%%a
For /f "tokens=2 delims==" %%a in ('type %File% ^| find /i "ro.build.display.id"') do set displayId=%%a
For /f "tokens=2 delims==" %%a in ('type %File% ^| find /i "ro.product.locale"') do set locale=%%a
For /f "tokens=2 delims==" %%a in ('type %File% ^| find /i "ro.build.type"') do set Mode=%%a
For /f "tokens=2 delims==" %%a in ('type %File% ^| find /i "net.bt.name"') do set bt=%%a
For /f "tokens=2 delims==" %%a in ('type %File% ^| find /i "ro.build.version.incremental"') do set OSdate=%%a


ECHO 正在读取Android设备信息...

if exist "%File%" del /f /q /a "%File%"

ECHO 读 取 日 期:%date% %time% > "%File%"
ECHO.>>"%File%"
ECHO 设备信息如下:>>"%File%"
ECHO.>>"%File%"
ECHO @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ >> "%File%"
ECHO 设 备 品 牌:  %brand%>>"%File%"
ECHO 设 备 型 号:  %model%>>"%File%"
ECHO 默 认 语 言:  %locale%>>"%File%"
ECHO 安卓 版本号:  Android %androidOS%>>"%File%"
ECHO 软件 版本号:  %displayId%>>"%File%"
ECHO OS   类  型:  %Mode%>>"%File%"
ECHO Build  日期:  %OSdate%>>"%File%"
ECHO @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ >> "%File%"

set time1=%date% %time%
ECHO.
ECHO 开始时间=%time1%
ECHO.
ECHO 开始时间=%time1% >> "%File%"
ECHO. >> "%File%"

:BackupLog
ECHO.
ECHO 正在检查是否已存在 MonkeyLog ,若存在将自动备份...
adb shell ls %LogPath%/%LogFileName% | findstr "%LogFileName%"

if %errorlevel% == 0 ( 
	adb shell ls %LogPath%/MonkeyLogBackUp/ | findstr "No such file or directory"
	if %errorlevel% == 0 ( adb shell mkdir %LogPath%/MonkeyLogBackUp/ )
	adb shell mv %LogPath%/%LogFileName% %LogPath%/MonkeyLogBackUp/.
	adb shell sleep 2
	adb shell rename %LogPath%/MonkeyLogBackUp/%LogFileName% %LogPath%/MonkeyLogBackUp/%c_date%%c_time%_MonkeyLog_BackUp.txt
	ECHO.	
	ECHO 正在检查是否已存在 Monkey错误日志 ,若存在将自动备份...
	ECHO.
	adb shell mv %LogPath%/MonkeyError.txt %LogPath%/MonkeyLogBackUp/.
	adb shell sleep 2
	adb shell rename %LogPath%/MonkeyLogBackUp/MonkeyError.txt %LogPath%/MonkeyLogBackUp/%c_date%%c_time%_MonkeyErrorBackUp.txt
	ECHO.
	ECHO 如下为已备份的所有的Monkey日志:
	adb shell ls %LogPath%/MonkeyLogBackUp/
	ECHO.
	ECHO 旧的 Monkey日志 已备份至如下目录:%LogPath%/MonkeyLogBackUp/%c_date%%c_time%_MonkeyLog_BackUp.txt
	ECHO.
	ECHO 旧的 Monkey错误日志 已备份至如下目录:%LogPath%/MonkeyLogBackUp/%c_date%%c_time%_MonkeyErrorBackUp.txt
	ECHO.
)

ECHO.
ECHO 读取设备软件版本信息...
ECHO @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
TYPE "%File%"
ECHO @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
ECHO.

adb shell rm %LogPath%/%LogFileName%

adb push "%File%" %LogPath%/.
adb shell "cat %LogPath%/%File% > %LogPath%/%LogFileName%"

if exist "%File%" del /f /q /a "%File%"





ECHO [ 正在执行...] 使用Logcat清空Phone中log...

adb logcat -c
REM ECHO. 暂停2秒...
ping -n 2 127.0.0.1>nul
ECHO.
ECHO 开始执行Monkey命令...
ECHO.
ECHO 准备测试的APK包名为=    %PackageName%   


REM :::::::::::::::::Monkey测试命令::::::::::::::::::::::::
REM ::::::::::::修改策略请仅在此区域内修改:::::::::::::::::

:checkPN
if not defined PackageName goto NOPN

ECHO 强制关闭准备测试的APK...

adb shell am force-stop %PackageName%

ECHO.
ECHO 开始进行指定APK测试,确认测试开始执行后可以断开设备...
ECHO.
ECHO 请等待程序自动完成...
ECHO.
ECHO [ 正在执行...] "adb shell monkey -p %PackageName% -s 10000 --pct-touch 50 --ignore-crashes --ignore-timeouts --kill-process-after-error --ignore-security-exceptions --throttle %Delay% -v -v -v %Cycle% 1>> %LogPath%/%LogFileName% 2> %LogPath%/MonkeyError.txt"

adb shell "monkey -p %PackageName% -s 10000 --pct-touch 50 --ignore-crashes --ignore-timeouts --kill-process-after-error --ignore-security-exceptions --throttle %Delay% -v -v -v %Cycle% 1>> %LogPath%/%LogFileName% 2> %LogPath%/MonkeyError.txt"

goto MonkeyEnd


:NOPN
ECHO.
ECHO 检测到未设置任何包名,将进行随机APK测试...

find /i "BlacklistTest=1" .\Tools\config.conf
if %errorlevel% == 0 goto BlackTest

find /i "WhiteListTest=1" .\Tools\config.conf
if %errorlevel% == 0 goto WhiteTest


ECHO.
ECHO 开始进行随机性APK测试,确认测试开始执行后可以断开设备...
ECHO.
ECHO 请等待程序自动完成...
ECHO.


ECHO "adb shell monkey --pct-touch 50 --ignore-crashes --ignore-timeouts --kill-process-after-error --ignore-security-exceptions --throttle %Delay% -v -v -v %Cycle% 1>> %LogPath%/%LogFileName% 2> %LogPath%/MonkeyError.txt"

adb shell "monkey --pct-touch 50 --ignore-crashes --ignore-timeouts --kill-process-after-error --ignore-security-exceptions --throttle %Delay% -v -v -v %Cycle% 1>> %LogPath%/%LogFileName% 2> %LogPath%/MonkeyError.txt"



:MonkeyEnd
ECHO 执行Monkey命令结束...
ECHO.


:EXIT
color 2f
ECHO.
ECHO [ 操作完成...]
ECHO.
SET time2=%date% %time%
ECHO 开始时间=%time1%
ECHO.
ECHO 终止时间=%time2%
ECHO.
ECHO 请按任意键继续执行下一台机器...
ECHO.
ECHO @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
PAUSE>nul
goto start
goto :eof


:BlackTest
ECHO 检测到已设置 [ 黑名单 ],将进行排除[ 黑名单包名 ]的随机APK测试...
if not exist .\Tools\blacklist.txt goto NoBlackList
adb push .\Tools\blacklist.txt /data/local/tmp/
if errorlevel 1 goto pushfail
ECHO.
ECHO 黑名单列表如下:
ECHO @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
TYPE .\Tools\blacklist.txt
ECHO @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
ECHO.
ECHO.
ECHO 正在进行排除[ 黑名单包名 ]的随机APK测试,确认测试开始执行后可以断开设备...
ECHO.
ECHO. 请等待程序自动完成...

ECHO "adb shell --pct-touch 50 monkey --pkg-blacklist-file /data/local/tmp/blacklist.txt --ignore-crashes --ignore-timeouts --kill-process-after-error --ignore-security-exceptions --throttle %Delay% -v -v -v %Cycle% 1>> %LogPath%/%LogFileName% 2> %LogPath%/MonkeyError.txt"


adb shell "monkey --pct-touch 50 --pkg-blacklist-file /data/local/tmp/blacklist.txt --ignore-crashes --ignore-timeouts --kill-process-after-error --ignore-security-exceptions --throttle %Delay% -v -v -v %Cycle% 1>> %LogPath%/%LogFileName% 2> %LogPath%/MonkeyError.txt"

goto MonkeyEnd


:WhiteTest
ECHO 检测到已设置 [ 白名单 ],将进行[ 只测试 白名单包名 ]的随机APK测试...
if not exist .\Tools\whitelist.txt goto NoWhiteTest
adb push .\Tools\whitelist.txt /data/local/tmp/
if errorlevel 1 goto pushfail
ECHO.
ECHO 白名单列表如下:
ECHO @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
TYPE .\Tools\whitelist.txt
ECHO @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
ECHO.
ECHO.
ECHO 正在进行[ 只测试 白名单包名 ]的随机APK测试,确认测试开始执行后可以断开设备...
ECHO.
ECHO 请等待程序自动完成...

ECHO "adb shell monkey --pct-touch 50 --pkg-whitelist-file /data/local/tmp/whitelist.txt --ignore-crashes --ignore-timeouts --kill-process-after-error --ignore-security-exceptions --throttle %Delay% -v -v -v %Cycle% 1>> %LogPath%/%LogFileName% 2> %LogPath%/MonkeyError.txt"


adb shell "monkey --pct-touch 50 --pkg-whitelist-file /data/local/tmp/whitelist.txt --ignore-crashes --ignore-timeouts --kill-process-after-error --ignore-security-exceptions --throttle %Delay% -v -v -v %Cycle% 1>> %LogPath%/%LogFileName% 2> %LogPath%/MonkeyError.txt"

goto MonkeyEnd





:NoBlackList
color cf
ECHO 未发现黑名单文件清单...
ECHO.
ECHO 请在程序.\Tools\目录下新增一个 blacklist.txt 的文本文件...
ECHO.
ECHO 请注意:文本文件中每行只能有一个包名,第二个包名需要换行...
ECHO.
ECHO 按任意键继续...
pause
goto start



:pushfail
color cf
ECHO 复制 黑名单文件/白名单文件到平板或者手机内失败...
ECHO.
ECHO 按任意键继续...
pause
goto start

:Nowhitelist.txt
color cf
ECHO 未发现 白名单 文件清单...
ECHO.
ECHO 请在程序.\Tools\目录下新增一个 whitelist.txt 的文本文件...
ECHO.
ECHO 请注意:文本文件中每行只能有一个包名,第二个包名需要换行...
ECHO.
ECHO 按任意键继续...
pause
goto start

















运行截图

 

 

 

黑名单设定内容

每行一个包名,若启用黑名单,则黑名单中的APK包名将不会被执行

 白名单设定内容

每行一个包名,若启用白名单,则只会执行白名单中的APK包名,其他的APK将不会被执行到

 config.conf文件的内容

 程序文件清单

 导出的测试日志

错误日志:MonkeyError.txt

args: [--pct-touch, 50, --ignore-crashes, --ignore-timeouts, --kill-process-after-error, --ignore-security-exceptions, --throttle, 500, -v, -v, -v, 100000000]
 arg: "--pct-touch"
 arg: "50"
 arg: "--ignore-crashes"
 arg: "--ignore-timeouts"
 arg: "--kill-process-after-error"
 arg: "--ignore-security-exceptions"
 arg: "--throttle"
 arg: "500"
 arg: "-v"
 arg: "-v"
 arg: "-v"
 arg: "100000000"
arg="--pct-touch" mCurArgData="null" mNextArg=1 argwas="--pct-touch" nextarg="50"
data="50"
arg="--ignore-crashes" mCurArgData="null" mNextArg=3 argwas="--ignore-crashes" nextarg="--ignore-timeouts"
arg="--ignore-timeouts" mCurArgData="null" mNextArg=4 argwas="--ignore-timeouts" nextarg="--kill-process-after-error"
arg="--kill-process-after-error" mCurArgData="null" mNextArg=5 argwas="--kill-process-after-error" nextarg="--ignore-security-exceptions"
arg="--ignore-security-exceptions" mCurArgData="null" mNextArg=6 argwas="--ignore-security-exceptions" nextarg="--throttle"
arg="--throttle" mCurArgData="null" mNextArg=7 argwas="--throttle" nextarg="500"
data="500"
java.io.FileNotFoundException: /data/system/theme_config/theme_compatibility.xml: open failed: ENOENT (No such file or directory)
	at libcore.io.IoBridge.open(IoBridge.java:496)
	at java.io.FileInputStream.<init>(FileInputStream.java:159)
	at java.io.FileInputStream.<init>(FileInputStream.java:115)
	at java.io.FileReader.<init>(FileReader.java:58)
	at miui.content.res.ThemeCompatibilityLoader.getVersion(ThemeCompatibilityLoader.java:108)
	at miui.content.res.ThemeCompatibilityLoader.getConfigDocumentTree(ThemeCompatibilityLoader.java:126)
	at miui.content.res.ThemeCompatibilityLoader.loadConfig(ThemeCompatibilityLoader.java:59)
	at miui.content.res.ThemeCompatibility.<clinit>(ThemeCompatibility.java:31)
	at miui.content.res.ThemeCompatibility.isThemeEnabled(ThemeCompatibility.java:111)
	at android.content.res.MiuiResourcesImpl.<clinit>(MiuiResourcesImpl.java:41)
	at android.content.res.Resources.<init>(Resources.java:285)
	at android.content.res.MiuiResources.<init>(MiuiResources.java:49)
	at android.content.res.Resources.getSystem(Resources.java:206)
	at android.util.MiuiMultiWindowAdapter.<clinit>(MiuiMultiWindowAdapter.java:79)
	at android.view.Display.getWidth(Display.java:745)
	at com.android.commands.monkey.MonkeySourceRandom.randomPoint(MonkeySourceRandom.java:330)
	at com.android.commands.monkey.MonkeySourceRandom.generatePointerEvent(MonkeySourceRandom.java:270)
	at com.android.commands.monkey.MonkeySourceRandom.generateEvents(MonkeySourceRandom.java:405)
	at com.android.commands.monkey.MonkeySourceRandom.getNextEvent(MonkeySourceRandom.java:494)
	at com.android.commands.monkey.Monkey.runMonkeyCycles(Monkey.java:1215)
	at com.android.commands.monkey.Monkey.run(Monkey.java:708)
	at com.android.commands.monkey.Monkey.main(Monkey.java:568)
	at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
	at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:380)
Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory)
	at libcore.io.Linux.open(Native Method)
	at libcore.io.ForwardingOs.open(ForwardingOs.java:167)
	at libcore.io.BlockGuardOs.open(BlockGuardOs.java:252)
	at libcore.io.IoBridge.open(IoBridge.java:482)
	... 23 more
// CRASH: com.android.vending (pid 12112)
// Short Msg: java.lang.SecurityException
// Long Msg: java.lang.SecurityException: Remote stack trace:
	at com.android.server.content.ContentService.registerContentObserver(ContentService.java:344)
	at android.content.IContentService$Stub.onTransact(IContentService.java:514)
	at android.os.Binder.execTransactInternal(Binder.java:1021)
	at android.os.Binder.execTransact(Binder.java:994)

// Build Label: xiaomi/ginkgo/ginkgo:10/QKQ1.200114.002/V12.0.3.0.QCOCNXM:user/release-keys
// Build Changelist: V12.0.3.0.QCOCNXM
// Build Time: 1605613349000
// java.lang.RuntimeException: Unable to create application com.google.android.finsky.application.classic.ClassicProdApplication: java.lang.RuntimeException: Failed to load configurations for FinskyApp
// 	at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6589)
// 	at android.app.ActivityThread.access$1400(ActivityThread.java:226)
// 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1889)
// 	at android.os.Handler.dispatchMessage(Handler.java:107)
// 	at android.os.Looper.loop(Looper.java:225)
// 	at android.app.ActivityThread.main(ActivityThread.java:7564)
// 	at java.lang.reflect.Method.invoke(Native Method)
// 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
// 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
// Caused by: java.lang.RuntimeException: Failed to load configurations for FinskyApp
// 	at dzz.aB(PG:17)
// 	at dzz.aA(PG:17)
// 	at dzz.ab(PG:2)
// 	at ecd.onCreate(PG:3)
// 	at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1190)
// 	at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6584)
// 	... 8 more
// Caused by: java.util.concurrent.ExecutionException: java.lang.SecurityException: Failed to find provider com.google.android.gsf.gservices for user 0; expected to find a valid ContentProvider for this authority
// 	at atcl.a(PG:3)
// 	at atcl.get(PG:9)
// 	at atfm.a(PG:1)
// 	at dzz.aB(PG:16)
// 	... 13 more
// Caused by: java.lang.SecurityException: Failed to find provider com.google.android.gsf.gservices for user 0; expected to find a valid ContentProvider for this authority
// 	at android.os.Parcel.createException(Parcel.java:2074)
// 	at android.os.Parcel.readException(Parcel.java:2042)
// 	at android.os.Parcel.readException(Parcel.java:1990)
// 	at android.content.IContentService$Stub$Proxy.registerContentObserver(IContentService.java:1336)
// 	at android.content.ContentResolver.registerContentObserver(ContentResolver.java:2279)
// 	at android.content.ContentResolver.registerContentObserver(ContentResolver.java:2267)
// 	at ammu.b(PG:2)
// 	at ammu.b(PG:6)
// 	at aqln.<init>(Unknown Source:5)
// 	at aqlo.a(PG:6)
// 	at eae.a(Unknown Source:75)
// 	at auzv.run(Unknown Source:2)
// 	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:462)
// 	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
// 	at auzx.run(PG:2)
// 	at auzz.run(Unknown Source:12)
// 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
// 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
// 	at adtq.run(Unknown Source:7)
// 	at java.lang.Thread.run(Thread.java:919)
// Caused by: android.os.RemoteException: Remote stack trace:
// 	at com.android.server.content.ContentService.registerContentObserver(ContentService.java:344)
// 	at android.content.IContentService$Stub.onTransact(IContentService.java:514)
// 	at android.os.Binder.execTransactInternal(Binder.java:1021)
// 	at android.os.Binder.execTransact(Binder.java:994)
// 
// 

运行日志:MonkeyLog.txt

今日美图

 

 

 

Monkey自动测试工具批处理版

完整源码下载地址

链接:https://pan.baidu.com/s/1NfsRnzfEQvriOrztBDm5vQ 
提取码:2byf

标签:Monkey,package,批处理,app,ECHO,apk,测试工具,android,com
来源: https://blog.csdn.net/zh6526157/article/details/121639131

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有