当在一个py文件中编写的代码有很多,运行py文件的时候能够全部执行。需要将不同功能的代码封装到函数中进行维护。

定义函数的基本语法

  1. def func_name():
  2. pass
  1. def run_monkey():
  2. print("运行monkey 命令")
  3. # 调用函数
  4. run_monkey()

定义函数之后,一定要调用才能被执行。

  1. def run_monkey():
  2. print("运行monkey 命令")
  3. def run_install():
  4. print("运行安装卸载测试")
  5. # 调用函数
  6. run_install()

函数的参数

定义的函数可以传递不同的参数,目的让函数的功能更加灵活

  1. # device,package_name,count 定义不同的参数
  2. def run_monkey(device,package_name,count):
  3. # 在代码中引用参数名,参数名与定义的时候要保持一致
  4. monkey_cmd = f'adb -s {device} shell monkey -p {package_name} -vv {count}'
  5. print(monkey_cmd)
  6. def run_install():
  7. print("运行安装卸载测试")
  8. # 调用函数 如果函数中定义的有参数,必须要传递参数
  9. run_monkey("127.0.0.1:62001","org.cnodejs.android.md", 1000) # 传递给对应的参数
  10. run_monkey("127.0.0.1:62001","org.cnodejs.android.md", 2000)

函数参数的默认值

在执行测试脚本的时候,我们一般设置运行的次数为1000,那么可以在定义函数的时候使用默认值的方式来设置。

  1. # device,package_name,count 不同参数 设置count的默认值为1000
  2. def run_monkey(device,package_name,count=1000):
  3. monkey_cmd = f'adb -s {device} shell monkey -p {package_name} -vv {count}'
  4. print(monkey_cmd)
  5. def run_install():
  6. print("运行安装卸载测试")
  7. # 调用函数 如果函数中定义的有参数,必须要传递参数
  8. run_monkey("127.0.0.1:62001","org.cnodejs.android.md") #count值不传,使用默认值
  9. run_monkey("127.0.0.1:62001","org.cnodejs.android.md", 2000) # count参数传参,回覆盖默认值

如果有默认值: 默认值的参数位置放在定义的最后。
比如上述代码,count存放的位置是在 最后位置。

函数的返回值

  1. import os
  2. def get_devices():
  3. # 定义空的list
  4. devices = []
  5. # 获取设备串号 执行命令 adb devices 将打印输出的内容放到文件中
  6. os.system('adb devices > devices.txt')
  7. # 从 devices.txt 文件中获取内容
  8. with open('./devices.txt',mode='r',encoding='utf8') as file:
  9. # 获取到多行内容,数据类型为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']
  10. lines = file.readlines()
  11. # 循环list
  12. for line in lines:
  13. # 拿到每一行内容,经过大量观察分析, 如果字符串中包含 \tdevice 字符串说明 里面含有 device的设备串号
  14. if "\tdevice" in line:
  15. print(line, type(line)) # 127.0.0.1:62001 device
  16. # 从字符串中提取 127.0.0.1:62001
  17. # 1. 先将 \tdevice\n 替换为空字符串 ""
  18. device_id = line.replace("\tdevice\n","")
  19. print(f'处理之后的设备串号:{device_id}')
  20. # 将处理之后的设备串号 存到 devices 列表
  21. devices.append(device_id)
  22. # 将获取到的所有的devices信息返回出去,
  23. return devices
  24. # 因为 get_devices() 函数有返回值, devices_list 的就是 函数返回的值
  25. devices_list = get_devices()
  26. print(devices_list)

return 关键字可以将函数内部计算的结果返回出来。
加返回值一般原则:

  1. 如果这个函数运行的结果在其它函数中有需要可以添加返回,
  2. 一般返回结果是之前学习过的基本数据类型
    1. 数字,字符串,列表,元组,集合,字典,bool

自动化运行monkey或者安装卸载

  1. import os
  2. def get_devices():
  3. # 定义空的list
  4. devices = []
  5. # 获取设备串号 执行命令 adb devices 将打印输出的内容放到文件中
  6. os.system('adb devices > devices.txt')
  7. # 从 devices.txt 文件中获取内容
  8. with open('./devices.txt',mode='r',encoding='utf8') as file:
  9. # 获取到多行内容,数据类型为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']
  10. lines = file.readlines()
  11. # 循环list
  12. for line in lines:
  13. # 拿到每一行内容,经过大量观察分析, 如果字符串中包含 \tdevice 字符串说明 里面含有 device的设备串号
  14. if "\tdevice" in line:
  15. # print(line, type(line)) # 127.0.0.1:62001 device
  16. # 从字符串中提取 127.0.0.1:62001
  17. # 1. 先将 \tdevice\n 替换为空字符串 ""
  18. device_id = line.replace("\tdevice\n","")
  19. # print(f'处理之后的设备串号:{device_id}')
  20. # 将处理之后的设备串号 存到 devices 列表
  21. devices.append(device_id)
  22. # 将获取到的所有的devices信息返回出去,
  23. return devices
  24. # device,package_name,count 不同参数 设置count的默认值为1000
  25. def run_monkey(device,package_name,count=1000):
  26. monkey_cmd = f'adb -s {device} shell monkey -p {package_name} -vv {count}'
  27. print(monkey_cmd)
  28. def run_install():
  29. print("运行安装卸载测试")
  30. # 因为 get_devices() 函数有返回值, devices_list 的就是 函数返回的值
  31. # 1. 获取所有的设备
  32. devices_list = get_devices()
  33. option = input('支持如下自动化测试:\n1.执行monkey测试\n2.安装卸载测试\n请选择测试类型[1,2]:')
  34. if option == "1":
  35. package = input("请输入运行包名:")
  36. count = input("请输入运行次数(按下Enter 使用默认值1000):")
  37. for device in devices_list:
  38. if count=="":
  39. run_monkey(device,package)
  40. else:
  41. run_monkey(device,package,count)
  42. elif option == "2":
  43. run_install()
  44. else:
  45. print('输入参数有误。拜拜!')
  46. # 调用函数 如果函数中定义的有参数,必须要传递参数
  47. # run_monkey("127.0.0.1:62001","org.cnodejs.android.md") #count值不传,使用默认值
  48. # run_monkey("127.0.0.1:62001","org.cnodejs.android.md", 2000) # count参数传参,回覆盖默认值

