python+uiautomator2+pytest自動テストフレームワーク (3)
目的 複数のデバイスの操作、複数のデバイスの並列処理、および複数のユースケースを同時に解決します。
1.conftest.pyを変更する
初期化デバイスが変更され、接続されているデバイスに応じて判断され、対応するプロセスに渡されました。
#初始化设备
@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. lib/func.py ファイルを書き換えます
デバイス属性が存在するかどうかを確認し、プロセスをロックします
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. drivers/android.py を変更します。
初期化を変更し、マルチデバイスを取得し、例外を確認します
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
マルチプロセスおよびマルチユースケースグループの実行ステートメントを追加
addopts = -v -s -n 3 --dist loadfile --html=./report/report.html --self-contained-html