fixture就像是一个外挂的现成的工具包,在自动化测试中非常常用。
比如我们要做饭,准备食材和调料,这就是fixture。
在自动化测试中,fixture就是用来准备测试数据和环境的。
比如我们要测试一个登录功能,我们需要准备一个登录账号和密码,这就是fixture。
比如我们要测试一个搜索功能,我们需要准备一个搜索关键词,这就是fixture。
fixture的装饰器是@pytest.fixture,
pytest.fixture是pytest库中的一个装饰器,用来定义fixture。
常用的fixture有几种类型,
- 调用后直接结束的,比如准备一个登录账号和密码,这个登录账号和密码就是fixture。用完后直接结束。
- 调用后暂停的,比如准备一个浏览器的driver,这个driver就是fixture。用完后暂停,等测试用例执行完后再继续执行。
- 调用后暂停并返回值的,比如准备一块黑板给测试写字,测试结束后再擦掉黑板(既返回值又有收尾)。
下面来看以上类型对应的几个例子:
1. 调用后直接结束(用 return,交出去后 fixture 就结束,没有「之后」)
例如:准备登录账号和密码,交给测试用完后直接结束。
import pytest
@pytest.fixture
def login_data():
return "admin", "123456" # 返回后 fixture 直接结束
def test_login(login_data):
assert login_data == ("admin", "123456")
2. 调用后暂停(用 yield,交出去后 fixture 暂停,等测试跑完再继续执行 teardown)
例如:准备浏览器 driver,测试用完后要关闭浏览器,所以需要「暂停 → 测试 → 再继续」执行关闭。
import pytest
@pytest.fixture
def browser():
driver = None # 实际可用 webdriver.Chrome()
print("打开浏览器")
yield driver # 交给测试,然后暂停
print("关闭浏览器") # 测试跑完后才会执行到这里,这里就是teardown的操作
def test_browser(browser):
assert browser is not None # 测试里用 fixture 传进来的 driver
3. 调用后暂停并返回值(同样是 yield,既把值交给测试,又能在测试后执行 teardown)
例如:准备一块「黑板」,把黑板交给测试写字,测试结束后再擦掉黑板。
import pytest
@pytest.fixture
def blackboard():
print("擦干净黑板") # setup部分
yield "干净的黑板" # 把值交给测试,然后暂停
print("测试结束,擦掉黑板") # 测试跑完后继续执行,teardown部分,这里也可以写一些清理代码,比如关闭浏览器,关闭数据库连接,关闭文件等
def test_write(blackboard):
print(f"在{blackboard}上写字")
assert blackboard == "干净的黑板"