最近学习了 Moneky 测试;试着用 Python 写了执行 Monkey 测试的脚本,下载地址androidMonkeyTest。Monkey 测试的基本概念和用法,这里就不再详细叙述了。网上已经有很多这方面的资料,比如JinZhuMonkey 测试基本操作介绍

执行 Monkey 自动化测试的前提

  1. PC 端下载 Android SDK 的 platform-tools,,并配置系统环境变量
  2. 手机端打开开发者选项中的 ABD 调试开关

自动化 Monkey 测试包括 4 个部分

  1. 获取设备,判断是否连接设备;
  2. monkey 命令的配置;
  3. 运行 monkey 测试;
  4. Monkey 测试日志的分析,判断是否存在 Crash 或 ANR 等异常。

获取设备

通过执行adb devices命令获取设备

# 执行adb命令
def call_adb(command):
    command_text = 'adb %s' % command
    print(command_text)

    result = subprocess.check_output(command_text).decode('utf')

    return result 

# 获取连接设备
def get_devices():
    command_result = call_adb("devices")
    devices = command_result.partition('\n')[2].replace('\n', '').split('\tdevice')
    return [device for device in devices if len(device) > 2]

获取 Monkey 命令参数配置

Monkey 命令参数的配置保存在yml格式的文件中。根据要配置的 APP 名称,可配置包名、随机种子seed值和执行次数count,格式如下:

APP_name:
    packageName: package_name
    seed: 2000
    count: 10000

读取配置文件command_config.yml中参数,拼接成 Monkey 命令,比如monkey -p com.*** --throttle 500 -s 2000 --ignore-timeouts --ignore-crashes --monitor-native-crashes -v -v -v 10000 > /sdcard/monkeylog.txt"

def get_monkey_command(file_name, app):
    """ get the command for monkey
    """
    monkey_command = 'monkey -p '

    file_path = os.path.join(os.getcwd() + '/monkey_config', file_name)
    file_content = load_yaml_file(file_path)

    try:
        command_config = file_content.get(app)
        monkey_command += command_config.get('packageName', 'com.***')
        monkey_command = monkey_command + ' --throttle ' + str(command_config.get('throttle', 500))
        monkey_command = monkey_command + ' -s ' + str(command_config.get('seed', 2000))
        monkey_command = monkey_command + ' --ignore-timeouts --ignore-crashes  --monitor-native-crashes -v -v -v '
        monkey_command = monkey_command + str(command_config.get('count', 10000))
        # the path of log file
        # monkey_command = monkey_command + ' > ' + '/sdcard/monkeylog.txt'
        log_file_path = os.path.abspath(os.path.join(os.getcwd(), 'log'))
        log_file_name = '\monkeyLog_'
        monkey_command = (monkey_command + ' > ' + log_file_path + log_file_name
                          + datetime.datetime.now().strftime("%Y_%m_%d_%H_%M_%S") + '.txt')

        return monkey_command
    except Exception as ex:
        print('获取monkey参数失败: %s', ex)

运行 Monkey 测试

使用adb -s 设备ID shell monkey启动手机端的 monkey

def start_monkey(file_name, app_name):
    """ start running monkey
    """
    devices = get_devices()
    if not devices:
        raise SystemExit('未获取到设备!')

    command = get_monkey_command(file_name, app_name)
    # command = 'adb -s ' + ''.join(devices) + ' shell ' + "\"" + command + "\""
    command = 'adb -s ' + ''.join(devices) + ' shell ' + command
    print(command)

    subprocess.run(command, shell=True)

命令行执行 Monkey 自动化测试脚本,命令是python monkey_test.py command_config.yml appName
配置文件command_config.yml在执行目录下,且已配置 appName 的 monkey 参数。

Monkey 测试日志的分析,判断是否存在 Crash 或 ANR 等异常

读取 Monkey 测试的日志文件,判断是否存在 Crash 或 ANR 等异常。

file_dir = os.path.join(os.getcwd(), 'log')

for log_path, dirs, log_files in os.walk(file_dir):
    for each_file in log_files:
        file_path = os.path.join(log_path, each_file)
        with fileinput.input(file_path) as log:
            for line in log:
                if re.findall("ANR", line) or re.findall("CRASH", line) or re.findall("Exception", line):
                    print(log.filename(), log.lineno(), line, end='')


↙↙↙阅读原文可查看相关链接,并与作者交流