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.rhkb.cn/news/462190.html

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

相关文章

Elasticsearch Interval 查询:为什么它们是真正的位置查询,以及如何从 Span 转换

作者:来自 Elastic Mayya Sharipova 解释 span 查询如何成为真正的位置查询以及如何从 span 查询过渡到它们。 长期以来,Span 查询一直是有序和邻近搜索的工具。这些查询对于特定领域(例如法律或专利搜索)尤其有用。但相对较新的 …

IoTDB时序数据库使用

简介 Apache IoTDB 是一款低成本、高性能的物联网原生时序数据库。它可以解决企业组建物联网大数据平台管理时序数据时所遇到的应用场景复杂、数据体量大、采样频率高、数据乱序多、数据处理耗时长、分析需求多样、存储与运维成本高等多种问题。 IoTDB官网 1. 连接数据库 官方…

河北冠益荣信科技公司洞庭变电站工程低压备自投装置的应用

摘 要:随着电力需求增长,供电可靠性变得至关重要,许多系统已有多回路供电。备用电源自动投入装置能提升供电可靠性,它能在主电源故障时迅速切换到备用电源。本文介绍的AM5-DB低压备自投装置,为洞庭变电站提供多种供电方…

STM32实现IAP串口升级含源码(HAL库)

文章目录 一. 关于IAP升级二. IAP升级的分类二. IAP升级原理2.1 正常启动流程2.2 IAP启动流程 三. Ymodem协议3.1 传输过程3.2 帧命令3.3 起始帧3.4 数据帧3.5 结束帧 四. IAP代码实现4.1 Boot 程序4.2 App 程序4.3 展示效果 五. Demo源码六. Qt 上位机 一. 关于IAP升级 IAP&am…

【Hello World 】

【Hello World 】! C语言实现C实现Java实现Python实现 💐The Begin💐点点关注,收藏不迷路💐 几乎每一个程序员都是从Hello World!开始自己的程序人生,作为一个初学编程的小朋友,也需要先编程来输出Hello Wo…

LabVIEW程序员赚钱不仅限于上班

LabVIEW程序员拥有多种途径来实现财富增值,而不仅仅局限于传统的全职工作。以下是一些他们可以利用自身技能和专业知识实现更高财务收益的方法: 1. 专注领域的自由职业与合同工作 制造、科研、医疗技术等行业都需要LabVIEW的专业知识。通过自由职业&…

vue3项目中el-tooltip实现内容溢出时再显示,并设置tip的最大宽度

html代码 <el-tooltip :disabled"!textIsOverflow" placement"top"><template #content><div class"tooltip-div">tootip的内容</div></template><div class"textOverflow" ref"textRef"…

文案语音图片视频管理分析系统-视频矩阵

文案语音图片视频管理分析系统-视频矩阵 1.产品介绍 产品介绍方案 产品名称&#xff1a; 智驭视频矩阵深度分析系统&#xff08;SmartVMatrix&#xff09; 主要功能&#xff1a; 深度学习驱动的视频内容分析多源视频整合与智能分类高效视频检索与编辑实时视频监控与异常预警…

HTML 基础标签——分组标签 <div>、<span> 和基础语义容器

文章目录 1. `<div>` 标签特点用途示例2. `<span>` 标签特点用途示例3. `<fieldset>` 标签特点用途示例4. `<section>` 标签特点用途示例5. `<article>` 标签特点用途示例总结HTML中的分组(容器)标签用于结构化内容,将页面元素组织成逻辑区域…

安防被动红外和主动红外

被动红外探测器是依靠被动的吸收热能动物活动时身体散发出的红外热能进行报警的&#xff0c;也称热释红外探头&#xff0c;其探测器本身是不会发射红外线的。 被动红外探测器中有2个关键性元件&#xff0c;一个是菲涅尔透镜&#xff0c;另一个是热释电传感器。**自然界中任何高…

Windows下将网盘挂载到本地使用(Docker+AList+RaiDrive)

