前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于Selenium Grid 分布式管理的appium测试设备系统(二)

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

作者头像
雷子
发布2021-12-16 16:57:03
6420
发布2021-12-16 16:57:03
举报
文章被收录于专栏:雷子说测试开发

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 雷子说测试开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档