使用 Pytest 运行 yaml 文件来驱动 Appium 自动化测试

目录

前言:

获取 yaml 文件

YamlTest 测试类

Appium 初始化

Pytest 测试类

自定义 runtest demo:

自定义错误输出

Yaml 使用方式规则


前言:

使用Pytest来运行yaml文件来驱动Appium自动化测试是一种方便且灵活的方法。通过将测试数据和测试逻辑分离,您可以更轻松地管理和扩展测试用例。

本文主要介绍一下 pytest hook 方法是怎么运行 yaml 文件做测试的 (喜欢其他方式也可以用 xlsx,sql 等),怎么与 Appium 结合,来驱动 Appium 做自动化测试。

该运行方式参照 pytest --doctest 参数运行的方法, 想深入了解的同学可以查看 _pytest/doctest.py 源码

获取 yaml 文件

使用 pytest_collect_file 钩子函数,在脚本运行之前过滤 .yml 文件

def pytest_collect_file(parent, path):# 获取文件.yml 文件if path.ext == ".yml" and path.basename.startswith("test"):return YamlFile(path, parent)

读取 yml 转成 json 移交至 YamlTest 类

class YamlFile(pytest.File):# 读取文件内容def collect(self):import yamlraw = yaml.safe_load(self.fspath.open(encoding='utf-8'))for name, values in raw.items():yield YamlTest(name, self, values)

YamlTest 测试类

下面就是测试类了,这里我们 Appium 还是使用单例初始化,方便所有测试用例继承一个 session

Appium 初始化

class Singleton(object):"""单例 ElementActions 为自己封装操作类"""Action = Nonedef __new__(cls, *args, **kw):if not hasattr(cls, '_instance'):desired_caps={}host = "http://localhost:4723/wd/hub"driver = webdriver.Remote(host, desired_caps)Action = ElementActions(driver, desired_caps)orig = super(Singleton, cls)cls._instance = orig.__new__(cls, *args, **kw)cls._instance.Action = Actionreturn cls._instanceclass DriverClient(Singleton):pass

Pytest 测试类

测试类初始化,这里要说一下,测试类一定要继承 pytest.Item 方法

class YamlTest(pytest.Item):def __init__(self, name, parent, values):super(YamlTest, self).__init__(name, parent)self.values = valuesself.Action = DriverClient().Action # 初始化 Appiumself.locator = None

为了减少代码的逻辑,取出来的 yaml json 字符串怎么可以直接转化成可运行方法呢?

这里就要说到 class 的 _getattribute_ 内建属性的用法,下面举个简单例子

class TestExample:def test1(self):print('test1')>>> TestExample().__getattribute__('test1')()
test1

现在我们就能直接读取 yaml 文件中的 method 字符串直接转化成 Appium api 运行了(method 对应自己封装或 Appium api 的方法)

自定义 runtest demo:

class YamlTest(pytest.Item):def __init__(self, name, parent, values):super(YamlTest, self).__init__(name, parent)self.values = valuesself.Action = DriverClient().Actionself.locator = Nonedef runtest(self):# 运行用例for self.locator in self.values:self.locator['time'] = 5if self.locator.get('element'):# 需要接收参数response = self.Action.__getattribute__(self.locator.get('method'))(self.locator)else:# 不需要参数response = self.Action.__getattribute__(self.locator.get('method'))()self.assert_response(response, self.locator)

这里将 Appium api 基本操作封装成了两类:

  • 需要接收元素的参数,例如:点击,查找,输入等
  • 不需要接收元素参数,例如:重启,滑动等

自定义错误输出

def repr_failure(self, excinfo):"""自定义报错信息,如果没有定义则会默认打印错误堆栈信息,因为比较乱,所以这里自定义一下 """if isinstance(excinfo.value, Exception):return '测试用例名称:{} \n' \'步骤输入参数:{} \n' \'数据:{}'.format(self.name, self.locator, excinfo.value.args)def reportinfo(self):return self.fspath, 0, "CaseName: %s" % self.name

下面就是完整的测试类了

class YamlTest(pytest.Item):def __init__(self, name, parent, values):super(YamlTest, self).__init__(name, parent)self.values = valuesself.Action = DriverClient().Actionself.locator = Nonedef runtest(self):# 运行用例for self.locator in self.values:self.locator['time'] = 5is_displayed = Trueif not self.locator.get('is_displayed'):is_displayed = False if str(self.locator.get('is_displayed')).lower() == 'false' else Truetry:if self.locator.get('element'):response = self.Action.__getattribute__(self.locator.get('method'))(yamldict(self.locator))else:response = self.Action.__getattribute__(self.locator.get('method'))()self.assert_response(response, self.locator)except Exception as E:if is_displayed:raise Epassdef repr_failure(self, excinfo):"""自定义报错信息,如果没有定义则会打印堆栈错误信息,调试时可以注释该函数,便于问题查找 """if isinstance(excinfo.value, Exception):return '测试类名称:{} \n' \'输入参数:{} \n' \'错误信息:{}'.format(self.name, self.locator, excinfo.value.args)def assert_response(self, response, locator):if locator.get('assert_text'):assert locator['assert_text'] in responseelif locator.get('assert_element'):assert responsedef reportinfo(self):return self.fspath, 0, "CaseName: %s" % self.name

