Pytest固件fixture用法

2023-11-04

fixture是pytest特有的功能,它用@pytest.fixture标识,定义在函数前面。在编写测试函数的时候,可以将此函数的名称作为传入参数,pytest会以依赖注入方式将该函数的返回值作为测试函数的传入参数。

fixture主要的目的是为了提供一种可靠和可重复性的手段去运行那些最基本的测试内容。例如在测试网站的功能时,每个测试用例都要登录和退出,利用fixture就可以只执行一次,否则每个测试用例都要执行这两步也是冗余。

应用:

  1. 登录登出功能

  1. 数据初始化

语法

fixture(scope="function", params=None, autouse=False, ids=None, name=None)

  • scope 作用范围

fixture的scope有5个级别参数function(默认)、class、module、package和session。package被认为是实验性的。

·function:每个函数或方法都会调用;

·class:每个类调用一次,一个类可以有多种方法;

·module:每个.py文件调用一次,该文件内又有多个function和class;

·Session:一个session调用一次

  • params:一个可选的参数列表

params 以可选的参数列表形式存在。在测试函数中使用时,可通过 request.param 接收设置的返回值(即 params 列表里的值)。params 中有多少元素,在测试时,引用此 fixture 的函数就会调用几次。

  • autouse:是否自动执行****设置的 fixtures

当 autouse 为 True 时,测试函数即使不调用 fixture 装饰器,定义的 fixture 函数也会被执行。

  • ids:指定每个字符串 id

当有多个 params 时,针对每一个 param,可以指定 id,这个 id 将变为测试用例名字的一部分。如果没有提供 id,则 id 将自动生成。

  • name:fixture 的名称

name 是 fixtures 的名称, 它默认是你装饰的那个 fixture 函数的名称。你可以通过 name 参数来更改这个 fixture 名称,更改后,如果这个 fixture 被调用,则使用你更改过的名称即可。

调用方法

如果每次使用fixture都要通过传参的方式,则应改变原来测试方法的结构。如何不通过注入的方式让测试方法执行呢?有2种方式可选,第一种在fixture的参数中将autouse参数设置为True,这样便会自动应用所作用的范围。第二种使用@pytest.mark.usefixtures,在需要的测试方法上添加

通过fixture函数名调用



import pytest

# 首先, 在fixture函数上,加@pytest.fixture()

@pytest.fixture()

def my_method():

    print('This is itesting Speaking')



# 其次,把fixture函数的函数名作为参数,传入被测试用例

def test_use_fixtures(my_method):

    print('Please follow iTesting from wechat')


#输出 'This is itesting Speaking' 
#'Please follow iTesting from wechat'

通过 usefixtures 装饰器使用

# 在lagouAPITest项目下新建一个文件,命名为test_fixture_usage.py

import pytest



@pytest.fixture()

def my_method():

    print('This is iTesting Speaking')



# 函数直接使用fixture

@pytest.mark.usefixtures('my_method')

def test_use_fixtures():

    print('Please follow iTesting from wechat')



class TestClass1:

    # 类方法使用fixture

    @pytest.mark.usefixtures('my_method')

    def test_class_method_usage(self):

        print('[classMethod]Please follow iTesting from wechat')



# 类直接使用fixture 类中的每个方法都会调用一次

@pytest.mark.usefixtures('my_method')

class TestClass2:

    def test_method_usage_01(self):

        pass

    def test_method_usage_02(self):

        pass

通过 autouse 参数隐式使用

autouse为True时,每个text函数默认调用fixture


import pytest

# 首先, 在fixture函数上,加@pytest.fixture()

@pytest.fixture(autouse=True)

def my_method():

    print('This is itesting Speaking')



# 其次,把fixture函数的函数名作为参数,传入被测试用例

def test_use_fixtures():

    print('Please follow iTesting from wechat')

fixture带参数

import pytest



@pytest.fixture(params=['hello', 'iTesting'])

def my_method(request):

    return request.param



def test_use_fixtures_01(my_method):

    print('\n this is the 1st test')

    print(my_method)



@pytest.mark.usefixtures('my_method')

def test_use_fixtures_02():

    print('\n this is the 2nd test')

    # 注意,如果我在这里想通过print(my_mthod)来打印出fixuture提供的参数,是不行的, 因为使用usefixtures无法获取fixture的返回值,如需要fixture的返回值,则需用test_use_fixtures_01那样的调用方式

conftest.py 来共享 fixture

在 conftest.py 中定义的 fixture 不需要进行 import,pytest 会自动查找使用。 pytest 查找 fixture 的顺序是首先查找测试类(Class),接着查找测试模块(Module),然后是 conftest.py 文件,最后是内置或者第三方插件

在根目录创建conftest.py

import pytest
@pytest.fixture()
def login():
    print("这是登录")
    yield
    print("这是退出登录")


