【第四篇】XiaoZaiMultiAutoAiDevices之核心机制

简介: 在上一期说到主要的流程和部分核心运行流程,这一期我们主讲:`如何通过外部参数指定脚本运行指定设备`测试框架传参,可能一部分同学会想到unittest的DDT,使用pytest相关装饰器和各种外部文件的数据传入方式。

一、unittest改造

在上一期说到主要的流程和部分核心运行流程,这一期我们主讲:如何通过外部参数指定脚本运行指定设备

测试框架传参,可能一部分同学会想到unittest的DDT,使用pytest相关装饰器和各种外部文件的数据传入方式。

在当前这套框架中,我们是将设备在index.py中加入到进程中,再由进程去调用RunTestCase方法,在RunTestCase方法中,我们将进程中传入的设备ID再传入到TestCase中,实现一个动态获取动态执行。

那么,如何在TestCase文件外部传入一个值进入TestCase内部,并且进行使用呢?

这里我自己通过查阅资料,封装了一套方法,文件路径在common\ParameterizedTestCase.py

(1) 如何使用ParameterizedTestCase

可参考框架中TestCase\Demo文件夹中的TestCase文件,均使用了ParameterizedTestCase

1.在需要使用TestCase文件中导入ParameterizedTestCase类

from common.ParameterizedTestCase import ParameterizedTestCase

2、在编写TestCase时,继承ParameterizedTestCase类

class TESTDemo_1(ParameterizedTestCase):
    '第一个测试文件'
    # @unittest.skip
    def test001_startAPP(self):
        '001进入第一个页面'
        print(f"当前运行的设备为:{self.device_id}")
        print('001进入第一个页面')
    # @unittest.skip
    def test002_Authorization(self):
        '''001_进行授权'''
        print('001第二个测试用例')

    def test004_IosAtt(self):
        '''001_ios弹出ATT弹窗,点击"允许跟踪"按钮'''
        print('001_ios弹出ATT弹窗,点击"允许跟踪"按钮')

(2) ParameterizedTestCase 源码解析

我框架源码有详细注释

# -*- coding: utf-8 -*-
'''
@Time : 2022/9/19 17:26
@Author : Vincent.xiaozai
@Email : Lvan826199@163.com
@File : ParameterizedTestCase.py
'''
__author__ = "梦无矶小仔"

import unittest

class ParameterizedTestCase(unittest.TestCase):
    """ 继承unittest.TestCase类,ParameterizedTestCase类可以进行参数化
        使用时直接继承ParameterizedTestCase类
        注意:methodName不要赋值,否则test不生效
    """
    def __init__(self, methodName, device_id=None):
        super(ParameterizedTestCase, self).__init__(methodName)
        self.device_id = device_id

    @staticmethod
    def parameterize(testcase_class, device_id=None):
        """ 创建一个套件,其中包含给定的测试类,参数可以自己定义单个或多个
        :return 返回测试套件
        :device_id 表示传入的参数,可以自定义,需要注意的是,在init中需要同步更新
        """
        testloader = unittest.TestLoader()
        testnames = testloader.getTestCaseNames(testcase_class)
        suite = unittest.TestSuite()
        for name in testnames:
            suite.addTest(testcase_class(name, device_id=device_id))
        return suite

二、外部传参入TestCase

在前面我们将需要接收外部参数的测试类继承了ParameterizedTestCase,在ParameterizedTestCase 中我们可以自定义接收的参数,本框架为了便于理解只定义了一个device_id变量,如果想要传入多个参数,可以自行采用*args**kwargs进行传值。

(1)定义接收变量字典

在TestCase类外定义一个字典,进行全局变量控制,如Demo示例中为:

controlparams = {'control':1} # 用作控制器

在这里control作为控制器,防止设备频繁进行初始化。

(2)setUp进行初始化

Demo中为IOS的初始化,其他初始化可以参考index.py中的代码。setUp代码如下:

