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').text
assert 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').text
assert 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').text
assert 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').text
assert result == 'Button Clicked', "按钮点击功能异常"
driver.quit()
# 启动多个appium server
def start_appium_server(port):
# 启动appium server的代码
# 启动多线程执行测试
threads = []
for i, device_info in enumerate(devices):
port = 4723 + i
thread = 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()