@pytest.fixture(autouse=True)
def register():
    print("这是注册")

test_demo

def test(login):
    print("this is a test")

运行test_demo,可以看到先调用了注册接口,因为该fixture的autouse是True。

通过函数名调用login 输出yield之前的语句,在该test执行后,输出了yield之后的语句。

在 pytest 的 fixture 里,yield关键字语句之前的属于 set up,而 yield 以后的语句属于 tear down。

 

所有的测试前置及后置功能均可以定义在 conftest.py 文件中,供整个测试使用,而不必在每一个测试类中定义

fixture 与parametrize 结合实现参数化

如果测试数据需要在 fixture 方法中使用,同事也需要在用例中使用,可以让 parametrize 的 indirect 参数为 True

def parametrize(self, argnames, argvalues, indirect=False, ids=None, scop=None):
indirect = True,pytest 会把 argnames 当做函数执行,将 argvalues 作为参数传入到 argnames

import pytest

# 方法名作为参数
test_user_data = ['Tom', 'Jerry']
@pytest.fixture(scope='module')
def login_r(request):
	# 通过 request.param 获取参数
	user= request.param
	print(f"/n 登录用户: {user}")
	return user

@pytest.mark.parametrize("login_r", test_user_data, indirect=True)
def test_login(login_r):
	a = login_r
	print(f"用例中 login 的返回值; {a}")
	assert a != ""

执行结果:

 

 

综上,当 indirect = True 时,会将 login_r 作为参数,test_user_data 作为参数传入 login_r 中,生成多条测试数据。通过 return 将结果返回。当调用 login_r 可以获取到 login_r 这个方法的返回数据。
 

典型使用场景-登录登出

最典型的使用场景:登录功能,有些功能需要登录才能使用,例如支付功能和查看购物车,而浏览商品功能不需要登录。

fixture实现步骤如下:

(1)导入pytest。

(2)创建login()函数。

(3)在login()函数上加@pytest.fixture()。

(4)在要使用的测试方法中传入(登录函数名称),也就是先执行login()函数再执行本测试方法。

(5)不传入参数表明不需要登录,此时可以直接执行测试方法。


import pytest


@pytest.fixture()
def login():
    print("用户名登录")
def test_cart(login):
    print("登录后查看购物车")
def test_find_goods():
    print("不登录浏览商品")
def test_pay(login):
    print("登录后执行支付")


if __name__ == '__main__':
    pytest.main(['-s','test.py'])

如图,在test_cart里,调用了login,因为查看购物车需要先登录。当测试用例执行时,会先执行login,将输出结果传给test_cart,然后执行test_cart.

典型使用场景-模块级别数据清理

测试方法后需要销毁并清除的数据该如何处理呢?可以用tesrdownClass,这里介绍用fixture方法。

通过在同一模块中加入yield关键字,当执行fixture时,第一次执行至yield,当整个模型的用例都执行结束后,继续执行fixture内的yield之后的语句。

步骤如下:(1)添加@pytest.fixture(scope=module)语句。

(2)在登录的方法中添加yield,之后添加销毁清除的步骤。



import pytest


@pytest.fixture(scope="module")
def open():
    print("open broswer,open baidu")
    yield
    print("close broswer")#teardown

def test_cart():
    print("登录后查看购物车")
def test_find_goods(open):
    print("不登录浏览商品")
def test_pay():
    print("登录后执行支付")


if __name__ == '__main__':
    pytest.main(['-s','test.py'])

可以看到,第二个test里调用了fixture,在该test前执行了fixture,在最后执行fixture中yield之后的语句。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pytest固件fixture用法 的相关文章

