目录
前言:
Robotium 自动遍历方案是一种使用 Robotium 进行自动化测试的方案,可以用于测试应用程序的功能性和性能。
背景
项目经常遇到混淆打包、安卓版本兼容带来的崩溃问题,还有少部分代码引起的崩溃问题。
人工验证即费时也枯燥,故琢磨有没办法可以快速的验证这些问题,最重要的是快、最重要的是快、最重要的是快
思路
- robotium 采用 Instrumentation 进行二次封装,Instrumentation 与被测应用属于同一进程,故 robotium 可以做一些想做的事情,比如启动一个 Activity
- ios 怎么办?目前我也没思路,希望知道的可以告诉我(Appium 太慢了,先不考虑)
验证点
目前只验证崩溃问题,而且初步只是验证启动 Activity 的崩溃问题,后续增加自动遍历页面所有控件的方法,亦可考虑增加 UI 版本 diff 对比
实现了吗?
实现了,亲测有效,只是还没系统的整合在一起。
只要有 Activity 挂了,robotium 就会挂,检测到挂了就导出日志
怎么检测有没挂?
- python 通过 adb 不定时监控目标应用是否在运行,如果未运行,那么导出日志,查找有没目标应用崩溃日志,有的话,那么肯定挂了
- 挂了的话,再判断所有页面都遍历完成?没有的话再组装数据,进行下一轮测试
Activity 需要传参才能打开的怎么办?
有办法,源码传什么参数,robotium 就传什么参数过去
无参数的情况
Class <?> LoginClass;
LoginClass = Class.forName("Activity路径");
Intent intent = new Intent(getActivity(), LoginClass);
getActivity().startActivity(intent);
有参数的情况
Class <?> GroupMemberClass;
GroupMemberClass = Class.forName("Activity路径");
Intent intent = new Intent(getActivity(), GroupMemberClass);
intent.putExtra("GroupId", 77);
getActivity().startActivity(intent);
传参怎么管理?
配置文件以 Activity 为节点,通过字典的形式配置好,一劳永逸,后面只需少量改动,如页面变动等等
能有多快?
预测 5 分钟内可完成 Activity 的遍历
贴一张图
目前一些已实现的节点
- 获取项目所有 Activities
- 重签名
- 本项目常用 adb 工具(后面补全,当做一个模块用)
#!/usr/bin/evn python
# -*- coding:utf-8 -*-
# FileName activities.py
# Author: HeyNiu
# Created Time: 2016/9/18
"""
获取项目所有Activity
"""
import re
import os
import utils.adbtools
import utils.consts
class Activities(object):
def __init__(self, apk_path, manifest_path):
"""
初始化
:param apk_path: apk文件路径
:param manifest_path: AndroidManifest.xml 路径
"""
self.apk_path = apk_path
self.manifest_path = manifest_path
self.dump_stream = utils.adbtools.AdbTools().dump_apk(apk_path).readlines()
self.manifest_stream = self.__read_file()
self.__init_data()
def __init_data(self):
"""
初始化apk基本信息
:return:
"""
for i in self.dump_stream:
if 'package' in i:
reg = re.compile("name='(.+?)'")
utils.consts.PACKAGE = re.findall(reg, i)[0] # 包名
reg = re.compile("versionCode='(.+?)'")
utils.consts.VERSION_CODE = re.findall(reg, i)[0] # build版本
reg = re.compile("versionName='(.+?)'")
utils.consts.VERSION_NAME = re.findall(reg, i)[0] # 版本号
if 'launchable-activity' in i:
reg = re.compile("name='(.+?)'")
utils.consts.LAUNCHER_ACTIVITY = re.findall(reg, i)[0] # 启动Activity
def __read_file(self):
"""
读取AndroidManifest.xml
:return:
"""
if o