在一个测试用例中需要多次调用同一个fixture
程序员文章站
2024-01-25 20:31:22
...
前言
在一个测试用例中需要多次调用同一个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的话,在测试用例里面就需要调用两次