Pytest框架实战二

  在Pytest框架实战一中详细地介绍了Pytest测试框架在参数化以及Fixture函数在API测试领域的实战案例以及具体的应用。本文章接着上个文章的内容继续阐述Pytest测试框架优秀的特性以及在自动化测试领域的实战。

conftest.py

       在上一篇文章中阐述到Fixture函数的特性,第一是函数的返回值,第二是测试固件的特性。但是在实际的工作里面会有非常多的Fixture函数,那么怎么合理的安排更加友好呢?建议把公共的部分剥离出来统一的管理和调用,而非公共的部分就使用常规的函数来处理就可以了。在API自动化测试中公共的部分主要是认证授权的机制,也就是登录成功后返回的TOKEN在后续的请求中需要带上这个TOKEN才能够获取服务端的认可客户端才能够获取资源信息。在Pytest测试框架中可以把Fixture函数分离到conftest.py的文件中,这个文件它的特性具体如下。

  • 它是一个模块,但是这个模块不需要导入就可以使用里面的Fixture函数

  • 在目录结构的设计上,conftest.py文件建议在项目的第一层级目录结构中

  • conftest.py就是用来分离公共的Fixture函数

结合第一篇文章的案例,下来把登录认证授权代码分离到conftest.py文件中,这样测试模块使用的时候直接调用它就可以了,分离到conftest.py模块里面的代码如下。


#!/usr/bin/python3
#coding:utf-8
# author:wuyaimport  pytest
import  requests
import json@pytest.fixture()
def access_token():r=requests.post(url='http://47.95.142.233:8000/login/auth/',json={"username":"13484545195","password":"asd888"})return r.json().get('token',None)@pytest.fixture()
def headers(access_token):return {'Authorization':'JWT {token}'.format(token=access_token)}

如上是把登录认证授权的代码分离到conftest.py的文件中,下来在测试模块里面直接调用就可以了,涉及到的测试模块的代码如下:


#! /usr/bin/env python
# -*- coding:utf-8 -*-
# author:wuyaimport pytest
import  requests
import  jsondef writeID(prodctID):json.dump(str(prodctID),open('prodctID','w'))def getID():return int(json.load(open('prodctID')))def addProduct(headers):r=requests.post(url='http://47.95.142.233:8000/interface/product/',json={"name":"测试数据","product_type":"WEB","version":"1.0","master":"无涯","description":"测试"},headers=headers)writeID(prodctID=r.json()['id'])return rdef delProduct(headers):r=requests.delete(url='http://47.95.142.233:8000/interface/product/{productID}/'.format(productID=getID()),headers=headers)return r@pytest.fixture()
def init(headers):addProduct(headers)yielddelProduct(headers)def test_so_product(init,headers):'''产品搜索验证'''r=requests.get(url='http://47.95.142.233:8000/interface/products?name=测试数据',headers=headers)

如上可以看到init()函数也是Fixture函数,但是并没有分离到conftest.py文件中,理由主要是init()函数它是基于业务需求而编写的Fixture函数但是并不是公共的Fixture函数,在后面随着编写测试用例越来越多的情况下,这种基于业务的Fixture函数会特别多。如上的代码执行后的结果信息如下图所示。

图片

在企业级的API自动化测试框架中,完全的可以把conftest.py应用进去,特别是登录认证授权的这部分特性功能。

命令行解释器

       在微服务架构的产品中存在一个特性就是使用不同的租户来登录系统,访问的业务形态都是一样的,但是在底层会针对数据做隔离。正因为如此,所以就会有众多的集群模式来满足底层的计算能力。那么这样在编写的测试用例上,就需要更多的灵活性,这个灵活性主要指的是不能把登录的账户和密码写死,要满足不同的集群验证模式,那么也就意味着登录的用户是可以自定义的,但是这个自定义的用户必须是系统已被订阅的租户。这样设计的优势就是可以满足不同集群验证产品的特性以及定时轮训检测不同集群的底层计算能力和系统的稳定性。使用这部分可以使用Pytest测试框架的命令行解释权完全能够解决这部分,下面针对之前的代码进行改造,把登录系统的账户与密码完全的自定义化,改造后的代码如下。