文章目录 安装安装Docker安装Alist安装RaiDrive 安装 安装Docker Windows下安装Docker网上有很多教程&#xff0c;也可以参考我写的博客链接 3.1章节 安装Alist 官网 “切换中文”并找到“使用指南” ”安装“–>"使用Docker” 打开cmd执行如下命令启动容器 do…

C语言 | Leetcode C语言题解之第519题随机翻转矩阵

题目&#xff1a; 题解&#xff1a; typedef struct {unsigned long long val;UT_hash_handle hh; } Hash;typedef struct {Hash *hash;int n_rows;int n_cols; } Solution, SL;Solution* solutionCreate(int n_rows, int n_cols) {SL *obj malloc(sizeof(SL));obj->hash …

C++之多态(上)

C之多态 多态的概念 多态(polymorphism)的概念&#xff1a;通俗来说&#xff0c;就是多种形态。多态分为编译时多态(静态多态)和运⾏时多 态(动态多态)&#xff0c;这⾥我们重点讲运⾏时多态&#xff0c;编译时多态(静态多态)和运⾏时多态(动态多态)。编译时 多态(静态多态)主…

EtherCAT转ModbusTCP相关技术

EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关https://item.taobao.com/item.htm?ftt&id822721028899 MS-GW15 概述 MS-GW15 是 EtherCAT 和 Modbus TCP 协议转换网关&#xff0c;为用户提供一种 PLC 扩展的集成解决方案&#xff0c;可以轻松容易将 Modbu…

kafka相关面试题

文章目录 什么是消息中间件&#xff1f;kafka 是什么&#xff1f;有什么作用&#xff1f;kafka 的架构是怎么样的&#xff1f;Kafka Replicas是怎么管理的&#xff1f;如何确定当前能读到哪一条消息&#xff1f;生产者发送消息有哪些模式&#xff1f;发送消息的分区策略有哪些&…

.NET Core WebApi第7讲:项目的发布与部署

一、理解 前端跟后端拿数据&#xff0c;然后在前端页面中展示&#xff0c;就是我们要完成的事情。 把前端跟后端开发好之后&#xff0c;我们需要落地部署&#xff0c;这个时候就需要一个服务器。 服务器就是一台电脑&#xff0c;只要windows里面有一个叫IIS的管理器。 二、项目…

JAVA题目笔记(十一)多态+带有抽象类/接口的JavaBean类

一、多态定义方法并调用子类特有方法 public class Animal {private String colour;private int age;public Animal(){}public Animal(int age,String colour){this.ageage;this.colourcolour;}public String getColour() {return colour;}public void setColour(String colour…

【Visual Studio】解决 CC++ 控制台程序 printf 函数输出中文和换行符显示异常

问题描述 C&C 控制台程序 printf 函数输出中文和换行符 \n 显示异常。 #include <stdio.h>int main() {int choice;printf("菜单:\n");printf("1. 选项一\n");printf("2. 选项二\n");printf("3. 选项三\n");printf("…

从线性代数到unity mvp矩阵

坐标变换&#xff1a;矩阵是一种线性空间变换的描述&#xff08;矩阵的列向量&#xff0c;是坐标变换后的基向量&#xff09;。 如: 如上图,即向量(-1,2)在经过由基底x轴:(1, -2) ,y轴:(3, 0)组成的矩阵变换后得到向量(5,2) 实际上就是-1倍的x轴:(1, -2)加上2倍的y轴:(3,…

【ShuQiHere】 如何理解渐进符号及其应用:大 O、大 Ω 和大 Θ

List item &#x1f4d8; 【ShuQiHere】 &#x1f680; 在算法复杂度分析中&#xff0c;渐进符号&#xff08;Asymptotic Notation&#xff09;是必不可少的工具&#xff0c;帮助我们估计算法的时间和空间需求&#xff0c;特别是当输入规模非常大时。这篇文章将为大家详细介绍…