自动化测试(三):接口自动化pytest测试框架

文章目录

  • 1. 接口自动化的实现
  • 2. 知识要点及实践
    • 2.1 requests.post传递的参数本质
    • 2.2 pytest单元测试框架
      • 2.2.1 pytest框架简介
      • 2.2.2 pytest装饰器
      • 2.2.3 断言、allure测试报告
      • 2.2.4 接口关联、封装改进
      • YAML动态传参(热加载)
    • 2.3 pytest接口封装(统一请求封装)
  • 参考

1. 接口自动化的实现

API:Application Programming Interface
接口自动化按照自动化的工具可分为

基于接口测试工具的接口自动化

  • eg1:Postman+Newman+git/Svn+Jenkins(基于Javascript语言)接口自动化

Postman:创建和发送 API 请求,并对响应进行断言和验证。
Newman: Postman 的命令行工具,它允许测试人员在没有界面的情况下运行 Postman 集合。常用于在 CI/CD 流程中自动化运行 API 测试。
Git:版本控制工具
Jenkins:CI/CD 流程中用于自动化构建、测试和部署应用程序。可以设置定期或事件触发的构建任务,将 Postman 集合和 Newman 集成到自动化测试流程中。
持续集成(Continuous Integration)和持续交付(Continuous Delivery): CI在每次代码提交时自动触发构建和测试过程,CD自动将构建通过多个环境(如开发、测试、预生产)传递到生产环境以确保软件随时可以被部署到生产环境。

  • eg2:Jmeter+Ant+Git/Svn+Jenkins(基于Java和BeanShell语言)接口自动化

JMeter:性能测试工具,可模拟多种负载和场景,以测试 API 的性能和可靠性。
Ant:用于自动构建和部署 Java 项目的构建工具。它可以用来执行 JMeter 测试计划并生成测试报告。

基于代码的接口自动化(本质是轻量型的框架)

  • Python为主(复杂脚本比Java简单),常用第三方库

Requests:与 API 和网络服务的交互
PyYAML :在 Python 中解析和生成 YAML 数据。YAML 是一种轻量级的数据序列化格式,常用于配置文件和数据交换。

XML&Json&YAML:在作为配置文件的时候,这三种格式都很常用;在数据传输的时候, XML和JSON很常见, 尤其是JSON,在API的开发中现在变得越来越普及;从文件大小上来说, 同样的数据集。YAML文件最小, JSON次之,XML最大。

pytest:pytest 是 Python 中广泛使用的测试框架,使编写测试用例更加便捷。
Allure:allure-pytest 是 pytest 的插件,用于生成详细且吸引人的测试报告,与 Allure 测试报告框架集成。
logging:logging 是 Python 内置的日志模块,用于记录应用程序运行时的消息,方便调试和监控。

基于平台的接口自动化:测试开发。

平台能够跟进产品序列

本接口自动化及pytest测试实践属于代码自动化

2. 知识要点及实践

2.1 requests.post传递的参数本质

body
在这里插入图片描述
在这里插入图片描述
Response对象:
在这里插入图片描述

2.2 pytest单元测试框架

默认测试用例规则:

  1. 模块名(,py文件)以test_开头或者_test结尾
  2. 类名必须Test开头
  3. 用例名必须以test_开头

  采用自动化测试(一)的Google翻译爬虫接口的一个小案例,比如:
  测试库名test_Google_tran
  测试模块名test_Tran_API.py
  测试类名TestAPI
  测试用例名test_post_message
在这里插入图片描述

2.2.1 pytest框架简介

框架作用:

  1. 发现用例:根据pytest框架默认的规则去发现并且加载测试用例
  2. 执行用例:将测试用例按照一定的顺序和条件执行并生成结果
  3. 判断结果:通过断言来判断实际结果和预测结果是否相同
  4. 生成报告:统计测试进度、耗时、通过率,生成报告。

PS:可以和很多工具,比如selenium,appium等结合使用,可以使用很多插件,比如allure。

