01前言
在之前快速搭建基于Selenium Grid 分布式管理的appium测试设备系统,我们介绍了快速本地化搭建,本次我们分享的呢,是基于搭建后的,如何在代码上进行调度设备测试?
02正文
搭建环境只是第一步,真正的第二步,才是实际的应用,我们的代码呢,基于之前的https://gitee.com/liwanlei/appiumdemo 代码改造。
在case目录下面,我新建一个case文件
代码语言:javascript复制from time import sleep
from ddt import ddt, file_data
from appium import webdriver
from common.parame import Parmer
from config import apk_path, login_element
from common.pertools import caijicpu, getnencun
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from config import BASH_DIR,perdata
from common.pytoolsFoYaml import *
import os
element = read(login_element)
from common.isintsallapp import isinstallapp
@ddt
class testCase(Parmer):
def setUp(self) -> None:
self.datafile=os.path.join(BASH_DIR,perdata)
is_first_install = isinstallapp(devicesName=self.parme['deviceName'], apk_path=apk_path,
apppackage=self.parme['appPackage'])
desired_caps = self.parme['desired_caps']
self.driver = webdriver.Remote('http://0.0.0.0:4444/wd/hub', desired_caps)
sleep(20)
try:
# 启动同意用户协议
agree = element['agreeelement']
self.driver.find_element_by_id(agree).click()
if is_first_install:
# 首次安装需要加载文件
sleep(10)
except:
self.driver.quit()
def tearDown(self) -> None:
self.driver.quit()
sleep(10)
@file_data("../data/casedata/logincase.yaml")
def testlogin(self, user, user_password, msg, casename):
sleep(30)
self.driver.find_element_by_id(element['opearelement']).click()
sleep(10)
WebDriverWait(self.driver, 10, 0.5).until(
EC.presence_of_element_located((By.ID, element['logintextclik']))).click()
cpu = caijicpu(packagename=self.parme['appPackage'], devices=self.parme['deviceName'])
memory = getnencun(packagename=self.parme['appPackage'], devices=self.parme['deviceName'])
dataper={}
dataper[casename "_start"]={'cpu':float(cpu),'mem':float(memory)}
save(file=self.datafile,data=dataper)
loc = ("id", element['usernameedit'])
username = WebDriverWait(self.driver, 10, 0.5).until(EC.presence_of_element_located(loc))
username.clear()
username.send_keys(user)
password = WebDriverWait(self.driver, 10, 0.5).until(
EC.presence_of_element_located((By.ID, element['usernameedit'])))
password.clear()
password.send_keys(user_password)
sleep(2)
login = self.driver.find_element_by_id(element['loginbtn'])
login.click()
sleep(10)
try:
self.driver.find_element_by_id(element['assertelement'])
self.assertTrue(False, msg=msg)
except:
self.assertTrue(True, msg=msg)
cpuend = caijicpu(packagename=self.parme['appPackage'], devices=self.parme['deviceName'])
memoryend = getnencun(packagename=self.parme['appPackage'], devices=self.parme['deviceName'])
dataper = {}
dataper[casename "_end"] = {'cpu': float(cpuend), 'mem': float(memoryend)}
save(file=self.datafile, data=dataper)
其实这里只是把地址给改造了。我新搞了一个文件,就是可以区分。我们的现在的地址呢,是指向了selenium Grid的地址,我们这个时候就可以去编写我们操作case的脚本了。
逻辑:
代码语言:javascript复制指定设备,
选择执行的case
执行用例出报告
那么我去实现下这里的代码
代码语言:javascript复制def run(dev):
desired_caps = {
'platformName': 'ANDROID',
'platformVersion': '10.0',
'appPackage': apkname,
'appActivity': get_apk_lautc(apk_path),
"deviceName":dev,
"udid":dev,
"ReSet":True
}
test_suit = unittest.TestSuite()
test_suit.addTest(Parmer.parametrize(testcase_klass=testCase,
parame={'desired_caps':desired_caps,
'deviceName':dev,
'appPackage': apkname,
'appActivity': get_apk_lautc(apk_path) })) # 扩展的其他的测试用例均这样添加
openone = open(dev "name.html", 'w ')
'''利用unittest的testsuite来组织测试用例'''
besautiful = BSTestRunner(title="报告",
description="测试报告", stream=openone,
trynum=runprojecttrynum, is_show=ISSHOWHISTORY,
filepath=BASH_DIR)
besautiful.run(test_suit)
其实还是之前执行测试用例呢,这个时候,我们传入设备就可以执行了。但是我们这个时候想多机并行,怎么做呢,很简单的方式就可以实现了。
逻辑如下:
代码语言:javascript复制1.连接设备
2.创建线程
3.增加到线程列表
4.分别启动线程
代码语言:javascript复制代码如下
def run_threed():
get_device = get_devices()
thread_list = []
for dev in get_device:
t = threading.Thread(target=run, args=(dev,))
thread_list.append(t)
for t in thread_list:
t.start()
for t in thread_list:
t.join(60)
其实很简单,就是多线程处理。对比之前的方式,只需要县城调度告诉即可。让selenium Grid去调度设备执行就可以了。最后效果如下
目前存在的问题--需要解决多设备并发后的测试报告汇总。