Python自动化测试pytest中fixtureAPI简单说明
作者:爱测试的高胖胖 发布时间:2023-02-26 21:13:42
什么是fixture
根据pytest官方文档的说明,fixture可以简单的归纳为具有以下功能的函数:
配置测试前系统的初始状态;
定义传入测试中的数据集;
为批量测试提供数据源等
与xUnit风格的setup和teardown的对比
fixture的功能与setup和teardown类似,可以实现setup和teardown的功能,但是对这些功能进行了明显的改进,主要有以下方面:
调用灵活。可以在测试函数、模块、类或整个项目中声明fixture的名称来进行调用;
使用灵活。fixture即适用于简单的单元测试又适用于复杂的功能测试。根据测试的需求可对fixture进行参数化使用,并且可对fixture进行重复使用。
fixture是以模块化方式实现的,因此允许fixture调用其他fixture函数;
teardown的实现逻辑更加清晰明了,并且方便进行管理。
fixture运行报错后,pytest的处理方式
通过上面的说明,我们可以知道fixture函数本身是允许调用其他fixture函数的。在这种情况下,测试运行的时候,其中一个fixture函数报错了,pytest的会如何处理呢?
通过pytest官方文档的说明,我们可以知道:
pytest以线性的方式顺序执行测试用例所调用的fixture函数;
当顺序较前的fixture函数执行报错后,pytest会停止执行该测试所调用的其他fixture,并且将测试标记出错;
测试标记错误,并不意味着测试未通过,只能说明测试无法尝试执行下去,因此我们需要尽可能的去为测试函数减少必要的依赖关系。
示例1:
1.在以下demo代码中,order()
返回类型存在问题,正确的应该返回一个list,我们给其返回一个None:
import pytest
@pytest.fixture
def order():
return None #正确应该返回[],我们给返回一个None
@pytest.fixture
def append_first(order):
order.append(1)
@pytest.fixture
def append_second(order, append_first):
order.extend([2])
@pytest.fixture(autouse=True)
def append_third(order, append_second):
order += [3]
def test_order(order):
assert order == [1, 2,3]
运行后结果如下:
test_order
被标记Error,并且信息提示:test setup failed
,说明是调用的fixture函数存在问题,且说明了错误原因。
2.如果是test_order
运行未通,运行信息会怎么样提醒呢?我们按照以下demo修改测试代码,修改test_order
的断言语句:
import pytest
@pytest.fixture
def order():
return [] #返回一个list
@pytest.fixture
def append_first(order):
order.append(1)
@pytest.fixture
def append_second(order, append_first):
order.extend([2])
@pytest.fixture(autouse=True)
def append_third(order, append_second):
order += [3]
def test_order(order):
assert order == [1, 2] #断言失败,正确应该是 order==[1,2,3]
运行结果如下:
test_order
被标记failed,且提醒是AssertionError
,断言出错。这说明是test_order
本身运行未通过。
2.fixture API @pytest.fixture()说明
pytest使用@pytest.fixture()
来声明fixture方法。具体如何使用,我会在文章后面进行详细说明。在此,主要来简单说明一下fixture()
。
def fixture(
fixture_function: Optional[_FixtureFunction] = None,
*,
scope: "Union[_Scope, Callable[[str, Config], _Scope]]" = "function",
params: Optional[Iterable[object]] = None,
autouse: bool = False,
ids: Optional[
Union[
Iterable[Union[None, str, float, int, bool]],
Callable[[Any], Optional[object]],
]
] = None,
name: Optional[str] = None,
) -> Union[FixtureFunctionMarker, _FixtureFunction]:
参数说明:
2.1 scope
fixture函数的作用域。作用域从小到大依次为:function(默认)
、class
、module
、package
、session
。
还可传入一个可调用对象,以实现动态修改fixture的作用域。
后面会单独写一篇文章,为大家详细介绍fixture的scope。
2.2 params
传入测试数据集,动态生成测试用例,每一条数据都单独生成一条测试用例。通过request.param
,可以获取传入的这些数据。
后面会单独写一篇文章,为大家详细介绍fixture的参数化。
2.3 autouse
fixture自动应用标识。
如果是True,则在同作用域下的测试函数,会自动调用该fixture;如果是False,则测试函数需要主动去调用该fixture。
后面会在介绍fixture调用方法的文章给大家详细说明。
2.4 ids
测试用例ID标识,与parmas
传入的参数一一对应。当未定义时,会自动生成id。
示例2:
1.传入ids参数,运行以下demo:
import pytest
@pytest.fixture(params=[1,2,3],ids=['A','B','C'])
def ids(request):
data=request.param
print(f'获取测试数据{data}')
return data
def test_ids(ids):
print(ids)
运行结果:
在执行信息中,我们可以发现ids
的三个参数和params
的三个参数一一对应显示,并且ids
的参数作为测试用例id的一部分呈现出来。
2. 修改上面demo中的代码,不传入ids参数,运行一下:
import pytest
@pytest.fixture(params=[1,2,3]) #未传入ids
def ids(request):
data=request.param
print(f'获取测试数据{data}')
return data
def test_ids(ids):
print(ids)
运行结果:
查看运行结果我们可以发现,虽然没有传入ids
,但是却自动生成了ids
。
测试结束后,我们常常以测试报告的形式来汇报测试结果,如结合allure呈现测试结果。通过ids
传入的参数可以对测试用例进行说明,这样更方便我们查看测试结果。
2.5 name
fixture的别名。fixture的name默认是@pytest.fixture
所装饰的函数的函数名。使用fixture的别名可以提高代码的阅读性。
示例3:
以下面的demo为例:
import pytest
@pytest.fixture()
def login():
print('login')
class SubClass:
def sub_login(self):
print('subcalss_login')
class TestCase:
def test_case1(self,login): #调用fixture——login
login=SubClass() #定义一个login并实例化SubClass
login.sub_login() #调用SubClass中的sub_login()
print('这是testcase1')
我们定义了一个fixture函数——login()
,同时在test_case1中实例化了一个Subclass
类,并起名为login
,然后调用了SubClass类中的sub_login()
。如果代码复杂的情况,很容易将fixture函数的login与SubClass实例的login弄混淆,增加代码的阅读的复杂度。
当我们使用fixture别名的话,在阅读代码的时候就很容易进行区分。
@pytest.fixture(name='module_login')
def login():
print('login')
class TestCase:
def test_case1(self,module_login): #使用fixture别名:module_login
login=SubClass() #定义一个login并实例化SubClass
login.sub_login() #调用SubClass中的sub_login()
print('这是testcase1')
注意:
当使用name参数后,则无法再通过@pytest.fixture所装饰的函数的函数名来进行调用,必须使用name所指定fixture别名来调用。
2.6 fixture_function
目前pytest官方文档未给出具体说明。
文末说明:
以上内容是我在阅读pytest官方文档后,依照个人理解进行整理。内容可能会有理解错误之处,欢迎大家留言指正。谢谢!
更多关于自动化测试pytest中fixtureAPI的资料请关注脚本之家其它相关文章!
来源:https://blog.csdn.net/gjj920318/article/details/118550093


