fixture/夹具/装饰器

4 阅读2分钟

fixture就像是一个外挂的现成的工具包,在自动化测试中非常常用。

比如我们要做饭,准备食材和调料,这就是fixture。

在自动化测试中,fixture就是用来准备测试数据和环境的。

比如我们要测试一个登录功能,我们需要准备一个登录账号和密码,这就是fixture。

比如我们要测试一个搜索功能,我们需要准备一个搜索关键词,这就是fixture。

fixture的装饰器是@pytest.fixture,

pytest.fixture是pytest库中的一个装饰器,用来定义fixture。

常用的fixture有几种类型,

  1. 调用后直接结束的,比如准备一个登录账号和密码,这个登录账号和密码就是fixture。用完后直接结束。
  2. 调用后暂停的,比如准备一个浏览器的driver,这个driver就是fixture。用完后暂停,等测试用例执行完后再继续执行。
  3. 调用后暂停并返回值的,比如准备一块黑板给测试写字,测试结束后再擦掉黑板(既返回值又有收尾)。

下面来看以上类型对应的几个例子:

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 == "干净的黑板"