插件举例 (插件本质也是第三方库):

  • allure-pytest:生成allure报告
  • pytest-cov:用于代码覆盖率分析。生成代码覆盖率报告,帮助了解测试覆盖的情况。
  • pytest-html:生成漂亮的 HTML 格式测试报告,包括测试结果、用例名称、时间等信息,方便查看和分享。
  • pytest-xdist:允许并行运行测试,多线程加速测试过程。适用于拥有多个 CPU 核心的机器。
  • pytest-ordering:标记测试用例的执行顺序
  • pytest-selenium:支持使用 Selenium 进行 Web UI 测试。
  • pytest-returnfailers:失败用例重跑
  • pytest-base-url:管理基础路径

框架结构:(命名规则影响到框架检索)
LearningAutoTesting/
   |- common/ --封装库名
   |    |- api.py
   |    |- …
   |- testcase/ --测试库名
   |    |- test_api.py --测试模块名
   |    |- …
   |- run.py --测试用例运行
   |- conftest.py --全局测试配置
   |- requirements.txt --依赖名

用例的执行
可以直接运行run.py:pytest.main([‘–capture=sys’])
可以在LearningAutoTesting路径下用命令行pytest -vs

  注意pytest.ini配置文件,框架会自动检索并用于配置pytest 运行测试时的一些参数和选项。pytest.ini 文件为整个项目设置一致的默认配置,提高了可维护性和可读性。下面是配置文件常用内容举例:
在这里插入图片描述

执行测试用例前后的操作:

方法一:同unittest
  在 pytest 中,用于在测试用例执行前后执行操作的关键字是 setup 和 teardown,但是在 pytest 中,更推荐使用 setup 和 teardown 的变种,即 setup_method 和 teardown_method。

setup_method:在每个测试方法(测试用例)执行前都会调用。适用于需要在每个测试之前执行初始化操作的情况。
teardown_method:在每个测试方法执行后都会调用。适用于需要在每个测试之后执行清理操作的情况。
setup_class :在整个测试类的生命周期中只会执行一次,不同于 setup_method。

方法二:采用fixture固件,灵活设置方法的前后操作。

Python 中的装饰器是一种特殊的语法和功能,用于修改或增强函数或类的行为。装饰器可以在不修改原始函数或类代码的情况下,对它们进行功能性的扩展、修改或包装。装饰器通常是函数,它接受一个函数或类作为参数,并返回一个新的函数或类。

def count_calls(func):
    def wrapper(*args, **kwargs):
        wrapper.call_count += 1
        print(f"Function {func.__name__} has been called {wrapper.call_count} times.")
        return func(*args, **kwargs)
    wrapper.call_count = 0
    return wrapper

@count_calls
def my_function():
    print("Hello, world!")

my_function()

输出:

Function my_function has been called 1 times.
Hello, world!
Function my_function has been called 2 times.
Hello, world!

@pytest.fixture:用于定义固件或者叫夹具(fixture),固件是一种可以在测试用例中重复使用的资源或数据,例如数据库连接、临时文件、模拟对象等。它可以用来随心所欲的设置前后置操作。
在这里插入图片描述
装饰器用法,调整这5个参数进行使用。作用域一般是函数级别或者会话级别。

fixture的手动调用:在test_case(self,固件名)

在这里插入图片描述
其中yeild是一个生成器。可以用来传递返回值

当一个函数中包含了 yield 关键字时,它就变成了一个生成器函数。生成器函数可以被调用,但不会立即执行,而是返回一个生成器对象。每次调用生成器对象的 next() 方法(或使用 next() 函数)时,函数会执行直到遇到 yield,然后产生一个值并暂停。下次调用时,函数从上次暂停的地方继续执行,直到再次遇到 yield 或函数结束。

自动调用: 如果只有autouse参数为true,则同setup_作用域。

固件传参:数据驱动,可以通过参数化来实现一种类似于迭代的行为。当您使用 params 参数来传递多个参数时,fixture 将会为每组参数运行一次测试函数,并在每次测试运行时提供不同的准备工作。
在这里插入图片描述

2.2.2 pytest装饰器

@pytest.fixture:用于定义夹具(fixture),夹具是一种可以在测试用例中重复使用的资源或数据,例如数据库连接、临时文件、模拟对象等。

对固件驱动。1. 主要用于准备测试所需的数据、对象、环境等,并在测试结束后进行清理操作,以确保测试之间不会相互影响。2. 通过将常见的测试准备和清理逻辑封装到 fixture 中,您可以在多个测试用例中重复使用,从而避免重复编写相同的代码。3. fixture 可以用于管理外部资源,如数据库连接、文件句柄等,以确保资源在测试完成后被释放。