#!/usr/bin/python3
#coding:utf-8
# author:wuyaimport  pytest
import  requests
import jsondef pytest_addoption(parser):'''添加pytest的自定义命令行参数'''parser.addoption('--username',action='store',default='13484545195',help='myoption: type1 or pyte2')parser.addoption('--password',action='store',default='asd888',help='myoption: type1 or pyte2')@pytest.fixture()
def username(request):return request.config.getoption('--username')@pytest.fixture()
def password(request):return request.config.getoption('--password')@pytest.fixture()
def access_token(username,password):r=requests.post(url='http://47.95.142.233:8000/login/auth/',json={"username":username,"password":password})return r.json().get('token',None)@pytest.fixture()
def headers(access_token):return {'Authorization':'JWT {token}'.format(token=access_token)}

在如上的代码中,完全的把登录的账户与密码分离了出来,这样就可以满足上面说的针对不同的集群以及集群规模化的验证模式,而且在上面也使用了默认的模式,也就是说执行的时候可以指定自定义的账户与密码,如下执行的方式是指定了账户与密码(自定义但是必须是指定的账户密码是系统的用户)


pytest -v  -s test_login.py --username=13588545195 --password=asd888

执行后的结果信息如下所示。

图片

也可以执行的时候使用默认命令行指定的账户与密码,执行以及执行结果如图所示。

图片

如上所示,使用Pytest的命令行解释器的特性,可以很轻松的解决了执行过程中随意的制定自定义的变量。

pytest.ini

在Pytest框架中,使用conftest.py是为了更好地分离Fixture函数,这样能够达到Fixture函数的共享机制,从而能够在各个模块以及测试函数里面调用,从而减少重复代码的数量。一般而言编写的测试类都是以Test开头,编写的测试函数都是以test开头,而所有的测试模块在test的包下,以及执行的过程中为了输出详细的信息以及打印输出的信息,在执行的时候都会带上-v与-s的命令,当然还有其他的信息。这些都是完全可以分离到pytest.ini的文件中,由它进行统一的管理。pytest.ini地工程的第一层级的位置,如下内容是pytest.ini文件内容。


[pytest]
#指定执⾏时候的默认信息
addopts= -v -s --driver Chrome --html=report.html  --reruns 3
#注册标记
markers=login:执⾏标记为login的测试函数register:执⾏标记为register的测试函数
#指定Pytest的最低版本号
minversion=3.0
#指定忽略执⾏⽬录
norecursedirs=.pytest_cache
#指定测试⽬录
testpaths=test
#指定测试模块搜索的规则
python_files=test_*
#指定测试类搜索的规则
python_classes=Test*
#指定测试函数搜索规则
python_functions=test_*

如上种指定了测试目录以及测试框架执行过程中测试的搜索规则。使用了pytest.ini的优势是后续执行过程中就不需要带上如-s这样的命令以及指定执行的目录。

tox.ini

tox.ini与pytest.ini是一样的,不过使用tox.ini可以代替pytest.ini的配置文件,而且在tox.ini的配置文件里面可以指定多个不同解释器的版本,这样的优势是在执行具体的测试用例的过程中就能够兼顾到多个不同Python解释器版本执行的情况。tox是一个命令行的工具,它允许测试在多种环境下执⾏,它的⼯作流程具体可以理解为:通过setup.py⽂件为待测程序创建源码安装包,这样就会查看tox.ini中所有的环境设置。把所有pytest.ini的配置都移动到 tox.ini⾥⾯,tox.ini文件内容如下。


[tox]
envlist = py3.5, py3.6, py3.7, py3.8, py3.9, py3.10, py3.11
skipsdist = True
indexserver =default = https://pypi.doubanio.com/simple
[testenv]
install_command = pip install -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host irrors.aliyun.com {opts} {packages}
deps =-rrequirements.txt
commands = coverage erasepy.test --cov={toxinidir} -sx testcoverage html
setenv =PYTHONPATH = {toxinidir}/py3
[testenv:dev]
deps = pytest
commands = {posargs:py.test}
[pytest]
#指定执⾏时候的默认信息
addopts= -v -s
#注册标记
markers=login:执⾏标记为login的测试函数register:执⾏标记为register的测试函数#指定Pytest的最低版本号
minversion=3.0
#指定忽略执⾏的⽬录
norecursedirs=.pytest_cache
#指定测试⽬录
testpaths=test
#指定测试模块搜索的规则
python_files=test_demo.py
#指定测试类搜索的规则
python_classes=Test*
#指定测试函数搜索规则
python_functions=test_*

