自动化测试(三):接口自动化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单元测试框架
默认测试用例规则:
- 模块名(,py文件)以test_开头或者_test结尾
- 类名必须Test开头
- 用例名必须以test_开头
采用自动化测试(一)的Google翻译爬虫接口的一个小案例,比如:
测试库名test_Google_tran
测试模块名test_Tran_API.py
测试类名TestAPI
测试用例名test_post_message
2.2.1 pytest框架简介
框架作用:
- 发现用例:根据pytest框架默认的规则去发现并且加载测试用例
- 执行用例:将测试用例按照一定的顺序和条件执行并生成结果
- 判断结果:通过断言来判断实际结果和预测结果是否相同
- 生成报告:统计测试进度、耗时、通过率,生成报告。
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 += 1print(f"Function {func.__name__} has been called {wrapper.call_count} times.")return func(*args, **kwargs)wrapper.call_count = 0return 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 osdef 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中是否已经存在对应的数据,如果存在需要改modewith 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格式)
- 编写配置文件
- 测试用例接口关联
# 特殊字符可以使用单引号或双引号括起来employee:name: Markage: 28status: null # 空值可以表示为 null 或 ~projects:- Project A # - 表示列表中的元素- Project Bcontact: # 联系方式email: mark@example.comphone: 123-456-7890description: | # | 表示多行字符串This is a multilinestring with preserved line breaks.employer:
employer:name: Jerry
YAML动态传参(热加载)
热加载:让YAML能够调用外部函数
方法:${fuction_name(parms)}
2.3 pytest接口封装(统一请求封装)
将数量很多的用例封装为一个方法。场景:
- 统计数据
- 异常处理
- 日志监控
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
相关文章:

自动化测试(三):接口自动化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接口封装ÿ…...

Python --datetime模块
目录 1, 获取datetime时间 2, datetime与timestamp转换 2-1, datetime转timestamp 2-2, timestamp转datetime 3, str格式与datetime转换 3-1, datetime转str格式 3-2, str格式转datetime…...

顺序表链表OJ题(3)——【数据结构】
W...Y的主页 😊 代码仓库分享 💕 前言: 今天是链表顺序表OJ练习题最后一次分享,每一次的分享题目的难度也再有所提高,但是我相信大家都是非常机智的,希望看到博主文章能学到东西的可以一键三连关注一下博主…...

【Azure】Virtual Hub vWAN
虚拟 WAN 文档 Azure 虚拟 WAN 是一个网络服务,其中整合了多种网络、安全和路由功能,提供单一操作界面。 我们主要讨论两种连接情况: 通过一个 vWAN 来连接不通的 vNET 和本地网络。以下是一个扩展的拓扑 结合 vhub,可以把两个中…...

React Navigation 使用导航
在 Web 浏览器中,您可以使用锚标记链接到不同的页面。当用户单击链接时,URL 会被推送到浏览器历史记录堆栈中。当用户按下后退按钮时,浏览器会从历史堆栈顶部弹出该项目,因此活动页面现在是以前访问过的页面。React Native 不像 W…...

双指针算法,基础算法实践,基本的算法的思想,双指针算法的实现
一,定义 双指针算法是一种常用于解决数组和链表问题的算法技巧。它的核心思想是使用两个指针在数据结构中按照一定的规则移动,从而达到快速搜索或处理数据的目的。这个技巧通常用于优化算法,降低时间复杂度,提高程序的执行效率。…...

idea http request无法识别环境变量
问题描述 创建了环境变量文件 http-client.env.json,然后在*.http 文件中引用环境变量,运行 HTTP 请求无法读取环境变量文件中定义的变量。 事故现场 IDEA 版本:2020.2 2021.2 解决步骤 2020.2 版本环境变量无法读取 2021.2 版本从 2020.…...

性能测试常见的测试指标
一、什么是性能测试 先看下百度百科对它的定义 性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。我们可以认为性能测试是:通过在测试环境下对系统或构件的性能进行探测,用以验证在生产环境下系统性能…...