这里我们主体 Pytest+yaml 测试框架就构建完成了,当然还有各种异常的捕获等钩子函数,自己封装的 Appium api 方法等,上篇文章讲过了,这里就不赘述了,自行选择添加更多功能

Yaml 使用方式规则

因为我们上面将接收方法分成了需要 element 参数和不需要 element 参数两类所以 yaml 格式如下

test_index:-method: launchApp # 启动 APP-method: 方法名称 例如:click (必填)element: 查找元素id,class等 (选填,配合 method 如需要点击元素,查找元素等必填)type: 元素类型 id,xpath,class  name,accessibility id (选填,会自动识别,如识别错误则自行填写)name: 测试步骤的名称 例如:点击搜索按钮 (选填)text: 需要输入或者查找的文本 (选填,配合部分 method 使用)time: 查找该元素需要的时间,默认 5s (选填)index: 页面有多个id,class时,不为空则查找元素数组下标 (选填)is_displayed: 默认 True ,当为 False 时元素未找到也不会抛异常(选填)

咱们用微博做个 demo 测试一下

test_index:-method: launchApp # 重启 APP-method: clickelement: click_ad_skipname: 广告跳过按钮is_displayed: False-method: clickelement: 发现name: 导航发现按钮-method: sleepelement: 3-method: set_textelement: com.sina.weibo:id/tv_search_keywordtext: testerhomename: 搜索输入框-method: set_keycode_enter-method: screenshot_elementelement: //*[@resource-id="com.sina.weibo:id/lv_content"]/android.widget.RelativeLayout[1]name: 搜索内容截图

运行用例

pytest -v ./test_case/test_ranking.yml --alluredir /report/test

或者直接运行文件目录

使用方法和基本 pytest 用法没有太大区别

pytest -v ./test_case --alluredir /report/test

来查看下运行结果:

 

  作为一位过来人也是希望大家少走一些弯路

在这里我给大家分享一些自动化测试前进之路的必须品,希望能对你带来帮助。

(WEB自动化测试、app自动化测试、接口自动化测试、持续集成、自动化测试开发、大厂面试真题、简历模板等等)

相信能使你更好的进步!

点击下方小卡片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/5237.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为你精选5款体验极佳的原型设计工具!

在绘制原型图的过程中,使用一款的简单易操作的原型设计工具是非常重要的,本文精选了5款好用的原型工具与大家分享,一起来看看吧! 1、即时设计 即时设计是国内很多设计师都在用的原型设计工具,同时它也是国产的原型设…

想知道搭建知识库有什么重点?看这篇就够了

在目前这个提倡无纸化的时代,搭建一个知识库已经是一种潮流。无论是个人还是企业来说,都是特别重要的一个工具。今天looklook就从搭建知识库的重点这方面来展开,详细地告诉大家该如何成功搭建一个完善的知识库。 搭建知识库的重点 1.建立素材…

数据可视化:揭开数据的视觉奇迹

随着大数据时代的到来,我们面临着海量的数据,如何从中获取有价值的信息成为一项重要的挑战。数据可视化作为一种强大的工具,通过图表、图形和交互界面,将数据转化为可视化的形式,帮助我们更好地理解和分析数据。 数据可…

学习Dubbo前你要了解这些

文章目录 Dubbo的发展背景单一应用架构垂直应用架构分布式服务架构流动计算架构 RPCRPC的简单原理 DubboDubbo是什么Dubbo作者Dubbo的发展历程Dubbo架构 Dubbo发音: |ˈdʌbəʊ| Dubbo官方网站:http://dubbo.apache.org/ Dubbo是阿里巴巴开发的&#…

关系型数据库设计规则

目录 1.1 表、记录、字段 1.2 表的关联关系 1.2.1 一对一关联(one-to-one) 1.2.2 一对多关系(one-to-many) 1.2.3 多对多(many-to-many) 1.2.4 自我引用(Self reference) 关系…

知识图谱推理的学习逻辑规则(上)7.19+(下)7.20

知识图谱推理的学习逻辑规则 摘要介绍相关工作模型 (7.20)知识图谱推理逻辑规则概率形式化参数化规则生成器具有逻辑规则的推理预测器 优化E步骤M步骤 实验实验设置实验结果 总结 原文: 摘要 本文研究了在知识图谱上进行推理的学习逻辑规则…

Idea中使用Git详细教学

目录 一、配置 Git 二、创建项目远程仓库 三、初始化本地仓库 方法一: 方法二: 四、连接远程仓库 五、提交与拉取到本地仓库 六、推送到远程仓库 七、克隆远程仓库到本地 方法一: 方法二: 八、Git分支操作 一、配置 G…

zabbix 企业级监控(2) 监控linux主机

