首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

pytest fixture产生返回生成器而不是对象

pytest 是一个流行的 Python 测试框架,它提供了 fixture 功能来帮助设置和清理测试环境。fixture 可以返回各种类型的对象,包括生成器。如果你发现 pytest fixture 返回的是一个生成器而不是对象,这通常是有意为之,用于提供惰性计算或按需生成数据。

基础概念

Fixture: 在 pytest 中,fixture 是一种可重用的函数,它可以设置测试所需的资源,并在测试完成后进行清理。Fixture 可以通过装饰器 @pytest.fixture 来定义。

生成器 (Generator): 生成器是一种特殊的迭代器,它允许你在函数中使用 yield 表达式来产生一系列的值。每次调用生成器的 next() 方法时,它会执行到下一个 yield 语句并返回其后的值。

优势

  1. 惰性计算: 生成器只在需要时才计算下一个值,这对于处理大量数据或无限序列非常有用。
  2. 节省内存: 由于生成器一次只产生一个值,它们不需要将整个数据集加载到内存中。
  3. 可重用性: 通过将复杂的数据生成逻辑封装在 fixture 中,可以在多个测试中重复使用。

类型与应用场景

  • 函数级 Fixture: 在每个测试函数执行前后运行。
  • 类级 Fixture: 在每个测试类执行前后运行。
  • 模块级 Fixture: 在整个模块执行前后运行。
  • 会话级 Fixture: 在整个测试会话执行前后运行。

应用场景包括但不限于:

  • 数据库连接和清理。
  • 文件操作和文件内容的准备。
  • 网络请求的模拟。
  • 配置文件的加载。

示例代码

假设我们有一个需要大量数据测试的场景,我们可以使用生成器来按需提供数据:

代码语言:txt
复制
import pytest

@pytest.fixture(scope="module")
def data_generator():
    for i in range(1000000):
        yield i  # 每次调用 next() 时返回下一个数字

def test_data(data_generator):
    for data in data_generator:
        assert isinstance(data, int)  # 确保每个数据都是整数

在这个例子中,data_generator fixture 返回一个生成器,它在测试函数 test_data 中被迭代使用。

遇到的问题及解决方法

如果你不希望 fixture 返回生成器,而是返回一个具体的对象或值,你可以简单地修改 fixture 函数,去掉 yield 并返回所需的对象:

代码语言:txt
复制
@pytest.fixture(scope="module")
def data_list():
    return list(range(1000000))  # 返回一个完整的列表

def test_data(data_list):
    for data in data_list:
        assert isinstance(data, int)

在这个修改后的例子中,data_list fixture 返回一个列表,而不是生成器。

总结

