python+uiautomator2+pytest marco de prueba automatizado (3)
Propósito Resolver la operación de múltiples dispositivos, múltiples dispositivos paralelos y múltiples casos de uso al mismo tiempo
1. Modificar conftest.py
El dispositivo de inicialización ha sido modificado, juzgado de acuerdo con los dispositivos conectados y pasado al proceso correspondiente
#初始化设备
@pytest.fixture(scope="session", autouse=True)
def driver(tmp_path_factory, worker_id):
devices_list = drivers.android.devices()
if not devices_list:
raise
global device
if worker_id == "master":
log.info('单台测试')
device = drivers.android.device_android(devices_list[0])
return device
root_tmp_dir = tmp_path_factory.getbasetemp().parent
fn = root_tmp_dir / "devices.json"
log.info(type(fn))
log.info(fn)
log.info(fn.is_file())
log.info('fn.is_file()')
with FileLock(str(fn) + ".lock"):
log.info(fn.is_file())
if fn.is_file():
devices_ls = fn.read_text()
if not devices_ls:
return Exception('No Device')
device_serial, devices_l = _devices_list_pop(devices_ls)
device = drivers.android.device_android(device_serial)
fn.write_text(
str(devices_l)
)
else:
device = drivers.android.device_android(devices_list[0])
devices_list.pop(0)
fn.write_text(str(devices_list))
log.info(device)
return device
def _devices_list_pop(dl):
d = dl[1:-1].replace("'", '').strip().split(', ')
ds = d[0]
d.pop(0)
return ds, d
2. Vuelva a escribir el archivo lib/func.py
Compruebe si existe el atributo del dispositivo y bloquee el proceso
import _ctypes
import os
import re
import threading
from filelock import FileLock
from lib.loggers import log
import time
def think_time(func):
def thinktime(*args, **kwargs):
time.sleep(1)
return func(*args, **kwargs)
time.sleep(1)
return thinktime
#进程加锁
class GetDevice(object):
_instance_lock = threading.Lock()
def __init__(self):
time.sleep(0.5)
@classmethod
#检查是否存在device属性
def instance(cls, *args, **kwargs):
if not hasattr(GetDevice, "_device"):
GetDevice._device = str(*args)
return _ctypes.PyObj_FromPtr(int(GetDevice._device))
def _device_lock(self):
fn = "./drivers/devices.json"
lock = FileLock(fn + ".lock")
with lock:
if os.path.isfile(fn):
open(fn, ).read_text()
else:
driver = [1, 2, 3]
driver_s = str(id(driver[0]))
open(fn, 'a').write(driver_s)
3. Cambiar controladores/android.py
Modifique la inicialización y obtenga varios dispositivos, busque excepciones
def device_android(d_id = 1) -> u2.Device:
log.info(d_id)
if isinstance(d_id, int):
return u2.connect()
else:
return u2.connect(d_id)
def devices():
a = os.popen('adb devices').readlines()
if len(a) >= 2:
dl = [i.split('\t')[0] for i in a if '\t' in i]
else:
dl = 'adb 异常,未获取到设备'
return dl
4, Pytest.ini
Agregar declaración de ejecución de grupo de casos multiproceso y multiuso
addopts = -v -s -n 3 --dist loadfile --html=./report/report.html --self-contained-html