基于Selenium Grid 分布式管理的appium测试设备系统(二)

2021-12-16 16:57:03 浏览数 (1)

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去调度设备执行就可以了。最后效果如下

目前存在的问题--需要解决多设备并发后的测试报告汇总。

0 人点赞