@pytest.mark.parametrize:用于参数化测试,允许你通过多个参数组合运行同一个测试用例,以减少重复的测试代码。

对数据驱动:@pytest.mark.parametrize(参数名,参数值-列表或者元组),数据中有多少值就会执行多少次。用于在一个测试用例中多次运行,每次使用不同的参数,即使用不同的输入数据运行相同的测试逻辑

在这里插入图片描述

@pytest.mark.skip@pytest.mark.skipif:用于跳过指定的测试用例,前者是无条件跳过,后者可以根据条件来决定是否跳过。

@pytest.mark.xfail:用于标记预期失败的测试用例,即使测试用例失败了,也不会导致整个测试过程失败。

@pytest.mark.parametrize:用于参数化测试,让你可以为测试用例指定多组参数,使得同一个测试用例可以多次运行。

@pytest.mark.timeout:用于为测试用例设置最大运行时间,如果测试用例运行时间超过指定时间,将会被中断。

@pytest.mark.parametrize:用于将标记应用于测试用例,例如自定义标记,用于组织测试用例。

@pytest.mark.usefixtures:用于在测试函数中自动使用指定的夹具,不需要在参数列表中指定。

@pytest.mark.filterwarnings:用于过滤特定类型的警告,以便在测试运行期间不显示特定的警告信息。

@pytest.mark.raises:用于断言某个异常被正确地引发,用于测试代码中是否抛出了预期的异常。

2.2.3 断言、allure测试报告

  还需要安装allure,才能通过os模块调用,这里仅放一个基础使用例子,在该系列的后续文章**自动化测试(四)**中细讲。

2.2.4 接口关联、封装改进

接口关联场景:在测试中,一个系统通常会被分解成多个子系统或模块,这些子系统之间需要通过接口进行数据传递和交互。比如test1中验证了能够获得tokens,test2需要使用test1的tokens。

方法一:对于流水线测试,中间数据传输比较少的话,可以在 pytest 的 fixture 中使用 yield 语句来在 fixture 的生命周期内传递参数,并确保 yield 生成的数据被另外一个测试用例以函数名称传输的方式捕获。
方法二:用文件、数据库保存,常用yaml文件。用文件或者数据库统一管理中间变量。
common\yaml_uitl.py文件

# 提前构建一个yaml文件
import yaml
import os

def read_yaml(key):
    # 使用 with 会自动管理文件的打开和关闭
    with open(os.getcwd() + "/extract.yaml", encoding="utf-8") as f:
        value = yaml.load(stream=f, Loader=yaml.FullLoader)  # 自动将yaml结构体
        print(value)
        return value[key]


def write_yaml(data):
    # 理论上还需要检测yaml中是否已经存在对应的数据,如果存在需要改mode
    with open(os.getcwd() + "/extract.yaml", encoding="utf-8", mode='a') as f:
        yaml.dump(data, stream=f, allow_unicode=True)


if __name__ == "__main__":
    print(read_yaml("employee"))
    write_yaml({"employer": {"name": "Jerry"}})
    print(read_yaml("employer"))

在这里插入图片描述
一般在conftest文件中设置clear_yaml函数。接口关联时使用yaml_util直接写入、读取json数据即可。

YAML 文件人类易读性比Json好,可以和json之间灵活转换(load后就是json格式)

  1. 编写配置文件
  2. 测试用例接口关联
# 特殊字符可以使用单引号或双引号括起来

employee:
  name: Mark
  age: 28
  status: null  # 空值可以表示为 null 或 ~
  projects:
    - Project A  # - 表示列表中的元素
    - Project B
  contact: # 联系方式
    email: mark@example.com
    phone: 123-456-7890
  description: |   # | 表示多行字符串
    This is a multiline
    string with preserved line breaks.employer:
employer:
  name: Jerry

YAML动态传参(热加载)

热加载:让YAML能够调用外部函数
方法:${fuction_name(parms)}

2.3 pytest接口封装(统一请求封装)

 将数量很多的用例封装为一个方法。场景:

  1. 统计数据
  2. 异常处理
  3. 日志监控

eg1:以处理数据为例,将待翻译的内容封装成GoogleTranslate.py中的google_translator类。