pytest fixture 可以返回生成器,这通常是为了实现惰性计算和节省内存。如果你需要 fixture 返回具体的对象或值,可以通过修改 fixture 函数来实现。根据测试的具体需求选择合适的返回类型是非常重要的。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • teprunner测试平台Django引入pytest完整源码

    ,就不用单独去处理前端手动删掉fixture/case后,文件残留的问题。...pull_case_files通过yield定义为了生成器,它和list的区别是不会一次把所有数据产生到内存中,而是每次用的时候产生一次,节约内存开销。...save_case_result就是个回调函数,它的入参pytest_result等于pytest_subprocess函数返回的元组,拆包后就能拿到outout、cmd、case_id、run_env...WSGI一种网关接口,是Python为了解决Web服务器端与客户端之间的通信问题而产生的,不支持WebSocket;ASGI是WSGI的扩展,意思是异步网关接口,支持WebSocket。...做到这里,teprunner测试平台已经不是个花架子了,而是有着pytest内核引擎驱动的真测试平台。它一定不是你做测试平台的终点,但也许能成为做测试平台的起点,也许能成为撬动地球的支点。

    1.1K40

    Pytest(十九)利用内置的cache 写入和读取缓存数据解决简单的数据依赖

    Pytest(六)跳过测试 Pytest(七) pytest之参数化 Pytest(八) pytest Fixture(一) Pytest(九) pytest Fixture(二) Pytest...(十) pytest Fixture(三) Pytest(十一) pytest ini文件 Pytest(十二) Pytest产生测试报告 Pytest(十三)durations统计用例运行时间...比如在用例A中产生的数据,在用例B中使用,这样的如何处理? 这些在用例执行过程中生成的数据可以用cache缓存来解决。 cache 是一个可以在测试会话之间保持状态的缓存对象。...import pytest @pytest.fixture() def createid(cache): id = "leisi说测试" cache.set("id", id)...print("fixture 中返回: {}".format(createid)) cache.set("data",123) cache.set("id",12) def

    1.2K31

    Pytest测试实战|Fixture详解

    之前详细地阐述了Pytest测试框架搜索规则、Pytest测试框架执行方式与Pytest测试框架参数化,本文章主要详细地阐述下Pytest测试框架中Fixture特性。...Fixture返回值特性 Fixture函数另外一个特性是返回值的特性,这个特性可以很好的应用在API测试中关于授权认证的部分。...在API测试中首先需要获取到TOKEN,然后再下个请求中带上登录成功后返回的TOKEN,那么结合Fixture返回值的特性,可以很轻松的来解决这部分。详细的实战代码见如下。 #!...函数login的对象,那么Fixture函数返回值的内容其实就是该函数对象的值,见debug模式下显示的信息。...在这个案例中,对象login它就是一个函数,是Fixture函数login的对象。

    12910

    研效优化实践:Python单测——从入门到起飞

    使用这些方法而不是 assert 语句是为了让测试运行者能聚合所有的测试结果并产生结果报告。注意这些方法是 unnitest 模块的方法,需要使用 self 调用。...在函数内部的 for 循环模式,会当做一次测试用例,而采用pytest.mark.parametrize方式会产生 N 个测试用例,N=len(argnames)。...如果没有返回给yield即可 3 结束收尾 4 @pytest.fixture(autouse=True) autouse 关键字告诉框架在跑用例之前自动运行该 fixture 作用域 通过 scope...:) 其实还有一个更佳方案就是就是我们用一个 mock 对象替换掉和远端 rpc 服务的交互过程,给定任何我们期望返回的指标值。...重点:all_workers.return_value = workers用自定义返回值来替换目标对象返回值,直白说就是接下来调用get_all_works都会返回['1.1.1.1', '2.2.2.2

    1.9K60

    带你认识Pytest(四)

    前言 上一篇带大家初步了解Pytest的核心知识点fixture,这一篇我们将继续对fixture进行介绍,我们会对fixture的调用方式进行一些补充,另外我们会介绍Pytest是如何进行参数化的。...,实际返回的是fixture的返回值,并不是函数本身 示例如下: import pytest@pytest.fixture()def func(): obj = {"a": 1, "b": 2,...在测试用例test_01和测试用例test_03中,func并不是指func这个函数,而是是func这个函数的返回值,这一点需要格外注意. pytest 的参数化 在实际工作中,测试用例可能需要支持多种场景...1.argvalues: 一个可迭代对象,表明对argnames参数的值 •如果argnames包含多个参数,那么argvalues的迭代返回元素必须是可度量的,并且长度和argnames声明参数的个数相等...我们不建议用set ,因为他有去重性 •如果argnames只包含一个参数,那么argvalues的迭代返回元素可以是具体的值 @pytest.mark.parametrize('input', [1,

    69720

    Pytest(3)fixture的使用

    fixture对象来使用他们。...方式二:usefixtures @pytest.fixture def login1(): print("输入账号,密码先登录") @pytest.fixture def login2():...区别 fixture可以获取返回值,而usefixture无法获取返回值,这个是装饰器fixture与用例直接传fixture参数的区别,所以这里就建议大家就用传参的方式 方式三:fixture设置...使用yield而不是return关键字的时候,yield后面的语句将会在fixture退出作用域的时候被调用来清理测试用例,相当于unittest里的teardown作用 yield @pytest.fixture...smtp_connection.close() # 无论测试是否发生了异常,print及smtp.close()语句将在function测试函数完成之后被执行 除了yield可以实现teardown,在request-context对象中注册

    92520

    pytest fixtures_pytest conftest.py文件

    fixture对象来使用他们。...方式二:usefixtures @pytest.fixture def login1(): print("输入账号,密码先登录") @pytest.fixture def login2():...区别 fixture可以获取返回值,而usefixture无法获取返回值,这个是装饰器fixture与用例直接传fixture参数的区别,所以这里就建议大家就用传参的方式 方式三:fixture设置...使用yield而不是return关键字的时候,yield后面的语句将会在fixture退出作用域的时候被调用来清理测试用例,相当于unittest里的teardown作用 yield @pytest.fixture...smtp_connection.close() # 无论测试是否发生了异常,print及smtp.close()语句将在function测试函数完成之后被执行 除了yield可以实现teardown,在request-context对象中注册

    53520

    pytest fixtures_pytest命令

    fixture对象来使用他们。...方式二:usefixtures @pytest.fixture def login1(): print("输入账号,密码先登录") @pytest.fixture def login2():...区别 fixture可以获取返回值,而usefixture无法获取返回值,这个是装饰器fixture与用例直接传fixture参数的区别,所以这里就建议大家就用传参的方式 方式三:fixture设置...使用yield而不是return关键字的时候,yield后面的语句将会在fixture退出作用域的时候被调用来清理测试用例,相当于unittest里的teardown作用 yield @pytest.fixture...smtp_connection.close() # 无论测试是否发生了异常,print及smtp.close()语句将在function测试函数完成之后被执行 除了yield可以实现teardown,在request-context对象中注册

    62630

    pytest fixtures_figure可数吗

    fixture对象来使用他们。...方式二:usefixtures @pytest.fixture def login1(): print("输入账号,密码先登录") @pytest.fixture def login2():...区别 fixture可以获取返回值,而usefixture无法获取返回值,这个是装饰器fixture与用例直接传fixture参数的区别,所以这里就建议大家就用传参的方式 方式三:fixture设置...使用yield而不是return关键字的时候,yield后面的语句将会在fixture退出作用域的时候被调用来清理测试用例,相当于unittest里的teardown作用 yield @pytest.fixture...smtp_connection.close() # 无论测试是否发生了异常,print及smtp.close()语句将在function测试函数完成之后被执行 除了yield可以实现teardown,在request-context对象中注册

    37620

    聊一聊,Python自动化测试框架

    ,前提是其必须返回一个值: @pytest.fixture() def hello(): return "hello" def test_string(hello): assert hello...== "hello", "fixture should return hello" 4.2 作为 setup fixture 也可以不返回值,这样可以用于在测试方法运行前运行一段代码: @pytest.fixture...在上例中,有一个测试用了 pytest.mark.usefixtures装饰器来标记使用哪个 fixture,这中用法表示在开始测试前应用该 fixture 函数但不需要其返回值。...如果 scope='module',那么 fixture 就是模块级的,这个 fixture 函数只会在每次相同模块加载的时候执行。这样就可以复用一些需要时间进行创建的对象。...:每次 session 之前执行一次,即每次测试执行一次 4.4 反向请求 fixture 函数可以通过接受 request 对象来反向获取请求中的测试函数、类或模块上下文。

    4K40

    Pytest fixture及conftest详解

    ,默认会是None;用例调用fixture的返回值,就是直接把fixture的函数名称作为参数传入; fixture可以返回一个元组、列表或字典; 测试用例可传单个、多个fixture参数; fixture...与fixture间可相互调用; 3.Pytest fixture用法 1)用法一:作为参数使用 fixture的名字直接作为测试用例的参数,用例调用fixture的返回值,直接将fixture的函数名称当做变量名称...;如果用例需要用到多个fixture的返回数据,fixture也可以返回一个元祖,list或字典,然后从里面取出对应数据。...需注意: ① 与直接传入fixture不同的是,@pytest.mark.usefixtures无法获取到被fixture装饰的函数的返回值; ② @pytest.mark.usefixtures的使用场景是...pytestconfig是request.config的快捷方式,它在pytest文档里有时候被称为“pytest配置对象”。

    1.7K40

    Python测试框架pytest(06)fixture - 依赖、重命名、request、pytestconfig

    config: 与此 request 关联的 pytest 配置对象。 function: 如果 request 具有按方法范围,则测试函数对象。...session: pytest 会话对象。 addfinalizer(finalizer): 在 request 测试上下文完成执行的最后一次测试之后添加要调用的终结器/拆卸函数。...创建test_fixture_request.py文件 fixture函数可以通过接受request对象来反向获取请求中的测试函数、类或模块上下文。...3.2、request.getfixturevalue request.getfixturevalue 获取 fixture 的返回值 示例一: 1、创建test_fixture_request2.py...pytestconfig 是一个内置 fixture,用于获取配置对象。实际调用 pytestconfig 方法,其实就是返回 request.config。

    53520

    pytest的fixture怎么用?

    fixture和unittest是冲突的。舍弃unittest只用pytest。 会遇到在很多用例当中,它的前置条件是长得一样的。用例写的越来越多的时候,肯定会遇到前置条件都差不多,大家差距不是很大。...那这个装饰器就是@pytest.fixture,在函数名称前面。 ? 在pytest中,环境准备和环境清理是完全放在一起的。...每个测试用例可能都涉及数据库校验,它的前提就是数据库连接,得到一个数据库对象以及游标操作。那么就可以用session了。...") class TestLogin: # 正常用例 - 登陆成功 #fixture的函数名称,用来接收它的返回值 @pytest.mark.smoke def test_login..._2_success(self,access_web):#fixture的函数名称作为用例参数,用来接收fixture的返回值 logging.info("****登陆用例:正常场景:适用正确的用户名和密码登陆

    79420
    领券