Python+Appium+Pytest+Allure自动化测试框架-代码篇

文章目录

  • 自动化测试框架工程目录
  • 示例测试代码
  • 示例结果查看
  • allure
  • pytest
    • 编写pytest测试样例的规则
    • pytest conftest.py向测试函数传参
  • appium
    • 启动appium服务
    • 代码端通过端口与appium服务通信对设备进行操作
    • 在pytest测试用例中调用appium
  • 更多功能

Python+Appium+Pytest+Allure自动化测试框架,本文主要讲述工程的搭建,测试用例的编写

自动化测试框架工程目录

pycharm创建python工程AutoTest,main.py做为主入口
设定目录结构如下
在这里插入图片描述

各目录用途说明

├─common		# 公共模块目录
├─datas         # 配置文件目录
├─outputs		# 测试输出目录
│  ├─logs		# 日志目录, 4723.log代表appium端口为4723服务的日志
│  ├─picture	# 截图存放目录
│  └─reports	# 测试报告存放目录
└─testcase		# 测试用例目录

示例测试代码

main.py调用pytest进行用例测试, 然后再调用allure生成报告

# _*_coding:utf-8 _*_import os
import pytestdef run_case():pytest.main(["-s","-v","--alluredir", "./outputs/reports/data"])generate_report()def generate_report():# 查看allure报告os.system("allure generate outputs/reports/data -o outputs/reports/html --clean")if __name__ == "__main__":run_case()

写个打印Hello World的测试用例,里面加上allure添加报告信息,
pytest与allure的使用后面会讲到,这里只做个简单示例,
testcase/test_device_info.py

# _*_coding:utf-8 _*_
import os
import timeimport allure@allure.feature("设备信息模块")
class TestDeviceInfo:@allure.story("设备信息故事")@allure.description("设备信息描述")@allure.severity(allure.severity_level.BLOCKER)def test_get_device_info(self):print('test_get_device_info start')print('Hello World')print('test_get_device_info end')

运行main.py就会开始进行自动化测试。

示例结果查看

有没有错可以直接在pycharm的打印中看
在这里插入图片描述
执行完用例,会生成allure的测试结果报告在outputs/reports/html目录下
在这里插入图片描述
在命令行中输入以下指令查看html结果
D:\workspace>allure open .\AutoTest\outputs\reports\html
在这里插入图片描述

allure

Allure 是一个灵活且功能强大的测试报告框架,主要用于为自动化测试生成美观且信息丰富的测试报告。
在这里插入图片描述

pytest

pytest是一个功能强大的 Python 测试框架,用于编写简单且可扩展的测试。
这里面有个testcase目录是专门给pytest用的,测试用例都放在这个目录下

编写pytest测试样例的规则

可以在工程根目录下放置pytest.in指定pytest规则,
它会在指定的目录及其子目录中自动搜索符合命名规则的测试函数和测试类。不需要手动添加每个测试用例到测试套件中。
比如,如果你有一个测试模块test_device_info.py,只要运行pytest命令,它就会自动发现并执行其中以test_开头的函数。
在这里插入图片描述

  1. 测试文件以test_开头
  2. 测试类以Test开头,并且不能带有 init 方法
  3. 测试函数以test_开头
  4. 断言使用基本的assert即可

pytest conftest.py向测试函数传参

main.py与testcase下的测试用例是隔离的,比如在main.py中创建个单例模式对象,在pytest测试函数中再调用这个单例对象实际会新创建个实例,二者不是一个对象。
这时需要用到pytest conftest.py向测试函数传参

  1. pytest会默认读取conftest.py里面的所有fixture
  2. conftest.py 文件名称是固定的,不能改动
  3. conftest.py只对同一个package下的所有测试用例生效
  4. 不同目录可以有自己的conftest.py,一个项目中可以有多个conftest.py
  5. 测试用例文件中不需要手动import conftest.py,pytest会自动查找

在testcase目录下新建文件conftest.py里面

