当在一个py文件中编写的代码有很多,运行py文件的时候能够全部执行。需要将不同功能的代码封装到函数中进行维护。
定义函数的基本语法
def func_name():pass
def run_monkey():print("运行monkey 命令")# 调用函数run_monkey()
定义函数之后,一定要调用才能被执行。
def run_monkey():print("运行monkey 命令")def run_install():print("运行安装卸载测试")# 调用函数run_install()
函数的参数
定义的函数可以传递不同的参数,目的让函数的功能更加灵活
# device,package_name,count 定义不同的参数def run_monkey(device,package_name,count):# 在代码中引用参数名,参数名与定义的时候要保持一致monkey_cmd = f'adb -s {device} shell monkey -p {package_name} -vv {count}'print(monkey_cmd)def run_install():print("运行安装卸载测试")# 调用函数 如果函数中定义的有参数,必须要传递参数run_monkey("127.0.0.1:62001","org.cnodejs.android.md", 1000) # 传递给对应的参数run_monkey("127.0.0.1:62001","org.cnodejs.android.md", 2000)
函数参数的默认值
在执行测试脚本的时候,我们一般设置运行的次数为1000,那么可以在定义函数的时候使用默认值的方式来设置。
# device,package_name,count 不同参数 设置count的默认值为1000def run_monkey(device,package_name,count=1000):monkey_cmd = f'adb -s {device} shell monkey -p {package_name} -vv {count}'print(monkey_cmd)def run_install():print("运行安装卸载测试")# 调用函数 如果函数中定义的有参数,必须要传递参数run_monkey("127.0.0.1:62001","org.cnodejs.android.md") #count值不传,使用默认值run_monkey("127.0.0.1:62001","org.cnodejs.android.md", 2000) # count参数传参,回覆盖默认值
如果有默认值: 默认值的参数位置放在定义的最后。
比如上述代码,count存放的位置是在 最后位置。
函数的返回值
import osdef get_devices():# 定义空的listdevices = []# 获取设备串号 执行命令 adb devices 将打印输出的内容放到文件中os.system('adb devices > devices.txt')# 从 devices.txt 文件中获取内容with open('./devices.txt',mode='r',encoding='utf8') as file:# 获取到多行内容,数据类型为list ['List of devices attached\n', '127.0.0.1:62001\tdevice\n', '127.0.0.1:62025\tdevice\n', '127.0.0.1:62026\tdevice\n', '\n']lines = file.readlines()# 循环listfor line in lines:# 拿到每一行内容,经过大量观察分析, 如果字符串中包含 \tdevice 字符串说明 里面含有 device的设备串号if "\tdevice" in line:print(line, type(line)) # 127.0.0.1:62001 device# 从字符串中提取 127.0.0.1:62001# 1. 先将 \tdevice\n 替换为空字符串 ""device_id = line.replace("\tdevice\n","")print(f'处理之后的设备串号:{device_id}')# 将处理之后的设备串号 存到 devices 列表devices.append(device_id)# 将获取到的所有的devices信息返回出去,return devices# 因为 get_devices() 函数有返回值, devices_list 的就是 函数返回的值devices_list = get_devices()print(devices_list)
return 关键字可以将函数内部计算的结果返回出来。
加返回值一般原则:
- 如果这个函数运行的结果在其它函数中有需要可以添加返回,
- 一般返回结果是之前学习过的基本数据类型
- 数字,字符串,列表,元组,集合,字典,bool
自动化运行monkey或者安装卸载
import osdef get_devices():# 定义空的listdevices = []# 获取设备串号 执行命令 adb devices 将打印输出的内容放到文件中os.system('adb devices > devices.txt')# 从 devices.txt 文件中获取内容with open('./devices.txt',mode='r',encoding='utf8') as file:# 获取到多行内容,数据类型为list ['List of devices attached\n', '127.0.0.1:62001\tdevice\n', '127.0.0.1:62025\tdevice\n', '127.0.0.1:62026\tdevice\n', '\n']lines = file.readlines()# 循环listfor line in lines:# 拿到每一行内容,经过大量观察分析, 如果字符串中包含 \tdevice 字符串说明 里面含有 device的设备串号if "\tdevice" in line:# print(line, type(line)) # 127.0.0.1:62001 device# 从字符串中提取 127.0.0.1:62001# 1. 先将 \tdevice\n 替换为空字符串 ""device_id = line.replace("\tdevice\n","")# print(f'处理之后的设备串号:{device_id}')# 将处理之后的设备串号 存到 devices 列表devices.append(device_id)# 将获取到的所有的devices信息返回出去,return devices# device,package_name,count 不同参数 设置count的默认值为1000def run_monkey(device,package_name,count=1000):monkey_cmd = f'adb -s {device} shell monkey -p {package_name} -vv {count}'print(monkey_cmd)def run_install():print("运行安装卸载测试")# 因为 get_devices() 函数有返回值, devices_list 的就是 函数返回的值# 1. 获取所有的设备devices_list = get_devices()option = input('支持如下自动化测试:\n1.执行monkey测试\n2.安装卸载测试\n请选择测试类型[1,2]:')if option == "1":package = input("请输入运行包名:")count = input("请输入运行次数(按下Enter 使用默认值1000):")for device in devices_list:if count=="":run_monkey(device,package)else:run_monkey(device,package,count)elif option == "2":run_install()else:print('输入参数有误。拜拜!')# 调用函数 如果函数中定义的有参数,必须要传递参数# run_monkey("127.0.0.1:62001","org.cnodejs.android.md") #count值不传,使用默认值# run_monkey("127.0.0.1:62001","org.cnodejs.android.md", 2000) # count参数传参,回覆盖默认值
最终代码
import osdef get_logs_dir():"""获取项目的logs目录的绝对路径:return:"""# 文件的绝对路径abspath = os.path.abspath(__file__)# 文件的根目录root_dir = os.path.dirname(abspath)logs_dir = os.path.join(root_dir,'logs')# 如果不存在if not os.path.exists(logs_dir):os.mkdir(logs_dir)return logs_dirdef get_devices():# 定义空的listdevices = []# 获取设备串号 执行命令 adb devices 将打印输出的内容放到文件中os.system('adb devices > devices.txt')# 从 devices.txt 文件中获取内容with open('./devices.txt',mode='r',encoding='utf8') as file:# 获取到多行内容,数据类型为list ['List of devices attached\n', '127.0.0.1:62001\tdevice\n', '127.0.0.1:62025\tdevice\n', '127.0.0.1:62026\tdevice\n', '\n']lines = file.readlines()# 循环listfor line in lines:# 拿到每一行内容,经过大量观察分析, 如果字符串中包含 \tdevice 字符串说明 里面含有 device的设备串号if "\tdevice" in line:# print(line, type(line)) # 127.0.0.1:62001 device# 从字符串中提取 127.0.0.1:62001# 1. 先将 \tdevice\n 替换为空字符串 ""device_id = line.replace("\tdevice\n","")# print(f'处理之后的设备串号:{device_id}')# 将处理之后的设备串号 存到 devices 列表devices.append(device_id)# 将获取到的所有的devices信息返回出去,return devices# device,package_name,count 不同参数 设置count的默认值为1000def run_monkey(device,package_name,count=1000):# 创建monkey的日志目录logs_dir = get_logs_dir()monkey_dir = os.path.join(logs_dir,'monkey_log')# 如果不存在monkey日志目录if not os.path.exists(monkey_dir):# 创建monkey目录os.mkdir(monkey_dir)#针对不同的设备串号 生成对应文件名device_file = device.replace(":","_")# 生成日志文件的路径,日志文件放在monkey 日志文件夹下log_file = os.path.join(monkey_dir,f'{device_file}.log')monkey_cmd = f'adb -s {device} shell monkey -p {package_name} -vv {count} > {log_file}'os.system(monkey_cmd)print(f'运行设备{device}完毕,生成对应日志文件{log_file}')def run_install(device,package_name):"""运行安装卸载测试1. 先把原来安装好的包卸载2. 安装apk:param device: 设备串号:param package_name: 包名:return:"""# 创建安装卸载的日志目录logs_dir = get_logs_dir()# 定义安装卸载日志目录install_dir = os.path.join(logs_dir,'install_log')# 创建目录if not os.path.exists(install_dir):os.mkdir(install_dir)# 定义日志文件名device_id = device.replace(":","_")# 安装日志install_log_path = os.path.join(install_dir,f'{device_id}_install.log')# 卸载日志uninstall_log_path = os.path.join(install_dir,f'{device_id}_uninstall.log')uninstall_cmd = f"adb -s {device} shell pm uninstall {package_name} > {uninstall_log_path}"# 执行卸载命令os.system(uninstall_cmd)print(f"卸载完成,生成对应的日志文件:{uninstall_log_path}")apkfile = os.path.join(os.path.abspath(__file__),'../apks/app-release.apk')# 执行安装命令install_cmd=f'adb -s {device} install {apkfile} > {install_log_path}'os.system(install_cmd)print(f"安装完成,生成对应的日志文件:{install_log_path}")# 因为 get_devices() 函数有返回值, devices_list 的就是 函数返回的值# 1. 获取所有的设备devices_list = get_devices()option = input('支持如下自动化测试:\n1.执行monkey测试\n2.安装卸载测试\n请选择测试类型[1,2]:')if option == "1":package = input("请输入运行包名:")count = input("请输入运行次数(按下Enter 使用默认值1000):")for device in devices_list:if count=="":run_monkey(device,package)else:run_monkey(device,package,count)elif option == "2":package = input("请输入运行包名:")for device in devices_list:run_install(device,package)else:print('输入参数有误。拜拜!')
git仓库地址 https://gitee.com/imzack/adb_atuo.git
扩展:接口自动化测试框架
https://www.bilibili.com/video/BV1kz4y1f7Cm/