如上所示,指定了多个不同Python解释器的版本。执行的命令直接就是tox,执行后就会执行指定目录下所有的测试用例并且会在指定的Python解释器版本中都会执行,执行结果如下图。

图片

在不管是UI的测试框架还是API的测试框架中,把Pytest测试框架的配置引入进去,这样执行的时候就不需要刻意的指定被执行的目录以及各种命令,更多的精力可以聚焦于测试场景的编写以及代码的封装。

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

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

相关文章

shell循环

一、for循环 用法: for 变量 in 取值列表 do 命令序列 done 例1:打印1到10的数字列表 #!/bin/bashfor i in {1..10} do echo $i done 例2:#批量添加用户,用户名存放在users.txt文件中,每行一个,初始密码均设为123456 #!/bin/bas…

KMP算法【C++】

KMP算法测试 KMP 算法详解 根据解释写出对应的C代码进行测试&#xff0c;也可以再整理成一个函数 #include <iostream> #include <vector>class KMP { private:std::string m_pat;//被匹配的字符串std::vector<std::vector<int>> m_dp;//状态二维数组…

哪些类型的产品适合用3D形式展示?

随着3D技术的蓬勃发展&#xff0c;众多品牌和企业纷纷投身3D数字化浪潮&#xff0c;将产品打造成逼真的3D模型进行展示&#xff0c;消费者可以更加直观地了解产品的特点和优势&#xff0c;从而做出更明智的购买决策。 哪些产品适合3D交互展示&#xff1f; 产品3D交互展示具有直…

自己手写一个字符串【C风格】

//字符串的常见操作 #include <iostream>#define MAX_SIZE 15 #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 typedef int Status;//状态类型 typedef char ElemType;//元素类型typedef ElemType String[MAX_SIZE 1];//第一个字节记录长度//***tring是数…

c#自动生成缺陷图像-添加新功能(可从xml直接提取目标数据,然后进行数据离线增强)--20240524

在进行深度学习时,数据集十分重要,尤其是负样本数据。 故设计该软件进行深度学习数据预处理,最大可能性获取较多的模拟工业现场负样本数据集。 该软件基于VS2015、.NETFrameWork4.7.2、OpenCvSharp1.0.0.0、netstandard2.0.0.0、SunnyUI3.2.9.0、SunnyUI.Common3.2.9.0及Ope…

C盘磁盘空间不够用,怎样将d盘的空间划分给c盘?

C盘磁盘空间不够用&#xff0c;怎样将d盘的空间划分给c盘&#xff1f; 背景&#xff1a;win10系统下。C盘原有50G&#xff0c;如今只剩下8G&#xff0c;已经捉襟见肘了&#xff0c;想从D盘&#xff0c;割100G给C盘&#xff0c;以后软件能直接装C盘了。操作步骤如下&#xff1a…

2024年人文艺术与创新教育国际学术会议(ICHAIE 2024)

2024年人文艺术与创新教育国际学术会议&#xff08;ICHAIE 2024) 2024 International Conference on Humanities, Arts and Innovation Education 一、【会议简介】 随着全球化的推进和科技的迅猛发展&#xff0c;人文艺术与创新教育在培养未来人才方面扮演着越来越重要的角色…

springboot事务结合分布式锁超卖问题

背景 商品销售扣减库存是常见的场景&#xff0c;考虑性能的可以使用redis存储库存进行扣减&#xff0c;并发小的也可以采用数据量库存占用记录实时计算方式&#xff0c;最近开发的功能由于并发量不大&#xff0c;考虑到实现简洁的因素&#xff0c;决定采用库存占用记录实时计算…

后端之路第二站(正片)——SprintBoot之:设置请求接口

这一篇讲怎么简单结合模拟云接口&#xff0c;尝试简单的后端接接口、接受并传数据 一、下载Apifox接口文档软件 目前的企业都是采用前后端分离开发的&#xff0c;在开发阶段前后端需要统一发送请求的接口&#xff0c;前端也需要在等待后端把数据存到数据库之前&#xff0c;自己…

初始MyBatis ,详细步骤运行第一个MyBatis程序,同时对应步骤MyBatis底层剖析

1. 初始MyBatis &#xff0c;详细步骤运行第一个MyBatis程序&#xff0c;同时对应步骤MyBatis底层剖析 文章目录 1. 初始MyBatis &#xff0c;详细步骤运行第一个MyBatis程序&#xff0c;同时对应步骤MyBatis底层剖析每博一文案2. 前沿知识2.1 框架&#xff08;framework&#…

