51Testing软件测试论坛

标题: 利用模拟器全自动检测 APP 在全 Android 版本上是否会首屏闪退 [打印本页]

作者: 测试的味道    时间: 2017-5-27 13:57
标题: 利用模拟器全自动检测 APP 在全 Android 版本上是否会首屏闪退
本帖最后由 测试的味道 于 2017-5-27 14:16 编辑

用途:作为最基本的常规测试,全自动,用模拟器,4.4-7.0,开发包/混淆后的包会不会首屏闪退
会提到的小技术:
为什么做这个Appetizer质量监控对APK进行DEX代码插桩,然后插装包运行时能监控质量(crash, http,卡顿等等),DEX代码插桩是一个很底层的技术,大家有个疑问,插桩后会不会闪退啊,你们怎么确保这个事情的。我们的流程是这样的:
全自动管理一堆模拟器一般大家都用Android Studio,点击AVD Manager,额然后。。。 不,我们要全自动化
看一下所有Android工具链都是可以命令行执行的,从安装系统镜像,到造一个模拟器配置,到创建sd卡,到启动emulator,因为Google内部,也有一套类似我们的全自动模拟器headless链。但是!但是!这套命令行特别难用,每次都要看一遍文档,所以我做了个包装。

Headless Android Emulator Manager (haem)Terminology:
  1.   Headless Android Emulator Manager (haem)
  2. Terminology:  只要记住四个概念
  3. target - something like android-19 android-23 目标平台,比如android-19, android-23
  4. abi - x86 x86_64 armeabi-v7a or arm64-v8 ABI,就是x86还是ARM,就这四种选择
  5. avd - an arbitrary name for an Android Virtual Device (AVD)  模拟器配置名
  6. port - every emulator listens on a local port, which can be inferred from its adb serialno, e.g., emulator-5444 模拟器的端口,比如emulator-5444端口对应就是5444
  7. Usage: haem.py [OPTIONS] COMMAND [ARGS]... 好了,很简单,命令,参数和git一样

  8. Options:
  9.   --help  Show this message and exit.

  10. Commands:
  11.   check  确认你的环境能否跑模拟器,没有参数
  12.   create 创建一个模拟器配置 参数 AVD TARGET 见上
  13.   delete 删除一个模拟器配置 参数  AVD
  14.   install 安装一个TARGET
  15.   list 列举现在已经创建的模拟器配置
  16.   running 用adb devices报告现在运行的模拟器
  17.   start 启动模拟器 参数AVD
  18.   stop 停止模拟器 参数PORT

  19. 如果对细节感兴趣的,看看这个的代码就知道了,Python的,都是stackoverflow上行之有效的方法(比如好好退出我找了一阵子)

  20. 有了这个,一个脚本启动一麻袋模拟器(要记得自己的内存)
复制代码
怎么全自动检测APP安装后首屏启动有没有闪退
  1. 这个,有些坑
  2. 安装

  3. adb安装再普通不过了,注意了,>=21(5.0)的时候要动态授权,所以最好在安装时用上-g,代码如下,不翻译了

  4. # d 是设备串号,outpath是apk路径
  5. opts = "-g " if int(apilevel) >= 21 else "" # grant all runtime permissions for api>=21
  6. install_info = subprocess.check_output('adb -s %s install %s%s' % (d, opts, outpath), shell=True)

  7. 安装可能失败,找install_info里面有没有Failure
  8. 启动

  9. 清了logcat再启动,这个Monkey命令就帮你省了activity名(很多人会用am)

  10. # stage 2.2: clear logcat
  11. subprocess.call('adb -s %s logcat -c' % (d, ), shell=True)
  12. # launch it
  13. subprocess.call("adb -s %s shell monkey -p %s 1" % (d, pkg), shell=True)

  14. 启动后12秒一般就够了,然后抓回来logcat,-d打印到屏幕走人

  15. logcat_info = subprocess.check_output('adb -s %s logcat -d' % (d, ), shell=True)
复制代码

  1. 检测有没有闪退

  2. 先贴代码

  3. # d是设备串号,pkg是apk的包名
  4. wininfo = subprocess.check_output('adb -s %s shell dumpsys window windows' % (d, ), shell=True)
  5. # stage 2.4: check if the app activity is focused
  6. launched = False
  7. for l in wininfo.splitlines():
  8.     if 'mCurrentFocus' in l and 'Application Error' in l:
  9.         launched = False
  10.         break
  11.     if 'mCurrentFocus' in l or 'mFocusedApp' in l:
  12.         launched = launched or pkg in l
复制代码
首先 dumpsys window windows这个命令会输出目前系统一层层的窗口层次(比如有launcher,弹出框什么的),不详细解释了,有兴趣的可以去看一下,比较直观
重点是mCurrentFocus(当前最上面的那个框)和mFocusedApp(当前最上面的那个APP)
有几种可能:
后记
作者: 梦想家    时间: 2017-5-27 15:08

作者: 芭比哇玩123    时间: 2017-5-27 16:20

作者: 测试的味道    时间: 2017-5-27 16:22

作者: jingzizx    时间: 2017-5-28 18:11





欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2