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;//状态二维数组…

怎样解决Redis高并发竞争Key难点?

Redis作为一种高性能的键值存储系统&#xff0c;在现代分布式系统中发挥着重要作用。然而&#xff0c;高并发场景下对同一Key的操作可能引发竞争条件&#xff0c;给系统稳定性和数据一致性带来挑战。本文将探讨如何解决这一问题&#xff0c;为读者提供有效的应对策略。 1. Red…

【002】FlexBison实现原理

0. 前言 Flex和Bison是用于构建处理结构化输入的程序的工具。它们最初是用于构建编译器的工具&#xff0c;但它们已被证明在许多其他领域都很有用。 &#xfeff; 在第一章中&#xff0c;我们将首先看一点(但不是太多)它们背后的理论&#xff0c;然后我们将深入研究一些使用它…

Mysql和Postgresql创建用户和授权命令

Mysql和Postgresql创建用户和授权命令 MySQL/MariaDB/TiDB mysql -uroot -P3306 -p 输入密码&#xff1a;xxx create user user1% identified by xxx; grant all privileges on *.* to user1%; create user user2% identified by xxx; grant all privileges on *.* to user2%;…

Winform /C# 截图当前窗体,指定区域,当前屏幕

1.当前窗体 public static Image CaptureControl(Control ctrl){System.Drawing.Bitmap bmp new System.Drawing.Bitmap(ctrl.Width, ctrl.Height);ctrl.DrawToBitmap(bmp, new Rectangle(0, 0, ctrl.Width, ctrl.Height));return bmp;}private void DownLoad(){string filePa…

java类中运行main方法时报错:找不到或无法加载主类 XXX

运行main类报了这个错 错误: 找不到或无法加载主类 XXX 经过好一番查证才找出了问题所在 原因是 maven项目的provided导致的&#xff0c;现在记录一下。 将pom.xml中标注provided的注释掉&#xff0c;就不报错了。

ERROR [internal] load metadata for docker.io/library/node:20-alpine

docker编译时报错&#xff0c;除标题外&#xff0c;还报如下信息 ERROR: failed to solve: node:20-alpine: failed to resolve source metadata for docker.io/library/node:20-alpine: failed to do request: Head "https://registry-1.docker.io/v2/library/node/mani…

常用个人信息

目录 常用联系方式我的自动思维常用媒体专业相关康米相关黑历史 常用联系方式 QQ&#xff1a;2868679921 微信&#xff1a;Commieee 邮箱&#xff1a;sharvefoxmail.com 我的自动思维 常用媒体 哔哩哔哩 专业相关 博客 康米相关 QQ&#xff1a;1203361015 黑历史 贴吧…

PyQt5学习系列之QMetaObject.connectSlotsByName

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 学习记录 QMetaObject.connectSlotsByName——自动将信号连接到槽&#xff08;函数&#xff09; 例如&#xff1a; from PyQt5.QtWidgets import QMainWindow, QPushButton from PyQt5.QtCore…

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

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

2024系统架构师--- 希赛模拟答案知识点

案例第一题&#xff1a; MVC架构包含&#xff1a;视图、控制器、模型&#xff1b; 视图&#xff08;View&#xff09;&#xff1a;视图是用户看到并与之交互的界面。视图面向用户显示相关的数据&#xff0c;并能接收用户的输入数据&#xff0c;但是它并不能进行任何实际的业务…

深入探索微软Edge:领略新一代浏览器的无限可能

深入探索微软Edge&#xff1a;领略新一代浏览器的无限可能 在当今数字化时代&#xff0c;网络浏览器已经成为我们日常生活中不可或缺的一部分。而随着技术的不断进步&#xff0c;浏览器的功能和性能也在不断提升。微软Edge作为微软推出的全新一代浏览器&#xff0c;引领着浏览…

自己手写一个字符串【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;人文艺术与创新教育在培养未来人才方面扮演着越来越重要的角色…

温故而知新-导航【面试复习】

温故而知新-导航【面试复习】 前言版权温故而知新-导航【面试复习】最后 前言 2024-5-18 00:01:31 以下内容源自《【温故而知新】【面试复习】》 仅供学习交流使用 版权 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作者是CSDN日星月云 博客主页是https://jsss…

【深度学习】ONNX介绍

ONNX&#xff08;Open Neural Network Exchange&#xff09; ONNX 是一种用于表示深度学习模型的开放格式&#xff0c;使得不同深度学习框架&#xff08;如 PyTorch、TensorFlow、Caffe2 等&#xff09;之间的模型能够相互交换。 需安装&#xff1a; pip install --upgrade o…

docker 版 mysql 主从同步

docker 版 mysql 主从同步 1、环境2、搭建主服务器实例33062.1、命令2.3、进入/mydata/mysql-master/conf 目录下新建 my.cnf2.4、修改完配置后重启 master 实例2.5、进入 mysql-master 容器2.6、master 容器实例内创建数据同步用户3、新建从服务实例 33083.1、命令3.2、进入/m…