eg2:以日志监控为例,封装后在SendRequest类方法中打印日志即可,因为所有的用例中都会调用SendRequest类方法。同时自建的类只初始化一次session对象(能够自动关联cookie,所有请求都在一个通话里面),而google_translator类with requests.Session() as s,或者request方法源码也是先from . import sessions然后with sessions.Session() as session,cookie都只用了一次

为什么可以requests.Session(),而不需要requests.sessions.Session()?
  requests 库在设计时采用了适当的模块导入机制和命名空间。这样的设计使得库的使用更加便捷和一致。当你使用 import requests 导入 requests 模块时,你实际上导入了 requests 包中的 init.py 模块。然后,requests 包内的各个子模块和类都会在 requests 命名空间下变得可用。

在这里插入图片描述

参考

b站2023年课程p1-p9

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

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

相关文章

Android 绘制之文字测量

drawText() 绘制文字 绘制进度条:paint.strokeCap Paint.CAP.RONUD 线条两边样式 设置文字字体:paint.typeFace Resources.Compat.getFont(context,font) 设置加粗 paint.isFakeBoldText 设置居中: paint.setTextAlign Paint.Align.CENTER //居中, 并不是真正的居中 往…

农村农产品信息展示网站的设计与实现(论文+源码)_kaic

摘 要 随着软件技术的迅速发展,农产品信息展示的平台越来越多,传统的农产品显示方法将被计算机图形技术取代。这种网站技术主要把农产品的描述、农产品价格、农产品图片等内容,通过计算机网络的开发技术,在互联网上进行展示,然后通过计算机网…

Win11共享文件,能发现主机但无法访问,提示找不到网络路径

加密长度选择如下: 参考以下链接: Redirectinghttps://answers.microsoft.com/zh-hans/windows/forum/all/win11%E8%AE%BE%E7%BD%AE%E6%96%87%E4%BB%B6%E5%A4%B9/554343a9-d963-449a-aa59-ce1e6f7c8982?tabAllReplies#tabs

小研究 - Android 字节码动态分析分布式框架(五)

安卓平台是个多进程同时运行的系统,它还缺少合适的动态分析接口。因此,在安卓平台上进行全面的动态分析具有高难度和挑战性。已有的研究大多是针对一些安全问题的分析方法或者框架,无法为实现更加灵活、通用的动态分析工具的开发提供支持。此…

linux字符串处理

目录 1 C 截取字符串,截取两个子串中间的字符串2 获取该字符串后面的字符串用 strstr() 函数查找需要提取的特定字符串,然后通过指针运算获取该字符串后面的字符串用 strtok() 函数分割字符串,找到需要提取的特定字符串后,调用 strtok() 传入…

十四五双碳双控时代下的“低碳认证”

目录 前言 十四五双碳双控时代下的“低碳认证” 一、关于“低碳认证” 二、低碳认证优势 三、环境产品认证EPD 四、EPD相关运营机构 五、碳中和相关机构 六、EPD的认证流程 七、低碳产品认证认证流程和要求 八、相关机构认证证书样例 九、证书附件表 前言 通过本篇文…

DOCKER 部署 webman项目

# 设置基础镜像 FROM php:8.2-fpm# 安装必要的软件包和依赖项 RUN apt-get update && apt-get install -y \nginx \libzip-dev \libpng-dev \libjpeg-dev \libfreetype6-dev \&& rm -rf /var/lib/apt/lists/*# 安装 PHP 扩展 RUN docker-php-ext-configure gd …

探讨C#、C++和Java这三门语言在嵌入式的地位

我理解对于初入嵌入式领域的担忧。你是想选择一款通用性最广的语言专心学习,但是不知如何选择,视频后方提供了免费的嵌入式学习资源,内容涵盖入门到进阶,需要的到后方免费获取。因为我也曾是一名计算机专业毕业生。通过一段时间的…

无涯教程-Python机器学习 - Analysis of Silhouette Score函数

剪影得分的范围是[-1,1]。其分析如下- 1分数-接近1 剪影分数表示样本距离其邻近簇很远。 0分数-0 剪影分数表示样本在将两个相邻聚类分隔开的决策边界上或非常接近。 -1分数-1 剪影分数表示样本已分配给错误的聚类。 Silhouette得分的计算可以使用以下公式完成 $$剪影得…