猜你喜欢
- 网页离不开链接,而默认链接的表现形式总是千篇一律的蓝色文字加底线,每当我们点击它时,周围会出现虚线框,表示该链接是当前的焦点,影
- 本文实例讲述了Python实现读取TXT文件数据并存进内置数据库SQLite3的方法。分享给大家供大家参考,具体如下:当TXT文件太大,计算
- 作为一名Java工程师,由于工作需要,最近一个月一直在写NodeJS,这种经历可以说是一部辛酸史了。好在有神器Visual Studio C
- 总结:下载文件的方式a 标签配置 download 属性 (适用于下载一些静态资源)window.location.href (适用于下载一
- Go语言转换JSON数据真是非常的简单。以EasyUI的Demo为例,将/demo/datagrid/datagrid_data1.json
- 初学python,抓取搜狗微信公众号文章存入mysqlmysql表:代码:import requestsimport jsonimport
- 前言本文主要给大家介绍了关于Golang参数传递的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。关于参数传递,G
- 本文实例讲述了Python实现字符串与数组相互转换功能。分享给大家供大家参考,具体如下:字符串转数组str = '1,2,3'
- 这个教程,我们将展示如何用python创建一个井字游戏。 其中我们将使用函数、数组、if条件语句、while循环语句和错误捕获等
- 环境:Windows 10 专业版pycharm pro 2020.3django 3.2.1xadmin 选django2的版本一,安装这
- 相信大家在微信上一定被上面的这段话刷过屏,群发消息应该算是微信上流传最广的找到删除好友的方法了。但群发消息不仅仅会把通讯录里面所有的好友骚扰
- # 源码如下:#!/usr/bin/env python#coding=utf-8import osfrom PIL import Imag
- 一、this指向构造函数实例化对象在上篇文章中,我们提到了使用new和不使用new调用构造函数的区别,如下例:function Benjam
- 这里以安装简单的nonebot库为例子欧克,简明扼要,拿走点赞哟:大家想要的豆瓣源如下:因为有几个,但在这里还是建议使用国内的豆瓣源,本人感
- 情况1:在一个目录下面只有文件,没有文件夹,这个时候可以使用os.listdir在我们的桌面上有一个file目录(文件夹),里面有三个文件f
- 前言很多朋友在使用Jetbrains系列软件的时候,可能都会有一个问题,那就是鼠标右击出现的Open Folder as PyCharm P
- 由MySQL支持的列类型列在下面。下列代码字母用于描述中: M 指出最大的显示尺寸。最大的合法的显示尺寸是 255 。 D 适用于浮点类型并
- 本文实例讲述了Python使用random模块生成随机数操作。分享给大家供大家参考,具体如下:今天在用Python编写一个小程序时,要用到随
- 目录生成器nextsendthrowclose使用场景大集合的生成简化代码结构协程与并发总结生成器如果在一个方法内,包含了 yield 关键
- 首先:我们介绍一下socket什么是socket:1. socket 在操作系统中它是处于应用层与传输层的抽象层,它是一组操作起来非常简单的