随机推荐

  • C++的智能指针如何赋值

    随着C 语言的发展 出现了一个新的功能 那便是 智能指针 而智能指针如何赋值 我来在此探讨一下 目录 1 如何给新创建的智能指针赋值 2 将普通指针赋值给智能指针 3 智能指针赋值给智能指针 shared ptr互相之间赋值 unique
  • go : GoLand安装及环境配置

    前因后果 新学期新气象 开学的第一节课是zw老师的区块链技术与应用领域 congratulations 涉及编程实验 使用Go语言 需要安装GoLand软件进行下一步 Go语言下载地址 golang下载链接 进去之后选择对应的版本下载 这里
  • linux 开启审计功能及规则配置

    推荐阅读 浅谈linux 内核网络 sk buff 之克隆与复制 深入linux内核架构 进程 线程 了解Docker 依赖的linux内核技术 查询审计功能 service auditd status 审计日志文件目录 var log a
  • 如何提高测试用例覆盖率?阿里测试工程师是这样说的

    我们将讨论测试覆盖率的相关问题 以及它如何帮助提高软件质量的 测试覆盖率概述 测试覆盖率被定义为一种测试技术指标 它表明我们的测试用例是否真正完全覆盖了应用程序代码中的各种可能以及在运行这些测试用例时执行了多少代码 如果有10个需求并创建了
  • VS2019搭建linux开发环境

    开发环境 VMware Workstation Lite 15 5 1 链接 https pan baidu com s 1njZ0OOoDZohyJ4CZgMU1AQ 提取码 je0e Ubuntu64 链接 https pan baid
  • JAVA WEB Resource interpreted as Stylesheet but transferred with MIME type text/html

    在本地tomcat上时 用Chrome访问都没问题 CSS能加载且有效果 系统正常 部署到端Tomcat时 Chrome访问时能加载CSS文件 但是没有样式效果 我的项目中加了过滤器 统一了返回的类型为text html 根据请求类型 设置
  • 中级深入--day18

    Selenium Selenium是一个Web的自动化测试工具 最初是为网站自动化测试而开发的 类型像我们玩游戏用的按键精灵 可以按指定的命令自动操作 不同是Selenium 可以直接运行在浏览器上 它支持所有主流的浏览器 包括Phanto
  • 创建脚手架(控制台命令行)

    创建脚手架 控制台命令行 commander文档 说明 命令行项目用来初始化项目的前置条件 简单使用const program require commander program version 0 0 1 v version 输出版本号
  • Nodejs实现通用的加密和哈希算法(MD5、SHA1、Hmac、AES、Diffie-Hellman、RSA),crypto模块详解

    crypto crypto模块的目的是为了提供通用的加密和哈希算法 hash 用纯JavaScript代码实现这些功能不是不可能 但速度会非常慢 Nodejs用C C 实现这些算法后 通过cypto这个模块暴露为JavaScript接口 这
  • spring security 5 (9)-httpBasic基本认证

    httpBasic是由http协议定义的最基础的认证方式 每次请求时 在请求头Authorization参数中附带用户 密码的base64编码 参考base64 这个方式并不安全 不适合在web项目中使用 但它是一些现代主流认证的基础 而且
  • 尚硅谷阳哥springcloud父工程pom文件依赖爆红

    问题描述 依赖爆红 并报Dependency mysql mysql connector java 5 1 47 not found 等错误 原因分析 maven仓库中不存在此jar版本 解决方案 在本地maven仓库中找到各依赖的对应版本
  • 创客科学竞赛

    谈起令学习机器人教育的孩子最兴奋的事情是什么 那恐怕就是机器人科技竞赛了 格物斯坦小坦克认为参加机器人竞赛的有益之处太多 首先塑造参与意识 培养学习积极性 让孩子从被动学习到主动学习的最佳锻炼方法就是把知识运用到实践当中 塑造勇敢 自信的个
  • Docker安装MySQL和Redis

    docker 安装中间件 1 Linux安装docker 1 centos安装docker 1 卸载之前的docker sudo yum remove docker docker client docker client latest do
  • shell 脚本关键字&符号

    shell概念 shell 既是一种解释型编程语言 也是一个这种编程语言的解释器的名字 shell是解释型语言 就是解释器会一条一条的翻译每一条语句并执行 对比之下 C语言是编译型语言 编译器把整个工程编译成可执行文件才能执行 在没有续行符
  • PostMan接口测试(很全面的接口测试教程)

    一 理论部分 1 前言 在前后端分离开发时 后端工作人员完成系统接口开发后 需要与前端人员对接 测试调试接口 验证接口的正确性可用性 而这要求前端开发进度和后端进度保持基本一致 任何一方的进度跟不上 都无法及时完成功能模块的测试 做为后端开
  • java BigDecimal 保留两位小数

    在 Java 中 可以使用 setScale 方法来设置 BigDecimal 对象的小数位数 以下是一个例子 演示了如何将 BigDecimal 对象保留两位小数 BigDecimal number new BigDecimal 3 14
  • 图片,图集打入ab包的依赖关系、Include in build

    我们将ab包解开之后 发现一张图片打成ab包里面包含有1张sprite和一张texture2d 这是因为我们没有打图集 unity自动给我们生成了单张图片的图集 这样不利于ui合批 打包图片 未打图集 一个文件夹 n张图片 打入一个ab包
  • C#去掉文件夹或文件名非法字符

  • HP电脑安转虚拟机搭建ubuntu环境

    下载虚拟机vmstation 下载ubuntu iso文件 安转vmstation 进入bios打开虚拟化硬件开关 配置网络代理以及dns 使得可以上网 主要修改 etc apt apt conf文件 以及 etc resolv conf配
  • Pytest固件fixture用法

    fixture是pytest特有的功能 它用 pytest fixture标识 定义在函数前面 在编写测试函数的时候 可以将此函数的名称作为传入参数 pytest会以依赖注入方式将该函数的返回值作为测试函数的传入参数 fixture主要的目