最终代码

  1. import os
  2. def get_logs_dir():
  3. """
  4. 获取项目的logs目录的绝对路径
  5. :return:
  6. """
  7. # 文件的绝对路径
  8. abspath = os.path.abspath(__file__)
  9. # 文件的根目录
  10. root_dir = os.path.dirname(abspath)
  11. logs_dir = os.path.join(root_dir,'logs')
  12. # 如果不存在
  13. if not os.path.exists(logs_dir):
  14. os.mkdir(logs_dir)
  15. return logs_dir
  16. def get_devices():
  17. # 定义空的list
  18. devices = []
  19. # 获取设备串号 执行命令 adb devices 将打印输出的内容放到文件中
  20. os.system('adb devices > devices.txt')
  21. # 从 devices.txt 文件中获取内容
  22. with open('./devices.txt',mode='r',encoding='utf8') as file:
  23. # 获取到多行内容,数据类型为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']
  24. lines = file.readlines()
  25. # 循环list
  26. for line in lines:
  27. # 拿到每一行内容,经过大量观察分析, 如果字符串中包含 \tdevice 字符串说明 里面含有 device的设备串号
  28. if "\tdevice" in line:
  29. # print(line, type(line)) # 127.0.0.1:62001 device
  30. # 从字符串中提取 127.0.0.1:62001
  31. # 1. 先将 \tdevice\n 替换为空字符串 ""
  32. device_id = line.replace("\tdevice\n","")
  33. # print(f'处理之后的设备串号:{device_id}')
  34. # 将处理之后的设备串号 存到 devices 列表
  35. devices.append(device_id)
  36. # 将获取到的所有的devices信息返回出去,
  37. return devices
  38. # device,package_name,count 不同参数 设置count的默认值为1000
  39. def run_monkey(device,package_name,count=1000):
  40. # 创建monkey的日志目录
  41. logs_dir = get_logs_dir()
  42. monkey_dir = os.path.join(logs_dir,'monkey_log')
  43. # 如果不存在monkey日志目录
  44. if not os.path.exists(monkey_dir):
  45. # 创建monkey目录
  46. os.mkdir(monkey_dir)
  47. #针对不同的设备串号 生成对应文件名
  48. device_file = device.replace(":","_")
  49. # 生成日志文件的路径,日志文件放在monkey 日志文件夹下
  50. log_file = os.path.join(monkey_dir,f'{device_file}.log')
  51. monkey_cmd = f'adb -s {device} shell monkey -p {package_name} -vv {count} > {log_file}'
  52. os.system(monkey_cmd)
  53. print(f'运行设备{device}完毕,生成对应日志文件{log_file}')
  54. def run_install(device,package_name):
  55. """
  56. 运行安装卸载测试
  57. 1. 先把原来安装好的包卸载
  58. 2. 安装apk
  59. :param device: 设备串号
  60. :param package_name: 包名
  61. :return:
  62. """
  63. # 创建安装卸载的日志目录
  64. logs_dir = get_logs_dir()
  65. # 定义安装卸载日志目录
  66. install_dir = os.path.join(logs_dir,'install_log')
  67. # 创建目录
  68. if not os.path.exists(install_dir):
  69. os.mkdir(install_dir)
  70. # 定义日志文件名
  71. device_id = device.replace(":","_")
  72. # 安装日志
  73. install_log_path = os.path.join(install_dir,f'{device_id}_install.log')
  74. # 卸载日志
  75. uninstall_log_path = os.path.join(install_dir,f'{device_id}_uninstall.log')
  76. uninstall_cmd = f"adb -s {device} shell pm uninstall {package_name} > {uninstall_log_path}"
  77. # 执行卸载命令
  78. os.system(uninstall_cmd)
  79. print(f"卸载完成,生成对应的日志文件:{uninstall_log_path}")
  80. apkfile = os.path.join(os.path.abspath(__file__),'../apks/app-release.apk')
  81. # 执行安装命令
  82. install_cmd=f'adb -s {device} install {apkfile} > {install_log_path}'
  83. os.system(install_cmd)
  84. print(f"安装完成,生成对应的日志文件:{install_log_path}")
  85. # 因为 get_devices() 函数有返回值, devices_list 的就是 函数返回的值
  86. # 1. 获取所有的设备
  87. devices_list = get_devices()
  88. option = input('支持如下自动化测试:\n1.执行monkey测试\n2.安装卸载测试\n请选择测试类型[1,2]:')
  89. if option == "1":
  90. package = input("请输入运行包名:")
  91. count = input("请输入运行次数(按下Enter 使用默认值1000):")
  92. for device in devices_list:
  93. if count=="":
  94. run_monkey(device,package)
  95. else:
  96. run_monkey(device,package,count)
  97. elif option == "2":
  98. package = input("请输入运行包名:")
  99. for device in devices_list:
  100. run_install(device,package)
  101. else:
  102. print('输入参数有误。拜拜!')

git仓库地址 https://gitee.com/imzack/adb_atuo.git


扩展:接口自动化测试框架
https://www.bilibili.com/video/BV1kz4y1f7Cm/