持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情
Fixtures函数是pytest的精髓之处,使用@pytest.fixture装饰器就可以将函数转化成为Fixture函数,Fixture函数中可以包含测试准备setup,也可以包含测试数据清理teardown,可以使用yield隔开。
我们可以自定义fixture方法来实现测试准备和测试数据清理的工作,比如加载读取数据文件,启动关闭浏览器等等,自定义的fixture方法可以通过scope指定作用范围,Pytest中的Test Fixtures方法有5中范围:
Session:会话级,运行一次pytest算一次会话,测试准备setup和测试数据清理teardown各执行一次。
Package:包级,针对每运行一个python的包会执行一次测试准备setup和测试数据清理teardown。
Module:模块级,每运行一个python的脚本都会各执行一次测试准备setup和测试数据清理teardown。
Class:类级,运行一个测试类,就会执行一次测试准备setup和一次测试数据清理teardown。
import pytest
import requests
@pytest.fixture(scope="module")
def http():
# 测试准备
session = requests.session()
session.headers = {'token': "1234567890"}
yield session # 返回会话
# 测试清理
session.close()
def test_http(http): # fixture可以作为参数使用
res = http.get("https://www.baidu.com/")
assert res.status_code == 200
注意:如果不需要测试数据清理的方法,可以把yield更换成return来返回,如果setup方法报错,测试用例和teardown方法都不会执行。
Fixture方法主要使用方式有3种
1、Fixture函数名可以直接作用参数使用,参数及是Fixture方法的返回值。
2、在用例上使用@pytest.mark.userfixtures()
3、fixture方法进行相应的配置,可以使用例自动使用,autouse= True
import pytest
import requests
@pytest.fixture(autouse=True)
def setup_teardown():
print('执行 测试准备')
yield
print('执行 测试清理')
@pytest.fixture
def http():
session = requests.session()
yield session # 返回会话
session.close()
@pytest.fixture
def login(http): # fixture 中也可以使用其他 fixture 方法
print('登录')
# http.post(...)
# 自动使用 setup_teardown
def test_1():
print('用例 1')
# 显示使用 login(包括自动使用 setup_teardown)
@pytest.mark.usefixtures('login')
def test_2():
print('用例 2')
# 通过参数使用,可以使用多个,同时可以使用 fixture 函数的返回值
def test_3(http, login):
print('用例 2')