【第二篇】XiaoZaiMultiAutoAiDevices之基本使用

简介: 从一个框架,延伸各项知识点,补补基础,挺好~

【第二篇】XiaoZaiMultiAutoAiDevices之基本使用

从一个框架,延伸各项知识点,补补基础,挺好~

入口函数

上篇介绍了框架每个目录的作用及个别文件的用途,但我漏了一个很重要的,入口函数。

不过已经下载了框架的小伙伴,应该一眼就能看到,start.py这个文件就是入口,这个文件内容也非常简单,只有一个启动项。

from utils import index
def start():
    index.main()
    
# 从根目录启动,确保相对路径调用正常
if __name__ == '__main__':
    # os.popen('adb start-server') #针对android设备
    start()

这里调用了utils下index中的main函数,这部分我们放后面再讲。

config.ini 配置说明

[config]
testcasepath = 'TestCase'
deviceslist =

这部分是基础配置

testcasepath为指定的测试用例集合文件夹名称;

deviceslist为需要运行的设备,这里我们设置为空,默认会读取现在所有连接的设备。未做单独处理,这块可以根据自己需求进行改动。

[packageMsg]
packagename = ''
apppath = ''

对于安卓设备,使用apk直接安装,需要将包名和路径填到此处。

本框架的iOS设备安装包是直接到TestFlight中进行下载,也可以修改为ipa安装包模式。

这部分可以根据自己需求进行扩展:

1、在config.ini的读取配置中加入此项进行读取;

2、在TestCase对应项目的用例里面编写安装应用脚本

3、此功能归类于应用安装测试,所以我没有在框架中单独分类,需要使用者自行扩展。

4、Android各种设备有不同的权限确认,都是需要自行根据实际情况进行编写对应的测试集。

[TestCaseSpFolder]
All=0
Demo=1

1表示选择,0表示不选,只能有一个为1,其他为0。

All 表示选择TestCase文件夹下所有的测试用例,本框架中,如果不打算在Testcase文件夹下建项目文件夹,而是把test*.py文件全放里面,就可以把All的值置为1。

这里表示All不选,选择了Demo文件夹。

后面执行用例的时候,就会自动找到TestCase/Demo下的所有测试文件。

扩展:

使用者可以根据自己的需求,选择直接创建测试文件,也可以选择单个项目建一个文件夹存放测试文件

[TestCaseforDevice]
;#################################################################### Demo
;99999999999999 = TEST_Demo_001
;; 123 ->>
00008101-001859DE1E38001E = TEST_Demo_002
;; 186 ->>
00008030-001E19021A42802E = TEST_Demo_001,TEST_Demo_002

这个配置表示指定某些设备执行某些用例文件。

1、如果设备不在线,则会跳过;

2、设备选择的测试文件所在的文件夹需要在TestCaseSpFolder置为1;

3、如果需要执行多个测试文件,则用逗号进行分隔;

4、多台设备,依次写下去即可;

[Email]
mail_host = ''
mail_user = ''
mail_pwd = ''
sender = ''
receivers = ''

[DingTalk]
webhook = ''
secret = ''

[FeiShu]
webhook = ''

这些是当你执行完测试报告后,进行报告的发送。

如何使用可以参考我之前的文章,以钉钉为示例。

python之钉钉机器人自动发消息——傻瓜式教程 (qq.com)

config读取及相关代码

utils --> readConfig.py

此py文件中都是对config文件的相关操作

注意:

增加了新增及删除对应的section和option,但不建议使用;
configparser库本身存在问题,在写入和删除时会丢失所有注释,建议使用其他方式写入;
或者说注释丢失没有影响的话,就可以随意使用。

文件里面都有详细注释,这个大家有兴趣的就直接看源码哦~

这里放一部分:

import os,inspect,configparser
# 获取当前文件的上层路径
parentPath = os.path.abspath(os.path.dirname(inspect.getfile(inspect.currentframe())) + os.path.sep + ".")
# 获取当前项目的根路径
rootPath = os.path.abspath(os.path.dirname(parentPath) + os.path.sep + ".")
# 获取config.ini文件路径
configPath = rootPath + "\settings\config.ini"
# 初始化配置文件
configFile = configparser.ConfigParser()
configFile.read(configPath, encoding="utf-8")