# _*_coding:utf-8 _*_
import time
import pytest# pytest.addoption()钩子函数,注册自定义参数 cmdopt 添加到配置对象
def pytest_addoption(parser):parser.addoption("--cmdopt",action="store",default="device_info",  # 默认参数值help=None)# 从配置对象中读取自定义参数的值
@pytest.fixture(scope='session')
def cmdopt(pytestconfig):# 两种写法return pytestconfig.getoption("--cmdopt")         

通过pytest.fixture, 把cmdopt传给测试函数。
修改main.py, 加了参数–cmdopt=Hi, 把Hi传过去。

# _*_coding:utf-8 _*_import os
import pytestdef run_case():pytest.main(["-s","-v","--cmdopt=Hi","--alluredir", "outputs/reports/data"])generate_report()def generate_report():# 生成allure报告os.system("allure generate outputs/reports/data -o outputs/reports/html --clean")if __name__ == "__main__":run_case()

test_device_info.py中,函数添加cmdopt,把参数接收进来

# _*_coding:utf-8 _*_
import os
import timeimport allure@allure.feature("设备信息模块")
class TestDeviceInfo:@allure.story("设备信息故事")@allure.description("设备信息描述")@allure.severity(allure.severity_level.BLOCKER)def test_get_device_info(self, cmdopt):print('test_get_device_info start')print('get cmdopt:' + cmdopt)print('test_get_device_info end')

执行结果,可以看到打印了Hi
在这里插入图片描述

appium

Appium 是一个开源的自动化测试框架,主要用于移动应用(包括 iOS 和 Android)的自动化测试。
其使用步骤是

启动appium服务

在命令行中输入

start /b appium -a 127.0.0.1 -p 4723 -pa /wd/hub

注意新版本appium不支持-bp参数(bootstrap port),加了会报错,另外需要加上-pa /wd/hub的参数,否则会报错“No route found for /wb/hub/session”。
第一次启动要慢些,有时候要花十多秒,等待appium的打印出现才执行后面的操作
在这里插入图片描述

代码端通过端口与appium服务通信对设备进行操作

把调试设备(比如开adb功能的手机)连usb到电脑,
命令行中查看设备名称
adb devices
比如得到:X36405Y4041600056
我们把这个值填写到代码配置中,

from appium.options.android import UiAutomator2Optionsdef get_appium_driver():desired_caps = {"platformName": "Android","platformVersion": "13", # 这个填设备的安卓版本,如果写错会报错的"deviceName": "X36405Y4041600056", # 这个填设备adb device获取的名称,写错会报错"noReset": True,}#driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)# 新版本appium需要对参数进行转化options = UiAutomator2Options()options.load_capabilities(desired_caps)driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', options=options)return driver

注意,新版本appium要用options参数,不能直接用desired_caps,否则会报错:

>           capabilities = options.to_capabilities()
E           AttributeError: 'NoneType' object has no attribute 'to_capabilities'

报错图如下:
在这里插入图片描述

在pytest测试用例中调用appium

这个例子我们调用appium获取设备的屏幕宽度并打印出来

@allure.feature("设备信息模块")
class TestDeviceInfo:@allure.story("设备信息故事")@allure.description("设备信息描述")@allure.severity(allure.severity_level.BLOCKER)def test_get_device_info(self, cmdopt):print('test_get_device_info start')print('get cmdopt:' + cmdopt)driver = get_appium_driver()width = driver.get_window_size()['width']print('screen width {}'.format(width))print('test_get_device_info end')

运行结果:
在这里插入图片描述
到此Python+Appium+Pytest+Allure框架就串连起来了。

更多功能

  1. yaml
    yaml也可以整合进来,比如把desired_caps存放到datas/caps.yml中,然后代码中去读这个配置,而不是写在代码里面。测试用例的步骤也可以用yaml表示,这里不再细说。
  2. 多进程/线程支持多设备同时进行测试
    这块可以单独拿一篇来说了,这里只说下思路,在代码中自动执行adb devices然后把所有adb设备都列举出来,每台设备开个线程或进程执行appium服务,每个服务端口配置成不一样的。
    不同设备根据不同端口访问appium服务进行设备操作。
    Python+Appium+Pytest+Allure自动化测试框架-安装篇
    作者:帅得不敢出门

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

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

相关文章

【C++】红黑树的Iterator改造以及mapset的模拟实现与封装

目录 01.红黑树的迭代器 operator: operator*、-> operator、! 02.红黑树的改造 begin和end方法 keyOfValue insert方法 find方法 size方法 clear方法 03.map&set的模拟实现 01.红黑树的迭代器 前面的博客我们介绍了红黑树的底层原理并手撕了一个自己的红…

微信小程序服务通知

项目中用到了小程序的服务消息通知,通知订单状态信息,下边就是整理的一下代码,放到项目中,把项目的小程序appid和小程序的secret写进去,直接运行即可 提前申请好小程序服务信息通知短信模板,代码需要用到模…

linux命令行的艺术

文章目录 前言基础日常使用文件及数据处理系统调试单行脚本冷门但有用仅限 OS X 系统仅限 Windows 系统在 Windows 下获取 Unix 工具实用 Windows 命令行工具Cygwin 技巧 更多资源免责声明 熟练使用命令行是一种常常被忽视,或被认为难以掌握的技能,但实际…

【vue】11.Vue 3生命周期钩子在实践中的具体应用

Vue 3的生命周期钩子为开发者提供了在不同阶段操作组件的强大能力。本文将带您了解每个生命周期钩子的使用场景,并通过简单的案例来展示它们在实际开发中的应用。 1. 创建阶段(Creation Hooks) beforeCreate 进行一些初始化操作&#xff0c…

2024年最新版SSL证书

SSL证书行业变动很大,随着操作系统,浏览器新版本不断增加,对SSL证书兼容性要求越来也高,对于安全性也有所提升,主流CA机构根证书及交叉链迎来了换新,这是为了延续下一个20个年的安全计划的提前不如&#xf…

Spark入门到实践

Spark入门到实践 一、Spark 快速入门1.1 Spark 概述1.2 Spark 最简安装1.3 Spark实现WordCount1.3.1 下载安装Scala1.3.2 添加Spark依赖1.3.3 Scala实现WordCount1.3.4 通过IDEA运行WordCount1.3.5 IDEA配置WordCount输入与输出路径1.3.6 通过IDEA运行WordCount1.3.7 查看运行结…

vue、小程序腾讯地图开放平台使用

一、登录账号 腾讯地图API 官方文档: 腾讯位置服务 - 立足生态,连接未来 二、申请秘钥 key 从首页【开发文档】-【微信小程序 SDK】进到微信小程序的开发文档:微信小程序JavaScript SDK | 腾讯位置服务 然后我们根据【Hello World】的提示…

linux的文件IO操作---read函数如何退出

关于 read 函数和 EOF(End Of File)的概念。1. EOF 的定义: EOF 是一个信号,表示文件的末尾已经被到达,没有更多的数据可以读取。在 Unix 和 Linux 系统中,EOF 通常与文件的结束关联,但也可以…

前端必知必会-JavaScript 对象

文章目录 JavaScript 对象对象属性对象方法JavaScript 变量JavaScript 对象JavaScript 对象定义JavaScript 对象文字创建 JavaScript 对象使用 new 关键字对象属性访问对象属性 JavaScript 对象方法JavaScript 原始值JavaScript 对象是可变的 总结 JavaScript 对象 现实生活中…

电赛入门之软件stm32keil+cubemx

hal库可以帮我们一键生成许多基本配置,就不需要自己写了,用多了hal库就会发现原来用基本库的时候都过的什么苦日子(笑 下面我们以f103c8t6,也就是经典的最小核心板来演示 一、配置工程 首先来新建一个工程 这里我们配置rcc和sys&…

漏洞分析技术实践_数组越界漏洞

1. 基础知识 1.1 数组原理 数组是一段连续的内存存储空间&#xff0c;包含多个类型相同的元素。通过数组名可以在内存中找到对应的数组空间&#xff0c;并且可以通过数组名和索引来访问数组中的元素。 #include <stdio.h>int main(){int a[10];int i0;printf("a’…

Elasticsearch开源仓库404 7万多star一夜清零

就在昨晚&#xff0c;有开发者惊奇地发现自己的开源项目 star 数竟然超过了最流行的开源全文搜索引擎 Elasticsearch。发生了什么事&#xff1f;Elasticsearch 竟然跌得比股票还凶 —— 超 7 万 star 的 GitHub 仓库竟然只剩下 200 多。 从社交媒体的动态来看&#xff0c;Elast…

汽车免拆诊断案例 | 2010款起亚赛拉图车发动机转速表指针不动

故障现象  一辆2010款起亚赛拉图车&#xff0c;搭载G4ED 发动机&#xff0c;累计行驶里程约为17.2万km。车主反映&#xff0c;车辆行驶正常&#xff0c;但组合仪表上的发动机转速表指针始终不动。 故障诊断  接车后进行路试&#xff0c;车速表、燃油存量表及发动机冷却温度…

硅谷(12)菜单管理

菜单管理模块 11.1 模块初始界面 11.1.1 API&&type API: import request from /utils/request import type { PermisstionResponseData, MenuParams } from ./type //枚举地址 enum API {//获取全部菜单与按钮的标识数据ALLPERMISSTION_URL /admin/acl/permission…

【电商搜索】现代工业级电商搜索技术-亚马逊-经典的Item-to-Item协同推荐算法

【电商搜索】现代工业级电商搜索技术-亚马逊-经典的Item-to-Item协同推荐算法 文章目录 【电商搜索】现代工业级电商搜索技术-亚马逊-经典的Item-to-Item协同推荐算法1. 论文信息2. 算法介绍3. 创新点小结4. 实验效果5. 算法结论6. 代码实现7. 问题及优化方向1. 冷启动问题2. 稀…

computed拦截v-model

一&#xff0c;问题 在父组件和子组件中都使用v-model会打破单项数据流。 二&#xff0c;方法 基于上述问题采用computed拦截v-model <!-- 父组件 --> <template><div><my-component v-model"form"></my-component></div> &l…

Django中分组查询(annotate 和 aggregate 使用)

在 Django 中&#xff0c;aggregate() 和 annotate() 是两个常用的聚合函数。它们都可以用来对一组查询结果进行聚合操作&#xff0c;但它们的作用是有所不同的。 aggregate() 是用于聚合整个查询集的结果&#xff0c;通常用于返回一个值&#xff0c;例如计算查询集中所有结果…

Java - 数组实现大顶堆

题目描述 实现思路 要实现一个堆&#xff0c;我们首先要了解堆的概念。 堆是一种完全二叉树&#xff0c;分为大顶堆和小顶堆。 大顶堆&#xff1a;每个节点的值都大于或等于其子节点的值。 小顶堆&#xff1a;每个节点的值都小于或等于其子节点的值。 完全二叉树&#xff…

简单汇编教程10 数组

目录 实践&#xff1a;相加连续的数 数组是在内存中连续的一串变量。我这样说&#xff0c;可能你已经想到的大致的定义了&#xff1a; NUMBERS DW 34, 45, 56, 67, 75, 89 现在我们就定义了一个Number数组&#xff0c;里面存放的连续的六个数字&#xff1a;34, 45, 56, …

快速上手 Rust——实用示例

Rust 跨平台应用开发第一章&#xff1a;快速上手 Rust——实用示例 1.3 实用示例 在这一节中&#xff0c;我们将通过一系列实用的示例来帮助您更好地理解 Rust 的特性&#xff0c;并展示如何在实际项目中使用这些特性。示例将涵盖文件操作、网络请求、并发编程、命令行工具以…