pytest-前后置及fixture运用

1.pytest 中的 xunit 风格前后置处理

pytest中用例的前后置可以直接使用类似于unittest中的前后置处理,但是pytest中的前后置处理方式更

加丰富,分为模块级、类级、方法级、函数级等不同等级的前后置处理,具体见下面的代码:

test_demo_001.py 文件

python 复制代码
def setup_function():#类外使用
print('函数级的前置,每个函数级用例前均运行一次')
def teardown_function():#类外使用
print('函数级的前置,每个函数级用例后均运行一次')
def test_function_001():
print('测试:函数级的用例test_function_001')
def test_function_002():
print('测试:函数级的用例test_function_002')
def setup_module():
print('模块级的前置,每个文件中所有用例执行前仅运行一次')
def teardown_module():
print('模块级的后置,每个文件中所有用例执行后仅运行一次')
class TestDemo001:
@classmethod
def setup_class(cls):
print('类级的前置,TestDemo001类下的所有用例执行前运行一次')
@classmethod
def teardown_class(cls):
print('类级的后置,TestDemo001类下的所有用例执行后运行一次')
def setup_method(self): #类中使用
print('方法级的前置,每个方法级用例前均运行一次')
def teardown_method(self): #类中使用
print('方法级的后置,每个方法级用例后均运行一次')
def test_aaa_001(self):
print('测试:类下方法级的用例test_aaa_001')
def test_aaa_002(self):
print('测试:类下方法级的用例test_aaa_002')
class TestDemo002:
@classmethod
def setup_class(cls):
print('类级的前置,TestDemo002类下的所有用例执行前运行一次')
@classmethod
def teardown_class(cls):
print('类级的后置,TestDemo002类下的所有用例执行后运行一次')
def setup_method(self): #等价于def setup(self):
print('方法级的前置,每个方法级用例前均运行一次')
def teardown_method(self): #等价于def teardown(self):
print('方法级的后置,每个方法级用例后均运行一次')
def test_bbb_001(self):
print('测试:类下方法级的用例test_bbb_001')
def test_bbb_002(self):
print('测试:类下方法级的用例test_bbb_002')
'''
setup/teardown 等价于 setup_method/teardown_method;2者仅使用一种即可,如果同时时候,只使
用setup_method/teardown_method
整体运行过程:
setup_module
setup_function--->test_function_001--->teardown_function
setup_function--->test_function_002--->teardown_function
setup_class #TestDemo001的
setup_method--->test_aaa_001--->teardown_method
setup_method--->test_aaa_002--->teardown_method
teardown_class #TestDemo001的
setup_class #TestDemo002的
setup_method--->test_bbb_001--->teardown_method
setup_method--->test_bbb_002--->teardown_method
teardown_class #TestDemo002的
teardown_module
'''

2. 使用 fixture 实现灵活的用例前后置处理

使用Xunit风格的前置后置的使用,我们发现这种前后置无法复用,在另外的一个.py文件或者.py文件中 的类使用时,需要重新再写,相对不灵活。pytest结合fixture可以实现用例进行灵活的前后置处理。

[email protected] 进行用例的前置处理

python 复制代码
import pytest
@pytest.fixture()
def aaa():
print('这是用例的前置操作')
def test_001(aaa):
print('用例test_001')
@pytest.fixture #fixture中不传参数,可以不带括号
def bbb():
print('用例前置操作,并给返回值')
return 100
def test_002(bbb):
print('用例test_002')
print('可以使用前置函数的名称来作为其返回值使用:bbb={}'.format(bbb))
def test_003(bbb,aaa):
print('用例test_003')
print('可以同时做多个前置操作,操作顺序按传递的参数顺序来进行')
print('我们可以发现前置函数aaa,bbb一次定义,可以多次使用,体现了灵活性')
print(bbb,aaa)
if __name__ == '__main__':
pytest.main()

[email protected] 的嵌套使用

python 复制代码
#fixture的嵌套,会先调用里层的fixture,在调用外层的fixture
@pytest.fixture()
def aaa():
print('111111111111')
return 'aaa'
@pytest.fixture()
def bbb(aaa):
print('22222222')
return ['bbb',aaa]
def test_001(bbb):
print('测试用例test_001')
print(bbb)
if __name__ == '__main__':
pytest.main()

[email protected] 结合 @pytest.mark.parametrize() 实现参数

import yaml,pytest

python 复制代码
#读取参数化数据的文件内容
def get_yaml_data(yaml_path):
with open(yaml_path,'r',encoding='utf-8') as f:
data = yaml.safe_load(f)
return data
#获取yaml文件的数据
yaml_data = get_yaml_data('./login.yaml')
@pytest.fixture()
def case_data(request):
return request.param
#indirect=True时'case_data'当做函数运行,就是这里定义的fixture
#indirect=False时'case_data'当做普通变量使用,默认值为False
#工作中建议使用默认值:False,就当做普通变量使用即可,这时可以不使用fixture进行参数化
@pytest.mark.parametrize('case_data',yaml_data,indirect=True)
def test_002(case_data):
print(case_data)
if __name__ == '__main__':
pytest.mian(['-vs','demo1.py'])

2.4. 直接使用 @pytest.fixture() 来进行参数化

python 复制代码
#演示代码时,需要先在当前目下新建login.yaml文件
#不使用@pytest.mark.parametrize()来参数化,直接利用@pytest.fixture()的传参功能进行参数化
import yaml,pytest
#封装读取参数化数据的文件内容
def get_yaml_data(yaml_path):
with open(yaml_path,'r',encoding='utf-8') as f:
data = yaml.safe_load(f)
return data
#通过在fixture中使用parmas接受参数化的值,将值传递给固定的接受参数requests
#如果传入的是列表,会将列表中的每个元素返回,如果传入的是字典会将字的每个key返回
@pytest.fixture(params=get_yaml_data('./login.yaml')[0])
def case_data(request):
return request.param
#测试用例test_003使用fixture:case_data,case_data的值就是fixture函数中的返回值
def test_003(case_data):
print(case_data)

2.5. 结合 yield 来进行前后置处理

python 复制代码
import pytest,allure
from selenium import webdriver
@pytest.fixture()
def brower():
driver = webdriver.Chrome()
yield driver
driver.quit()
相关推荐
水银嘻嘻11 小时前
09 接口自动化-用例管理框架pytest之allure报告定制以及数据驱动
自动化·pytest
程序员三藏1 天前
接口自动化测试框架(pytest+allure+aiohttp+ 用例自动生成)
自动化测试·软件测试·python·职场和发展·测试用例·pytest·接口测试
水银嘻嘻2 天前
08 接口自动化-用例管理框架pytest之fixtrue,conftest.py,allure报告以及logo定制
python·自动化·pytest
A_Tai23333334 天前
PyTest
pytest
bjwuzh9 天前
使用pytest实现参数化后,控制台输出的日志是乱码
pytest
2025年一定要上岸10 天前
pytest框架 - 第二集 allure报告
pytest
头疼的程序员11 天前
allure生成测试报告(搭配Pytest、allure-pytest)
测试工具·pytest
文人sec11 天前
接口自动化测试设计思路--设计实战
python·https·单元测试·自动化·pytest
测试开发Kevin13 天前
从投入产出、效率、上手难易度等角度综合对比 pytest 和 unittest 框架
python·pytest
测试开发Kevin15 天前
以pytest_addoption 为例,讲解pytest框架中钩子函数的应用
python·pytest