def setUp(self):
    u'''这里放需要在每条用例前执行的部分'''
    # 前段部分用于初始化连接设备,这个部分的作用就是避免设备多次重新连接,只会连接一次
    if controlparams['control'] == 1 :
        self.ios = IOS("http+usbmux://" + self.device_id)
        self.c = wda.Client("http+usbmux://{udid}".format(udid=self.device_id))
        controlparams['ios'] = self.ios
        controlparams['c'] = self.c
        controlparams['control'] = 2
    # 每次执行用例前,需要从控制参数里面进行取出(但不会进行重新连接)
    self.ios = controlparams['ios']
    self.c = controlparams['c']

这里我们看到了一个self.device_id,这个值就是我们在ParameterizedTestCase 中定义的外部传入的值,在TestCase可以直接用self进行获取。

其他的self.ios是使用的airtest-core-ios中的ios进行ios的一些原生控件操作初始化。

self.c则是使用的wda进行初始化,使用者可以自行选择一个,也可以全都用。(Android请不要讲uiautomator2和airtest一起初始化使用,会发生冲突。)

(3)Case中进行使用

在每个小case中,我们直接使用self.属性就可以啦,因为所有的步骤都是一样的,初始化的时候可以cv框架中Demo的代码就行,如果想要自己改造,可以看下系列教程。

三、IOS相关封装

common\IOSAppOperate.py封装了IOS相关操作。

1.自动切换更改Apple Store 的账号密码

2.自动切换更改沙盒账号密码

3.自动前往TestFlight下载相关应用

相关代码可自行下载框架源码进行查阅。

相关文章
|
6月前
|
设计模式 前端开发 Java
【深入浅出Spring原理及实战】「夯实基础系列」360全方位渗透和探究SpringMVC的核心原理和运作机制(总体框架原理篇)
【深入浅出Spring原理及实战】「夯实基础系列」360全方位渗透和探究SpringMVC的核心原理和运作机制(总体框架原理篇)
69 0
|
6月前
|
前端开发 JavaScript UED
第五章(原理篇) 微前端技术之模块联邦与动态加载
第五章(原理篇) 微前端技术之模块联邦与动态加载
286 0
|
6月前
|
资源调度 前端开发 JavaScript
第十章(应用场景篇) Single-SPA微前端架构深度解析与实践教程
第十章(应用场景篇) Single-SPA微前端架构深度解析与实践教程
226 0
|
3月前
|
机器学习/深度学习 分布式计算 前端开发
构建前端防腐策略问题之前端代码会随着技术引擎的迭代而腐烂的问题如何解决
构建前端防腐策略问题之前端代码会随着技术引擎的迭代而腐烂的问题如何解决
|
5月前
|
消息中间件 存储 Java
RocketMQ技术详解:从基础知识到内部设计原理
RocketMQ技术详解:从基础知识到内部设计原理
125 2
|
6月前
|
消息中间件 存储 负载均衡
精华推荐 | 【深入浅出 RocketMQ原理及实战】「底层源码挖掘系列」透彻剖析贯穿RocketMQ的消费者端的运行核心的流程(上篇)
精华推荐 | 【深入浅出 RocketMQ原理及实战】「底层源码挖掘系列」透彻剖析贯穿RocketMQ的消费者端的运行核心的流程(上篇)
57 1
|
6月前
|
存储 监控 安全
插件机制详解:原理、设计与最佳实践
插件机制详解:原理、设计与最佳实践
344 0
|
存储 资源调度 Kubernetes
K8S | 核心应用原理分析
K8S作为开源的容器编排引擎,用来对容器化应用进行自动化部署、 扩缩和管理;
163 0
K8S | 核心应用原理分析
电子游戏的核心原理
你小时候有没有玩过这样一种玩具:一块硬纸,一面画着一只鸟,一面画着一个笼子。硬纸下粘上一根细棒。用手来回转动细棒,让硬纸的两面快速交替出现,就会看见鸟被关在了笼子里。
|
缓存 JSON 前端开发
腾讯开源的 hel 提供了加载远程模块的能力,谈谈它的实现原理
腾讯开源的 hel 提供了加载远程模块的能力,谈谈它的实现原理
180 0
下一篇
无影云桌面