并发 04(Callable,CountDownLatch)详细讲解
并发 Callable 1 可以返回值 2可以抛出异常 泛型指的是返回值的类型 public class Send {public static void main(String[] args) {//怎么启动Callable//new Thread().start();Aaa threadnew Aaa();FutureTask futureTasknew FutureTask(thread);new Thread(futureTask,&qu…...

Json路径表达式
原json路径 {"timeStamp": "20220801110008","transIDO": "6ba9088c981b407fb38feasdf09","version": "1.0.0","signMethod": "md5","content": "{\"companyName\&quo…...

【uniapp 上传图片示例】
以下是 uniapp 上传图片的详细步骤示例: 定义一个方法,用于选择图片并上传: methods: {chooseImage() {uni.chooseImage({count: 1, // 最多选择的图片数量sizeType: [original, compressed], // 可以指定原图或压缩图sourceType: [album, …...

apache2配置文件 Require all granted是什么意思
修改apache2的配置文件 /etc/apache2/apache2.conf,需要增加网站代码的路径,下列配置是什么意思呢 <Directory "/var/www/html">Options FollowSymLinksAllowOverride AllRequire all granted </Directory> 1. Options Options …...

c/c++ 的一些知识
c 面向对象是一种思想,通常情况下都是以组合为主,也就是在子类里定义一个基类struct base_t {void (*method)(base_t *base_p); };struct children_t {int a;int b;base_t base;void (*method)(children_t *children_p); };children_t children_creat(i…...

Rancher上的应用服务报错:413 Request Entity Too Large
UI->rancher的ingress->UI前端(在nginx里面)->zuul->server 也就是说没经过一次http servlet 都要设置一下大小 1.rancher的ingress 当出现Request Entity Too Large时,是由于传输流超过1M。 1、需要在rancher的ingress中设置参数解决。 配置注释&a…...

【LeetCode题目详解】第八章 贪心算法 part01 理论基础 455.分发饼干 376. 摆动序列 53. 最大子序和 day31补
贪心算法理论基础 关于贪心算法,你该了解这些! 题目分类大纲如下: # 什么是贪心 贪心的本质是选择每一阶段的局部最优,从而达到全局最优。 这么说有点抽象,来举一个例子: 例如,有一堆钞票&…...

ssm+vue中国咖啡文化宣传网站源码和论文
ssmvue中国咖啡文化宣传网站源码和论文078 开发工具:idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 技术:ssm 课题背景 随着时代的发展和人们生活理念的进一步改变,咖啡业已经成为了全球经济中发展最迅猛的产业之一。…...

基于MATLAB开发AUTOSAR软件应用层Code mapping专题-part 4 Data store标签页介绍
这篇文章我们继续讲解code-mapping的Data stores页,这个页的内容对应的SIMULINK中的模块是Data store memory。 我们首先在模型中创建一个Data store memory模块,如图: Data store memory模块的作用相当于一个全局变量,我们可以在模型的功能逻辑里将一个信号存进去,在另…...

区间型动态规划典型题目:lintcode 476 · 石子归并【中等,免费】lintcode 593 · 石头游戏 II【中等 vip】
题目lintcode476 链接,描述 https://www.lintcode.com/problem/476/description 有一个石子归并的游戏。最开始的时候,有n堆石子排成一列,目标是要将所有的石子合并成一堆。合并规则如下:每一次可以合并相邻位置的两堆石子 每次…...

4. 池化层相关概念
4.1 池化层原理 ① 最大池化层有时也被称为下采样。 ② dilation为空洞卷积,如下图所示。 ③ Ceil_model为当超出区域时,只取最左上角的值。 ④ 池化使得数据由5 * 5 变为3 * 3,甚至1 * 1的,这样导致计算的参数会大大减小。例如1080P的电…...

ChatGPT Prompting开发实战(一)
一、关于ChatGPT Prompting概述 当我们使用ChatGPT或者调用OpenAI的API时,就是在使用prompt进行交互,用户在对话过程中输入的一切信息都是prompt(提示词),当然工业级的prompt与人们通常理解的prompt可能不太一样。下面…...

VB车辆管理系统SQL设计与实现
摘 要 随着信息时代的到来,信息高速公路的兴起,全球信息化进入了一个新的发展时期。人们越来越认识到计算机强大的信息模块处理功能,使之成为信息产业的基础和支柱。 我国经济的快速发展,汽车已经成为人们不可缺少的交通工具。对于拥有大量车辆的机关企事业来说,车辆的…...

java 泛型
概述 泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用。 泛型,就是类型参数。 一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。 那么类型参数理解呢? 顾名思义&…...

git 查看/配置 local/global 用户名称和用户邮箱
1、--local: 本地设置(仅对当前仓库有效) git config --local user.name “你的名称” git config --local user.email “你的邮箱” 2、--global 全局设置(对当前用户的所有仓库有效) git config --global user.name “你的名称…...

无涯教程-分类算法 - 简介
分类可以定义为根据观测值或给定数据点预测类别的过程。分类的输出可以采用"黑色"或"白色"或"垃圾邮件"或"非垃圾邮件"的形式。 在数学上,分类是从输入变量(X)到输出变量(Y)近似映射函数(f)的任务,它属于有监督…...

python venv 打包,更换路径后,仍然读取到旧路径 ,最好别换路径,采用docker封装起来
机械盘路径 /home/yeqiang/code/xxx 移动到 /opt/xxx 编辑/opt/xxx/venv/bin/activate VIRTUAL_ENV"/home/yeqiang/code/xxx/venv" 改为 VIRTUAL_ENV"/opt/xxx/venv" 下面还有这么多,参考: (venv) yeqiangyeqiang-MS-7B23:/…...

MATLAB算法实战应用案例精讲-【自然语言处理】语义分割模型-DeepLabV3
目录 1、DeepLab系列简介 1.1.DeepLabV1 1.1.1创新点: 1.1.2. 动机: 1.1.3. 应对策略: 1.2.DeepLabV2 1.2.1.创新点: 1.2.2.动机 1.2.3. 应对策略: 1.3.DeepLabV3 1.3.1创新点: 1.3.2. 动机&am…...

road to master
零、学习计划 数据库相关 索引 我以为我对数据库索引很了解,直到我遇到了阿里面试官 - 知乎 (zhihu.com)给我一分钟,让你彻底明白MySQL聚簇索引和非聚簇索引 - 知乎 (zhihu.com)聚集索引(聚类索引)与非聚集索引(非聚类…...

<深度学习基础> 激活函数
为什么需要激活函数?激活函数的作用? 激活函数可以引入非线性因素,可以学习到复杂的任务或函数。如果不使用激活函数,则输出信号仅是一个简单的线性函数。线性函数一个一级多项式,线性方程的复杂度有限,从…...

评价指标BLUE了解
BLEU (Bilingual Evaluation Understudy,双语评估基准)是一组度量机器翻译和自然语言生成模型性能的评估指标。BLEU指标是由IBM公司提出的一种模型评估方法,以便在机器翻译领域中开发更好的翻译模型。BLEU指标根据生成的句子与人工参考句子之间的词、短语…...

5G网关如何提升智慧乡村农业生产效率
得益于我国持续推进5G建设,截至今年5月,我国5G基站总数已达284.4万个,覆盖全国所有地级市、县城城区和9成以上的乡镇镇区,实现“镇镇通5G”,全面覆盖了从城市到农村的延伸。 依托5G网络的技术优势,智慧乡村…...