在一个测试用例中需要多次调用同一个fixture

前言
在一个测试用例中需要多次调用同一个fixture的时候,工厂化的 fixture 的模式对于一个 fixture 在单一的测试中需要被多次调用非常有用。
之前写fixture是直接return一个数据,在测试用例中可以直接使用,现在我们需要返回一个生成数据的函数,这样就能在用例中多次调用了。

Factories as fixtures
“Factories as fixtures”模式可以帮助在一次测试中多次需要一个fixture的结果的情况下。
fixture不是直接返回数据,而是返回一个生成数据的函数。然后可以在测试中多次调用此函数。

使用示例

import pytest
@pytest.fixture 
def make_customer_record(): 
    def _make_customer_record(name): 
        return {"name": name, "orders": []}
    return _make_customer_record

def test_customer_records(make_customer_record): 
    customer_1 = make_customer_record("Lisa") 
    customer_2 = make_customer_record("Mike") 
    customer_3 = make_customer_record("Meredith")

如果工厂创建的数据需要管理,那么fixture可以处理:

import pytest
@pytest.fixture
def make_customer_record():
    
    created_records = []
    
    def _make_customer_record(name):
        record = models.Customer(name=name, orders=[])
        created_records.append(record) 
        return record
    
    yield _make_customer_record
    
    for record in created_records:
        record.destroy()
        
def test_customer_records(make_customer_record): 
    customer_1 = make_customer_record("Lisa") 
    customer_2 = make_customer_record("Mike") 
    customer_3 = make_customer_record("Meredith")

场景案例
有个场景案例:当用户第一次注册的时候,可以注册成功,第二次注册的时候,提示用户已被注册了

import pytest

@pytest.fixture()
def register():

    def _register(user):
        # 调用注册接口,返回结果
        print("注册用户:%s" % user)
        result = {"code": 0,
                  "message": "success"}
        return result

    return _register
def test_case_1(register):
    '''测试重复注册接口案例'''
    # 第一次调用注册
    result1 = register("yoyo")
    assert result1["message"] == "success"

    # 第二次调用
    result2 = register("yoyo")
    # 真实场景可以断言 已被注册了

这种场景把注册写到fixture的话,在测试用例里面就需要调用两次

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值