Pytest框架实战二

news2024/11/15 9:25:53

  在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:wuya

import  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:wuya

import pytest
import  requests
import  json

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

def 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)
  yield
  delProduct(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:wuya

import  pytest
import  requests
import json

def 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 erase
 py.test --cov={toxinidir} -sx test
 coverage 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.coloradmin.cn/o/1688807.html

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

相关文章

智慧医疗时代:探索互联网医院开发的新篇章

在智慧医疗时代,互联网医院开发正引领着医疗服务的创新浪潮。通过将先进的技术与医疗服务相结合,互联网医院为患者和医生提供了全新的互动方式,极大地提升了医疗服务的便捷性和效率。本文将深入探讨互联网医院的开发,介绍其技术实…

pdf加水印怎么加?3种添加水印方法分享

pdf加水印怎么加?PDF加水印不仅是为了保护文档内容,确保信息的安全性和完整性,更是一种有效的版权保护措施。通过添加水印,您可以在文档中嵌入公司名称、日期、编号等信息,以明确文档的归属权和使用限制。此外&#xf…

重学java 42.多线程 等待唤醒机制案例分析

Strength is built under a heavy load,I am expecting to pick up all of my loads and travel on. —— 24.5.24 章节重点 1.会用wait和notify两个方法 2.会使用Lock锁对象 3.会利用Cal1able接口实现多线程 4.会使用线程池完成多线程 等待唤醒案例分析(线程之间的…

SEO优化,小白程序员如何做SEO优化流量从0到1

原文链接:SEO优化,小白程序员如何做SEO优化流量从0到1 1、SEO是什么? SEO即:搜索引擎优化(Search Engine Optimization),是一种通过优化网站结构、内容和外部链接等因素,提高网站在搜索引擎中的自然排名&…

景源畅信数字:抖音小店新手该怎么做?

在数字化时代的浪潮中,抖音不仅仅是一个分享短视频的平台,更是一个充满潜力的电商平台。对于想要进入这个领域的朋友们来说,开设一家抖音小店无疑是一个既激动又迷茫的起点。那么,作为新手,该如何在这个全新的舞台上立…

在链游中,智能合约如何被用于实现游戏内的各种功能

随着区块链技术的快速发展,链游(Blockchain Games)作为区块链技术的重要应用领域之一,正逐渐展现出其独特的魅力和优势。其中,智能合约作为链游的核心技术之一,对于实现游戏内的各种功能起到了至关重要的作…

【YOLOv5/v7改进系列】替换激活函数为SiLU、ReLU、LeakyReLU、FReLU、PReLU、Hardswish、Mish、ELU等

一、导言 激活函数在目标检测中的作用至关重要,它们主要服务于以下几个关键目的: 引入非线性:神经网络的基本构建块(如卷积层、全连接层等)本质上是线性变换,而激活函数通过引入非线性,使得网络…

完成商品属性分组和商品属性关联维护

文章目录 1.前端页面搭建1.复制attrgroup-attr-relation.vue到src/views/modules/commodity下2.加入超链接和引入组件 src/views/modules/commodity/attrgroup.vue1.加入超链接2.引入组件 3.数据池加入变量4.使用组件1.引用组件2.添加方法3.测试,点击关联&#xff0…

【低照度图像增强系列(7)】RDDNet算法详解与代码实现(同济大学|ICME)

前言 ☀️ 在低照度场景下进行目标检测任务,常存在图像RGB特征信息少、提取特征困难、目标识别和定位精度低等问题,给检测带来一定的难度。 🌻使用图像增强模块对原始图像进行画质提升,恢复各类图像信息,再使用目标检测…

qt改变样式表 label

border:1px solid black; background-color:rgb(238,234,235); border-color:rgb(0,112,249);

Zabbix实现7x24小时架构监控

上篇:https://blog.csdn.net/Lzcsfg/article/details/138774511 文章目录 Zabbix功能介绍Zabbix平台选择安装Zabbix监控端部署MySQL数据库Zabbix参数介绍登录Zabbix WEBWEB界面概览修改WEB界面语言添加被控主机导入监控模板主机绑定模板查看主机状态查看监控数据解…

一文了解基于ITIL的运维管理体系框架

本文来自腾讯蓝鲸智云社区用户:CanWay ITIL(Information Technology Infrastructure Library)是全球最广泛使用的 IT 服务管理方法,旨在帮助组织充分利用其技术基础设施和云服务来实现增长和转型。优化IT运维,作为企业…

U-Boot menu菜单分析

文章目录 前言目标环境背景U-Boot如何自动调起菜单U-Boot添加自定义命令实践 前言 在某个厂家的开发板中,在进入它的U-Boot后,会自动弹出一个菜单页面,输入对应的选项就会执行对应的功能。如SD卡镜像更新、显示设置等: 目标 本…

Linux进程--函数 system 和 popen 的区别

system() 和 popen() 是 C 语言中用于执行外部命令的两个函数,它们的功能类似,但在使用方式和特性上有一些区别。 system() system() 函数允许您在程序中执行外部命令,并等待该命令执行完成后继续执行程序。其基本语法如下: in…

本地idea连接虚拟机linux中的docker进行打包镜像上传--maven的dockerfile-maven-plugin插件

项目名必须是英文,-,.,_,这些数字,idea需要管理员运行,因为idea控制台mvn命令需要管理员权限才能运行(maven需配置环境变量)改linux中的Docker服务文件,使用2375 进行非加密通信,然后加载重启 2.1 #修改Docker服务文件 vi /lib/systemd/system/docker.service ​ # 通常使…

深度学习基于Tensorflow卷积神经网络VGG16的CT影像识别分类

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 随着医疗技术的快速发展,CT(Computed Tomography)影像已成为医生…

练习题(2024/5/22)

1N 皇后 II n 皇后问题 研究的是如何将 n 个皇后放置在 n n 的棋盘上,并且使皇后彼此之间不能相互攻击。 给你一个整数 n ,返回 n 皇后问题 不同的解决方案的数量。 示例 1: 输入:n 4 输出:2 解释:如上…

WAF绕过(下)

过流量检测 这里的流量检测就是在网络层的waf拦截到我们向webshell传输的数据包,以及webshell返回的数据 包,检测其中是否包含敏感信息的一种检测方式。如果是大马的情况下,可以在大马中添加多处判断代码,因此在执行大马提供的功…

设计模式12——外观模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。 外观模式(Facade&a…

【Linux】高效文本处理命令

目录 一.sort命令(排序) 1.语法格式 2.常用选项 3.相关示例 3.1. 3.2. 二.unip命令(去重) 1.语法格式 2.常用选项 3.相关示例 3.1. 3.2. 三.tr命令(替换) 1.语法格式 2.常用选项 3.相关示例…