剪画小程序:3个方法:告诉你如何将普通的照片转换成动漫二次元风格!

Hello&#xff01;亲爱的小伙伴们&#xff01; 你是否还在纠结于自己的自拍太普通&#xff0c;每次分享到社交账号上都觉得平平无奇&#xff0c;引不起波澜&#xff1f; 假如&#xff0c;你和朋友们一起出去玩&#xff0c;大家都开心地拍着自拍。你看着自己的照片&#xff0c…

蓝桥杯-数三角(ac代码时间复杂度分析)

问题描述 小明在二维坐标系中放置了 ( n ) 个点&#xff0c;他想在其中选出一个包含三个点的子集&#xff0c;这三个点能组成三角形。然而这样的方案太多了&#xff0c;他决定只选择那些可以组成等腰三角形的方案。请帮他计算出一共有多少种选法可以组成等腰三角形&#xff1f…

WXML模板语法-事件绑定

一、 1.事件 事件是渲染层到逻辑层的通讯方式&#xff0c;通过事件可以将用户在渲染层产生的行为&#xff0c;反馈到逻辑层进行业务的处理 2.小程序中常用的事件 3.事件对象的属性列表 当事件回调触发的时候&#xff0c;会收到一个事件对象event&#xff0c;其属性为&#x…

在uni-app 插件市场下载 SKU 插件之后,引入项目报错问题

引入&#xff1a; git 提交报错&#xff1a; 原因&#xff1a;项目使用了 eslint 语法检查 解决&#xff1a;禁用 eslint 语法规则 在<script> 标签下面添加 /* eslint-disable */ 重新提交即可

【网络技术】【Kali Linux】Wireshark嗅探(十四)QUIC(快速UDP互联网连接)协议报文捕获及分析

往期 Kali Linux 上的 Wireshark 嗅探实验见博客&#xff1a; 【网络技术】【Kali Linux】Wireshark嗅探&#xff08;一&#xff09;ping 和 ICMP 【网络技术】【Kali Linux】Wireshark嗅探&#xff08;二&#xff09;TCP 协议 【网络技术】【Kali Linux】Wireshark嗅探&…

移动硬盘容量消失无法读取的解决方案

在数字化时代&#xff0c;数据的存储和备份变得尤为重要。移动硬盘作为一种便捷、大容量的存储设备&#xff0c;受到许多人的青睐。然而&#xff0c;有时我们可能会遭遇这样的问题&#xff1a;移动硬盘不显示容量且无法访问。这种情况无疑给我们的数据存储和管理带来了巨大的困…

uniapp移动端骨架屏流程

1.使用微信开发者工具来生成骨架屏&#xff1b;在分窗模式下选择页面信息&#xff0c;下拉选择生成骨架屏&#xff1b;他会基于当前页面生成骨架屏的样式 点击确定&#xff1b; 会自动生成这两个文件&#xff1b;一个是html结构文件&#xff0c;一个是css样式文件。 然后把这两…

黄石首家Pearson VUE国际认证考试中心落户湖北理工学院

Pearson VUE 作为 Pearson 集团的专门从事计算机化考试服务的公司&#xff0c;到目前为止&#xff0c;已在全世界165 个国家授权了 4400 多个考试中心以及超过 230 家 PVUE 自有考试中心&#xff0c;其中在中国的有三百多个授权考点和 4 个自有考试中心。Pearson VUE 以其技术和…

LLaMa系列模型详解(原理介绍、代码解读):LLaMA 3

LLaMA 3 2024年4月18日&#xff0c;Meta 重磅推出了Meta Llama 3&#xff0c;Llama 3是Meta最先进开源大型语言模型的下一代&#xff0c;包括具有80亿和700亿参数的预训练和指令微调的语言模型&#xff0c;能够支持广泛的应用场景。这一代Llama在一系列行业标准基准测试中展示…

java学习四

Random 随机数 数组 静态初始化数组 数组在计算机中的基本原理 数组的访问 什么是遍历 数组的动态初始化 动态初始化数组元素默认值规则 Java内存分配介绍 数组在计算机中的执行原理 使用数组时常见的一个问题 案例求数组元素最大值 public class Test1 {public static void ma…