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 pytest


def 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 time

import 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 pytest


def 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 time

import 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 UiAutomator2Options


def 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自动化测试框架-安装篇
    作者:帅得不敢出门

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在培训班学网络安全有用吗

在当今数字化时代,网络安全问题日益凸显,成为了企业和个人关注的焦点。随着对网络安全人才需求的不断增长,各种网络安全培训班也如雨后春笋般涌现。然而,在培训班学网络安全真的有用吗? 一、网络安全的重要性与挑战 1. 信息时代的…

windows下安装python库wordCloud报错

换电脑安装wordcloud半天安装失败,记录一下遇到的坑,也给大家节省点时间。 方法1: 错误呢就是下面这个,说没c编译器,要不就去他给的地址上安装一下,我安装了一下好像没什么用,也没太敢勾选&am…

ACM模式下Java读取控制台输入注意事项及输出规范化

背景 在ACM模式下。需要我们去接受输入的参数,一般是使用Scanner去读取控制台输入的参数System.in。 不熟悉的情况下,很容易出现问题,针对常见的问题做一个总结。 一、nextXxx 如next,nextInt,nextFloat&#xff0c…

一键切换暗黑模式,这些代码片段你不可错过

文章目录 前言正文1.多主题切换2.使用 SASS 实现轻松深色模式3.动画切换浅色与深色模式4.纯 CSS 主题切换5.GitHub 风格的深色模式切换6.持久深色模式7.基本 Vue 响应式切换8.创意灯泡切换 总结 前言 如今,许多网站设计师都会为用户提供浅色和深色模式的选择。这不…

Spring之依赖注入(DI)和控制反转(IoC)——配置文件、纯注解

依赖注入 依赖注入(Dependency Injection,简称 DI)与控制反转(loC)的含义相同,只不过这两 个称呼是从两个角度描述的同一个概念。对于一个 Spring 初学者来说,这两种称呼很难理解, 下面我们将通过简单的语言来描述这两个概念。 当Java对象&…

Node.js:内置模块

Node.js:内置模块 Node.jsfs模块读取文件写入文件__dirname path模块路径拼接文件名解析 http模块创建服务 Node.js 传统的JavaScript是运行在浏览器的,浏览器就是其运行环境。 浏览器提供了JavaScript的API,以及解析JavaScript的解析引擎&a…

什么是工单管理系统?最全百科

在现代企业的客户服务和支持过程中,工单管理系统扮演着至关重要的角色。它不仅帮助企业高效地处理客户请求,还能提升客户满意度和忠诚度。本文将深入探讨工单管理系统的定义、功能、优势,并推荐使用Zoho Desk作为理想的解决方案。 一、工单管…

橙子电视 1.02 | 无广告,高清秒播,频道丰富

橙子电视版是针对智能电视和电视盒子而开发的一款在线观看电视应用软件,目前已经更名为橙色电视Live。该软件最大的特色是完全免费,并且支持几乎国内所有的电视台,无论是央视频道,还是省卫视频道应有尽有。同时为了更好的服务用户…

C++模拟实现list

C教学总目录 C模拟实现list 1、成员变量2、迭代器3、insert函数4、erase函数5、pop_back、push_front、pop_front函数6、size和clear函数7、析构函数8、拷贝构造函数9、赋值运算符重载完整代码(包含测试代码) 1、成员变量 先来看看SGI版本STL中list的实…

《高频电子线路》 —— 反馈型振荡器

文章内容来源于【中国大学MOOC 华中科技大学通信(高频)电子线路精品公开课】,此篇文章仅作为笔记分享。 反馈型振荡器基本工作原理 振荡器分类 自激:没有信号输入他激:有信号输入RC振荡器主要产生低频的正弦波&#x…

如何在Linux下安装和配置Docker

文章目录 安装前的准备在Debian/Ubuntu上安装Docker添加Docker仓库安装Docker验证安装 在CentOS/RHEL上安装Docker安装必要的软件包设置Docker仓库安装Docker启动Docker服务 Docker的基本使用拉取一个镜像运行一个容器 配置Docker创建Docker目录使用非root用户运行Docker 结语 …

1-petalinux 问题记录-根文件系统分区问题

在MPSOC上使用SD第二分区配置根文件系统的时候,需要选择对应的bootargs,但是板子上有emmc和sd两个区域,至于配置哪一种mmcblk0就出现了问题,从vivado中的BlockDesign和MLK XCZU2CG原理图来看的话,我使用的SD卡应该属于…

分类算法——支持向量机 详解

支持向量机(Support Vector Machine, SVM)的底层原理 支持向量机是一种用于分类和回归的强大机器学习算法,最常见的是用于二分类任务。SVM 的核心思想是通过找到一个最优超平面,将数据集划分成不同的类别。SVM 尤其擅长处理高维数…

系统集成项目管理工程师考试时间

系统集成项目管理基础知识考试信息 题量:共 75 道题。考试时间:该科目考试时间为上午 8:30 - 12:30(或下午 14:30 - 18:30,但通常为上午)。基础知识科目最短作答时长 90…

微服务实战系列之玩转Docker(十六)

导览 前言Q:基于容器云如何实现高可用的配置中心一、etcd入门1. 简介2. 特点 二、etcd实践1. 安装etcd镜像2. 创建etcd集群2.1 etcd-node12.2 etcd-node22.3 etcd-node3 3. 启动etcd集群 结语系列回顾 前言 Docker,一个宠儿,一个云原生领域的…

【论文解读】Med-BERT: 用于疾病预测的大规模结构化电子健康记录的预训练情境化嵌入

【论文解读】Med-BERT: 用于疾病预测的大规模结构化电子健康记录的预训练情境化嵌入 Med-BERT:pretrained contextualized embeddings on large-scale structured electronic health records for disease prediction ​ ​ 摘要:基于电子健康记录(EHR)的深度学习(DL)预…

API接口开放与安全管控 - 原理与实践

API安全是接口开放的前提条件 在API对外开放时,确保其安全性至关重要,因为API直接暴露给外部环境,容易成为攻击目标。一旦被恶意利用,可能导致数据泄露、服务滥用等严重后果。因此,通过API网关实施严格的接口安全管理…

python实现钉钉群机器人消息通知(消息卡片)

直接上代码 python """ 飞书群机器人发送通知 """ import time import urllib3 import datetimeurllib3.disable_warnings()class DingTalkRobotAlert():def __init__(self):self.webhook webhook_urlself.headers {Content-Type: applicatio…

32位汇编——通用寄存器

通用寄存器 什么是寄存器呢? 计算机在三个地方可以存储数据,第一个是把数据存到CPU中,第二个把数据存到内存中,第三个把数据存到硬盘上。 那这个所谓的寄存器,就是CPU中用来存储数据的地方。那这个寄存器有多大呢&a…

强大的接口测试可视化工具:Postman Flows

Postman Flows是一种接口测试可视化工具,可以使用流的形式在Postman工作台将请求接口、数据处理和创建实际流程整合到一起。如下图所示 Postman Flows是以API为中心的可视化应用程序开发界面。它提供了一个无限的画布用于编排和串连API,数据可视化来显示…