最近学习了 Moneky 测试;试着用 Python 写了执行 Monkey 测试的脚本,下载地址androidMonkeyTest。Monkey 测试的基本概念和用法,这里就不再详细叙述了。网上已经有很多这方面的资料,比如JinZhu的Monkey 测试基本操作介绍。
自动化 Monkey 测试包括 4 个部分:
通过执行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 命令参数的配置保存在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)
使用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 等异常。
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='')