目录 配置开始 Zabbix添加linux主机 4.为agent.zabbix.com添加模板 环境: (隔天做的更换了IP,不影响实际操作) IP 192.168.50.50 关闭防火墙规则 更改主机名 [rootlocalhost ~]# vim /etc/hostname agent.zabbix.com [rootloca…

Zookeeper集群 + Kafka集群

Zookeeper集群 Kafka集群 前言一、Zookeeper 概述1.1 Zookeeper 定义1.2 Zookeeper 工作机制1.3 Zookeeper 特点1.4 Zookeeper 数据结构1.5 Zookeeper 应用场景1.5.1 统一命名服务1.5.2 统一配置管理1.5.3 统一集群管理1.5.4 服务器动态上下线1.5.5 软负载均衡 1.6 Zookeeper …

Pycharm安装dlib

目录 一、下载dilb 二、使用pip安装dlib库(亲测有效) 三、使用Pycharm安装(未使用) 一、下载dilb 官方网址:德利卜 皮皮 (pypi.org) 二、使用pip安装dlib库(亲测有效) 将下载好的whl文件放入工程文件中 接下来使用Python自带的pip进行安装 1.winR2.输入cmd,回车…

Word 插件实现读取excel自动填写

日常工作中碰到需要将EXCEL的对应数据记录填写到word文档对应的位置,人工操作的方式是: 打开exel表—>查找对应报告号的行—>逐列复制excel表列单元格内容到WORD对应的位置(如下图标注所示) 这种方法耗时且容易出错。实际上…

听GPT 讲K8s源代码--pkg(三)

在 Kubernetes 项目中,pkg/controller目录下的子目录通常包含控制器相关的代码和逻辑。控制器是 Kubernetes 中用于管理资源的核心组件之一。它们负责监控资源的状态,并确保其符合所定义的期望状态。下面是对这些子目录的一些常见作用的解释:…

C++:这门语言优势在哪?命名空间以及缺省参数?

文章目录 C的优势解决命名空间的问题 缺省参数 C的优势 C和C语言比起来有许多优势&#xff0c;这里我们先举一个例子&#xff0c;后续进行补充 解决命名空间的问题 首先看这样的代码&#xff1a; #include <stdlib.h> #include <stdio.h>int rand 0;int main(…

【六袆 - windows】windows计划任务,命令行执行,开启计划任务,关闭计划任务,查询计划任务

windows计划任务 查看 Windows 自动执行的指令取消 Windows 中的计划任务启动执行计划任务 查看 Windows 自动执行的指令 您可以使用以下方法&#xff1a; 使用任务计划程序&#xff1a;任务计划程序是 Windows 内置的工具&#xff0c;可以用于创建、编辑和管理计划任务。您可…

Django实现接口自动化平台(十)自定义action names【持续更新中】

相关文章&#xff1a; Django实现接口自动化平台&#xff08;九&#xff09;环境envs序列化器及视图【持续更新中】_做测试的喵酱的博客-CSDN博客 深入理解DRF中的Mixin类_做测试的喵酱的博客-CSDN博客 python中Mixin类的使用_做测试的喵酱的博客-CSDN博客 本章是项目的一…

职责链(Chain of responsibility)模式

目录 处理过程应用场景参与者协作效果实现相关模式应用与思考类图 职责链(Chain of responsibility)是一种对象行为模式&#xff0c;可以使多个对象都有机会处理请求&#xff0c;从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链&#xff0c;并沿着这条链传递…

[ 容器 ] Docker 基本管理

目录 一、Docker 概述1.1 Docker 是什么&#xff1f;1.2 Docker 的宗旨1.3 容器的优点1.4 Docker 与 虚拟机的区别1.5 容器在内核中支持的两种技术namespace的六大类型 二、Docker核心概念2.1 镜像2.2 容器2.3 仓库 三、安装 Docker四、docker 镜像操作五、 Docker 容器操作总结…

经济和行政手段使双高企业降低能耗总量和能耗强度,提高能源利用效率-安科瑞黄安南

摘要 2022年6月29日工信部、发改委、财政部、生态环境部、国资委、市场监管总局六部门联合下发《关于印发工业能效提升行动计划的通知》&#xff08;工信部联节〔2022〕76号&#xff0c;以下简称《行动计划》&#xff09;&#xff0c;主要目的是为了提高工业领域能源利用效率&…

修复git diff正文中文乱码

Linux git diff正文中文乱码 在命令行下输入以下命令&#xff1a; $ git config --global core.quotepath false # 显示 status 编码 $ git config --global gui.encoding utf-8 # 图形界面编码 $ git config --global i18n.commit.encoding utf-8 # …

Ubuntu18.04 拯救者R9-7945HX 4060 配置ZED 2i代双目相机驱动+ORBSLAM2

AMD的拯救者网卡很拉&#xff0c;研究了很久除了换网卡可以解决网络问题&#xff0c;其它没找到合适的办法&#xff0c;这里我用手机USB共享网络的方式勉强上网&#xff0c;这里不得不说华为的信号桥很好用。 之前在1050ti的电脑上布置过&#xff0c;很顺利&#xff0c;这个新…