# 获取TestCaseforDevice下的所有设备uuid及对应的用例,多个用例用逗号分隔
def getAllTestCase():
    '''
    :return: 字典组合的{'device1':'case1,case1_1','device2':'case2'}
    '''
    selectDevicesList = configFile.options('TestCaseforDevice')
    selectTestCaseList = []
    for i in selectDevicesList:
        selectTestCaseList.append(configFile.get('TestCaseforDevice',i))
    device_case_dict = dict(zip(selectDevicesList,selectTestCaseList))
    return device_case_dict

# 获取指定的用例文件夹名称
def getSpCaseFolder():
    getCaseFolder = configFile.options('TestCaseSpFolder')
    getSpCaseFolderList = []
    for i in getCaseFolder:
        try:
            if configFile.getint('TestCaseSpFolder',i) == 1:
                getSpCaseFolderList.append(i)
        except:pass
    return getSpCaseFolderList

#获取设备列表
def get_devicesList():
    devicesList = []
    get_devicesList = configFile.get('config','deviceslist')
    devices = get_devicesList.split(',')
    for i in devices:
        devicesList.append(i)
    return devicesList

增删改也有,但会把ini文件的注释给冲掉,慎用

#写配置文件
def addConfig(section,option,value):
    if  option!="" and value!="":
        if not configFile.has_section(section):
            configFile.add_section(section)
        configFile.set(section,option,value)
        configFile.write(open(configPath, "w"))


#删除配置文件下某个setion的所有内容
def delSectionConfig(section):
    if configFile.has_section(section):
        configFile.remove_section(section)
        configFile.write(open(configPath, "w"))
    else:
        raise f"{section}不存在!"

#删除配置文件下setion下的某个option
def delOptionConfig(section,option):
    if configFile.has_option(section,option):
        configFile.remove_option(section,option)
        configFile.write(open(configPath, "w"))
    else:
        raise f"填写的{option}不存在于{section}下!"

IOS设备环境配置说明

iOS设备的复杂的地方在于Xcode配置安装WebDriverAgent,必须要使用Mac电脑。

参考往期文章:

ios自动化 - Xcode、WebDriverAgent环境部署 (qq.com)

这里需要注意的是,如果你的ios版本小于等于ios10,需要使用Xcode10版本,而Xcode对应的Mac电脑OS版本需要较低,最新OS系统无法安装(这也就是我有一台ios10没配好环境的原因,如果有解决方案,欢迎给我后台留言或者联系我,万分感谢)

版本支持列表参考:

Xcode - 支持 - Apple Developer

后续预告

框架执行流程图

主功能逻辑

unittest的testcase外部传参函数剖析

最后祝大家工作顺利身体健康,打个喷嚏就暴富!

更多内容欢迎关注我的公众号:梦无矶的测试开发之路

相关文章
|
7月前
最新jsonwebtoken-jjwt 0.12.3 基本使用
最新jsonwebtoken-jjwt 0.12.3 基本使用
666 0
|
4月前
|
存储 缓存 移动开发
EaselJS 源码分析系列--第二篇
EaselJS 源码分析系列--第二篇
|
4月前
|
网络安全 Perl
Nikto——基本使用
Nikto——基本使用
64 0
|
4月前
|
存储 缓存 前端开发
EaselJS 源码分析系列--第三篇
EaselJS 源码分析系列--第三篇
|
4月前
|
存储 前端开发 JavaScript
EaselJS 源码分析系列--第四篇
EaselJS 源码分析系列--第四篇
|
4月前
|
移动开发 前端开发 JavaScript
EaselJS 源码分析系列--第一篇
EaselJS 源码分析系列--第一篇
|
7月前
|
存储 NoSQL 定位技术
RedisGEO的基本使用
对GEO的基本介绍
|
缓存 Java Android开发
EventBus原理解析笔记以及案例实战(结合demo)
EventBus原理解析笔记以及案例实战(结合demo)
CodeBlock 基本使用
基本介绍 代码块又称为初始化块,属于类中的成员【即是类的一部分,类似于方法,讲逻辑语句封装在方法体中,通过{}包围起来】 和方法不同,没有方法名,没有返回值,没有参数,只有方法体,而且不用通过对象或类显式调用,而是加载类时或创建对象时隐式调用。
156 0
|
Go
基本使用
基本使用
87 0

相关实验场景

更多
下一篇
DataWorks