python+adb+monkey实现Rom稳定性测试详解
我为什么做这项工作?
其实这项工作是另一位同事在做,过程中发下了一些问题,但是种种原因log和数据都没有收集到,无法进行分析。然后我就接手了,负责复现她发现的问题并提供log和数据给开发分析。
需要测试的是一个什么样的功能?
需求是这样的:开发在Framework层增加了app应用权限管控(Android11中基本权限、自动以权限、AIDL),服务端可以通过下发指令到手机,控制app可以访问及不能访问的权限。同时安装app也需要对签名做校验。
该如何开始这项工作呢?
不用多言,自动化是必须的,但是如何实施呢? 首先,client端是需要接收指令的,是个指令不能人工操作下发,好在我们有web管理页面,通过按键精灵录屏可实现不停的向
client下发指令(本来想用selenuim,但是时间关系就使用按键精灵吧),这样就解决了后台人工不干预的需求。但是Client端呢?
因为我们做的是app的权限拦截,那就必须有app啊,我们选了30个常用的app和一些测试demo,那么问题来了,这些app的安装卸载总不能手工进行吧。答案是肯定的,可以通过python+adb install/uninstall,进行安装和卸载。安装就不说了,无非就是通过python获取apk路径然后执行adb install 命令。卸载是需要传入包名的,如何获取系统已经安装应用的包名呢? pm list package -3 + awk 命令就可以将apk的包名过滤出来了,然后在使用adb uninstall卸载就行了。到此 apk的安装卸载自动化就完成了,那么新的问题又来了
应用要使用某项权限肯定要先启动啊,如何一一的启动这些app呢?
这里可能会有人想到使用am命令,但问题是am启动应用需要知道MainActivity的名称,虽然通过工具可以一一获取到,但是这项工作未免太耗时。所以这里我们不使用am来启动应用,换成monkey启动应用,这样只需要传入包名即可。
OK,安装卸载、应用启动的思路都有了,下面就需要收集log和数据了,可以使用python函数subprocess.Popen()函数将logcat命令传入(logcat过滤log方法不再详述),这样测试过程就可以一直输入log。因为我复现的是黑屏问题,所以测试过程中还需要收集Cpu和Memory信息,同样的使用python定时执行命令dumpsys meminfo / cpuinfo来获取。
脚本执行结果:
1、第一次执行,在dump的内存信息中发现了 我们的一个本地层进程出现内存泄露,我们怀疑是这个泄露引起的黑屏,我们的开发进行了修改。
2、第二轮测试中,同样的发现了黑屏,但已经不是内存泄露引起的了,而是Binder挂了(我们修改过系统的Binder),而且只有360手机卫士和腾讯手机管家这样的安全应用在设备上长时间运行才会出现这个问题,所以选择什么样的app也需要根据功能和业务而定,不能盲目。
PS:这项测试工作我觉得是个很好的积累,所以就写下来;以后再遇到类似的可以拿出来参考。
补充知识:Shell脚本实战之生成日志文件
1.代码如下
#!/bin/bash today=$(date +%y%m%d) #the cause to use the command ls is in that to bulit a new #file,not in that the command ls. ls /usr/bin -al > $today.log
以上这篇python+adb+monkey实现Rom稳定性测试详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。
相关推荐
-
Python脚本利用adb进行手机控制的方法
一. adb 相关命令: 1. 关闭adb服务:adb kill-server 2. 启动adb服务 adb start-server 3. 查询当前运行的所有设备 adb devices 4. 可能在adb中存在多个虚拟设备运行 可以指定虚拟设备运行 -s 虚拟设备名称 5. 重启设备 adb reboot --指定虚拟设备 adb -s 设备名称 reboot 6. 查看日志 adb logcat 清除日志 adb logcat -c 7. 进入linux shell下
-
python+adb命令实现自动刷视频脚本案例
python小白第一次发博客,自己自学了一下写了一个demo,可能语法啥的不够标准,毕竟没有真正学过python 主要用到的是 import os #os包用于运行cmd命令 adb shell #这个有很多命令我们主要是模拟滑动 直接看代码吧 手机要先连接电脑打开usb调试模式 # _*_ coding:utf-8 _*_ # # @Version : 1.0 # @Time : 2019/9/10 # @Author :wang import os import time b = 0 def
-
appium+python adb常用命令分享
前言: 在appium中adb命令的使用必不可少,做android测试嘛,adb命令肯定肯定是每天都要用的啦,所以今天给特地写个博客吧! 这里就不介绍adb是什么以及怎么安装adb了,因为这些东西网上一搜一大把!没必要重写. 对于这些常用的adb命令网上也都有介绍,我这里其实就是简单汇总吧. 一.检查设备 前提:安卓设备开启开发者模式,开启usb调试 1.如何检查手机(或模拟器)是连上电脑的,在cmd输入: 二.安装app 第一步:先下载apk文件包到电脑 第二步:cmd端口输入adb inst
-
Python之使用adb shell命令启动应用的方法详解
一直有一个心愿希望可以用Python做安卓自动化功能测试,在一步步摸索中,之前是用monkeyrunner,但是发现对于控件ID的使用非常具有局限性,尤其是ID的内容不便于区分 具有重复性时,后面又发现Uiautomator可以对resorceId.text.packageName等元素进行定位,也找到了xiaochong这位大神关于uiautomator的封装包,链接如下: https://github.com/xiaocong/uiautomator 做为一个小白,这一切都需要摸索,在克服了
-
通过python调用adb命令对App进行性能测试方式
1 监听启动activity 信息命令adb shell logcat | grep START 可以查看apk包名和Activity名字 =========启动时间============ 2 冷启动(第一次启动)热启动(没有退出,第二次打开)命令 adb shell am start -W -n com.qihoo.appstore/.home.MainActivity 3 停止app命令(冷启动) adb shell am force-stop com.qihoo.appstore (热启
-
Python实现对adb命令封装
我就废话不多说了,大家还是直接看代码吧! #!/usr/bin/evn python # -*- coding:utf-8 -*- # FileName adbtools.py # Author: HeyNiu # Created Time: 2016/9/19 """ adb 工具类 """ import os import platform import re import time import utils.timetools class
-
python使用adbapi实现MySQL数据库的异步存储
之前一直在写有关scrapy爬虫的事情,今天我们看看使用scrapy如何把爬到的数据放在MySQL数据库中保存. 有关python操作MySQL数据库的内容,网上已经有很多内容可以参考了,但都是在同步的操作MySQL数据库.在数据量不大的情况下,这种方法固然可以,但是一旦数据量增长后,MySQL就会出现崩溃的情况,因为网上爬虫的速度要远远高过往数据库中插入数据的速度.为了避免这种情况发生,我们就需要使用异步的方法来存储数据,爬虫与数据存储互不影响. 为了显示方便,我们把程序设计的简单一点,只是爬
-
python+adb+monkey实现Rom稳定性测试详解
我为什么做这项工作? 其实这项工作是另一位同事在做,过程中发下了一些问题,但是种种原因log和数据都没有收集到,无法进行分析.然后我就接手了,负责复现她发现的问题并提供log和数据给开发分析. 需要测试的是一个什么样的功能? 需求是这样的:开发在Framework层增加了app应用权限管控(Android11中基本权限.自动以权限.AIDL),服务端可以通过下发指令到手机,控制app可以访问及不能访问的权限.同时安装app也需要对签名做校验. 该如何开始这项工作呢? 不用多言,自动化是必须的,但
-
通过Python实现一个A/B测试详解
目录 / 01 / AB测试 / 02 / 使用Python进行AB测试 / 03 / 数据准备 / 04 / AB测试找到最佳营销策略 / 05 / 结论 A/B测试,通过分析两种不同的营销策略,以此来选择最佳的营销策略,可以高效地将流量转化为销售额(或转化为你的预期目标). 有助于找到更好的方法来寻找客户.营销产品.扩大影响范围或将目标客户转化为实际客户. A/B测试是每个学习数据分析同学,都应该知道且去学习的概念. / 01 / AB测试 举个例子,我在短视频App上购买流量推广我的视频(
-
Python+Pytest实现压力测试详解
目录 1.程序说明 1.1 设置测试参数 1.2 初始化测试结果 1.3 定义测试函数 1.4 创建线程.执行线程.等待 1.5 计算测试结果 1.6 将测试结果写入文件 2.程序执行 2.1 直接执行 2.2 加个装饰器然后出报告 3.案例缺陷 4 完整源码 在现代Web应用程序中,性能是至关重要的.为了确保应用程序能够在高负载下正常运行,我们需要进行性能测试. 今天,应小伙伴的提问, 田辛老师来写一个Pytest进行压力测试的简单案例. 这个案例的测试网站我们就隐藏了,不过网站的基本情况是:
-
python中import reload __import__的区别详解
import 作用:导入/引入一个python标准模块,其中包括.py文件.带有__init__.py文件的目录(自定义模块). import module_name[,module1,...] from module import *|child[,child1,...] 注意:多次重复使用import语句时,不会重新加载被指定的模块,只是把对该模块的内存地址给引用到本地变量环境. 实例: pythontab.py #!/usr/bin/env python #encoding: utf-8
-
python算法与数据结构之冒泡排序实例详解
一.冒泡排序介绍 冒泡排序(英语:Bubble Sort)是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端. 二.冒泡排序原理 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对.这一步做完,最后的元素应该会是最大的数. 针对所有的
-
Python Django的安装配置教程图文详解
Django 教程 Python下有许多款不同的 Web 框架.Django是重量级选手中最有代表性的一位.许多成功的网站和APP都基于Django. Django是一个开放源代码的Web应用框架,由Python写成. Django遵守BSD版权,初次发布于2005年7月, 并于2008年9月发布了第一个正式版本1.0 . Django采用了MVC的软件设计模式,即模型M,视图V和控制器C. 学习Django前,我们要确定电脑上是否已经安装了Python,目前Python有两个版本,不过这两个版
-
python多任务之协程的使用详解
1|0使用yield完成多任务 import time def test1(): while True: print("--1--") time.sleep(0.5) yield None def test2(): while True: print("--2--") time.sleep(0.5) yield None if __name__ == "__main__": t1 = test1() t2 = test2() while True
-
python 利用pyttsx3文字转语音过程详解
这篇文章主要介绍了python 利用pyttsx3文字转语音过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 # -*- coding: utf-8 -*- import pyttsx3 engine = pyttsx3.init() with open("all.txt",'r',encoding='utf-8') as f: while 1: line = f.readline() print(line, end = '')
-
对python 操作solr索引数据的实例详解
测试代码1: def test(self): data = {"add": {"doc": {"id": "100001", "*字段名*": u"我是一个大好人"}}} params = {"boost": 1.0, "overwrite": "true", "commitWithin": 1000} ur
-
Python中生成器和迭代器的区别详解
Python中生成器和迭代器的区别(代码在Python3.5下测试): Num01–>迭代器 定义: 对于list.string.tuple.dict等这些容器对象,使用for循环遍历是很方便的.在后台for语句对容器对象调用iter()函数.iter()是python内置函数. iter()函数会返回一个定义了next()方法的迭代器对象,它在容器中逐个访问容器内的元素.next()也是python内置函数.在没有后续元素时,next()会抛出一个StopIteration异常,通知for语句
随机推荐
- JavaScript中的索引数组、关联数组和静态数组、动态数组讲解
- 怎样才能用js生成xmldom对象,并且在firefox中也实现xml数据岛?
- 详解Weex基于Vue2.0开发模板搭建
- Javascript执行效率全面总结
- dom4j创建和解析xml文档的实现方法
- 基于Python实现的扫雷游戏实例代码
- Swift中的访问控制和protected
- js鼠标滑轮滚动事件绑定的简单实例(兼容主流浏览器)
- Android滑动动态分页实现方法
- KB967723补丁造成的MYSQL在Win2003上频繁连接不上的问题的解决方法
- 基于JavaScript实现熔岩灯效果导航菜单
- 深入解析C++ STL中的常用容器
- 跟我学习javascript的异步脚本加载
- 微信小程序 label 组件详解及简单实例
- 深入学习SQL Server聚合函数算法优化技巧
- MySQL中一些常用的数据表操作语句笔记
- es7学习教程之Decorators(修饰器)详解
- php扩展ZF——Validate扩展
- C++实现动态绑定代码分享
- PHP有序表查找之二分查找(折半查找)算法示例
其他
- python二分查找算法递归
- python自动登录网站脚本
- python读取像素点灰度图
- C#把一个类型值赋给另一个类
- python挖矿脚本
- ST code 格式化
- Android Room使用详解
- phpstudy pro开启目录权限
- vue3 请求接口并展示
- 前端table表格添加序号
- vue 页面关闭事件
- java解压带密码的zip包
- asp.net mvc lodop打印控件怎么使用
- Django如何重定向有参数的url
- python导入selenium包
- vue中取出v-for绑定的item的其中一个
- GROUP_CONCAT 去重同时计数统计
- 小程序block组件
- UILabel 波浪动画
- 折叠面板 组件 vue ts 封装