计算机竞赛 基于大数据的股票量化分析与股价预测系统

文章目录 0 前言1 课题背景2 实现效果3 设计原理QTChartsarma模型预测K-means聚类算法算法实现关键问题说明 4 部分核心代码5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 基于大数据的股票量化分析与股价预测系统 该项目较为新颖…

执行jmeter端口不够用报错(Address not available)

执行jmeter端口不够用报错(Address not available) linux解决方案 // 增加本地端口范围 echo 1024 65000 > /proc/sys/net/ipv4/ip_local_port_range// 启用快速回收TIME_WAIT套接字 sudo sysctl -w net.ipv4.tcp_tw_recycle1// 启用套接字的重用 sudo sysctl -w net.ipv4.t…

LLM-Rec:基于提示大语言模型的个性化推荐

1. 基本信息 论文题目:LLM-Rec: Personalized Recommendation via Prompting Large Language Models 作者:Hanjia Lyu, Song Jiang, Hanqing Zeng, Yinglong Xia, Jiebo Luo 机构:University of Rochester, University of California Los Angeles, Meta AI, University of Ro…

STM32f103入门(4)对射式红外传感器计次(外部中断)

中断:在主程序运行过程中,出现了特定的中断触发条件 (中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序处理完成后又返回原来被暂停的位置继续运行中断优先级:当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进…

Oracle监听器启动出错:本地计算机上的OracleOraDb11g_home1TNSListener服务启动后又停止了解决方案

在启动oracle的服务OracleOraDb11g_home1TNSListener时,提示服务启动后又停止了。 解决方法: 修改oracle安装目录下的两个配置文件: 以上两个文件,对应的HOST的值,都改为127.0.0.1 然后再启动服务,启动成…

秒懂算法2

视频链接 : 希望下次秒懂的是算法题_哔哩哔哩_bilibili P1094 [NOIP2007 普及组] 纪念品分组 原题链接 : [NOIP2007 普及组] 纪念品分组 - 洛谷 思路 : 排序 贪心 双指针首先先对输入进来的数组进行排序(由小到大)运用贪心的思想 : 前后结合,令l1,rn,若a[l]a[r]<w…

Linux centos7 bash编程(小练习)

一、打印九九乘法口诀 这一个for循环嵌套的小练习&#xff0c;难度不大。提供一种写法&#xff0c;供参考&#xff1a; #!/bin/bash # 文件名&#xff1a;99table.sh # 打印输出九九乘法口诀表 for i in {1..9} do for ((j1;j<$i;j)) do …

⛳ Docker 安装 MySQL

&#x1f38d;目录 ⛳ Docker 安装 MySQL&#x1f69c; 一、搜索 mysql , 查看版本&#x1f3a8; 二、拉取mysql镜像&#x1f463; 三、建立容器的挂载文件&#x1f9f0; 四、创建mysql配置文件&#xff0c;my.conf&#x1f3ed; 五、根据镜像产生容器&#x1f381; 六、远程连…

2023MySQL+MyBatis知识点整理

文章目录 主键 外键 的区别&#xff1f;什么是范式&#xff1f;什么是反范式&#xff1f;什么是事务&#xff1f;MySQL事务隔离级别&#xff1f;MySQL事务默认提交模式&#xff1f;MySQL中int(1)和int(10)的区别MySQL 浮点数会丢失精度吗&#xff1f;MySQL支持哪几种时间类型&a…

线性数据结构:数组与链表的探索与应用

文章目录 1. 数组&#xff1a;连续存储的有序元素集合1.1 创建和访问数组1.2 数组的搜索与排序 2. 链表&#xff1a;非连续存储的动态数据结构2.1 单链表与双链表2.2 链表的操作与应用 3. 数组与链表的比较与应用3.1 数组与链表的比较3.2 数组与链表的应用 4. 总结与展望 &…

【Go 基础篇】切片:Go语言中的灵活数据结构

在Go语言中&#xff0c;切片&#xff08;Slice&#xff09;是一种强大且灵活的数据结构&#xff0c;用于管理和操作一系列元素。与数组相比&#xff0c;切片的大小可以动态调整&#xff0c;这使得它成为处理动态数据集合的理想选择。本文将围绕Go语言中切片的引入&#xff0c;介…