pytest多线程与多设备并发appium
使用adb获取应用的内存和CPU使用情况
import pytest
import subprocess# 测试用例:检查应用的内存使用情况
def test_memory_usage():package_name = 'com.example.myapp'memory_info = subprocess.check_output(['adb', 'shell', 'dumpsys', 'meminfo', package_name]).decode('utf-8')memory_usage = int(memory_info.split('TOTAL')[1].split()[0])assert memory_usage < 1000000, "内存使用超过阈值"# 测试用例:检查应用的CPU占用情况
def test_cpu_usage():package_name = 'com.example.myapp'cpu_info = subprocess.check_output(['adb', 'shell', 'top', '-n', '1', '-m', '10', '-s', 'cpu', '|', 'grep', package_name]).decode('utf-8')cpu_usage = float(cpu_info.split()[2])assert cpu_usage < 50, "CPU占用超过阈值"
在上面的更新后的示例代码中,我们使用了subprocess模块来调用adb命令获取应用的内存和CPU使用情况。在test_memory_usage函数中,我们使用adb shell dumpsys meminfo
命令获取应用的内存信息,并提取出总内存使用量。在test_cpu_usage函数中,我们使用adb shell top
命令获取应用的CPU占用信息,并提取出CPU使用率。最后,我们对内存和CPU使用情况进行断言判断。
top是一个Linux/Unix系统上的命令,用于实时显示系统中运行的进程的信息,包括进程的PID(进程ID)、用户、CPU占用率、内存占用等。在Android平台上,也可以通过adb shell top命令来查看系统中运行的进程信息。
-n 1:指定top命令只运行一次,显示一次进程信息后就退出。
-m 10:指定top命令只显示前10个CPU占用率最高的进程。
-s:按照CPU占用率进行排序,显示CPU占用率最高的进程在前面。
通过执行adb shell top -n 1 -m 10 -s命令,可以查看当前设备上CPU占用率最高的前10个进程,以便及时发现CPU占用率过高的情况。
appium和python实现单设备的app自动化测试,并通过pytest编写测试用例进行自动化测试
import pytest
from appium import webdriver# 启动appium server,占用端口4723
# 电脑与一个设备连接,通过adb devices获取已连接的设备# 定义启动参数
desired_caps = {'platformName': 'Android','deviceName': 'device_name','appPackage': 'com.example.myapp','appActivity': '.MainActivity'
}# 初始化driver
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)# 测试用例:检查应用的标题
def test_app_title():title = driver.find_element_by_id('com.example.myapp:id/title').textassert title == 'My App', "应用标题不匹配"# 测试用例:检查按钮点击功能
def test_button_click():button = driver.find_element_by_id('com.example.myapp:id/button')button.click()result = driver.find_element_by_id('com.example.myapp:id/result').textassert result == 'Button Clicked', "按钮点击功能异常"# 关闭driver
driver.quit()
在上面的示例代码中,我们使用appium的webdriver模块初始化了一个driver对象,连接到appium server。然后编写了两个测试用例,分别检查应用的标题和按钮点击功能。最后在每个测试用例中,通过driver对象来查找元素并执行相应的操作。最后关闭driver对象。
管理设备池、启动多个appium server、使用多线程执行pytest
以下是一个示例代码,演示如何通过管理设备池、启动多个appium server、使用多线程执行pytest来实现多设备并发测试。
示例代码中,我们定义了一个设备信息列表devices
,包含了两个设备的信息。然后通过多线程的方式启动多个appium server,并执行测试用例。在每个线程中,通过不同的设备信息初始化driver对象,并执行测试用例。最后通过thread.join()
等待所有线程执行完毕。
import pytest
from appium import webdriver
import threading# 定义设备信息列表
devices = [{'platformName': 'Android','deviceName': 'device1','appPackage': 'com.example.myapp','appActivity': '.MainActivity'},{'platformName': 'Android','deviceName': 'device2','appPackage': 'com.example.myapp','appActivity': '.MainActivity'}
]# 定义测试用例
def run_test(device_info):driver = webdriver.Remote('http://localhost:4723/wd/hub', device_info)# 测试用例:检查应用的标题def test_app_title():title = driver.find_element_by_id('com.example.myapp:id/title').textassert title == 'My App', "应用标题不匹配"# 测试用例:检查按钮点击功能def test_button_click():button = driver.find_element_by_id('com.example.myapp:id/button')button.click()result = driver.find_element_by_id('com.example.myapp:id/result').textassert result == 'Button Clicked', "按钮点击功能异常"driver.quit()# 启动多个appium server
def start_appium_server(port):# 启动appium server的代码# 启动多线程执行测试
threads = []
for i, device_info in enumerate(devices):port = 4723 + ithread = threading.Thread(target=start_appium_server, args=(port,))thread.start()threads.append(thread)for i, device_info in enumerate(devices):thread = threading.Thread(target=run_test, args=(device_info,))thread.start()threads.append(thread)for thread in threads:thread.join()