pytest之插件机制
一、fixture函数
在pytest中,Fixture是一种被特别对待的函数。当这个函数被标记成为Fixture后,我们就可以在测试函数中使用它了。fixture函数可以放在测试脚本中,但常用方法是将其放在conftest.py文件中。有两种方法来调用fixture函数,一种是@pytest.mark.usefixtures()
来调用,另外一种是直接在测试方法中传入fixture装饰的方法名称。
1、不需要返回值
@pytest.mark.usefixtures()
@pytest.mark.demo
class TestMyCode:
@pytest.mark.usefixtures("modify_sys_config")
def test_usefixtures_001(self):
"""不需要返回值,可以用usefixtures"""
assert 1 == 1
2、需要返回值
@pytest.mark.demo
class TestMyCode:
@pytest.mark.parametrize("a", [1, 2, 3, 4, 5])
def test_usefixtures_002(self, a, random_int):
"""需要返回值,直接在测试方法中传入fixture装饰的方法名称"""
assert a >= random_int
3、函数依赖
如果一个fixture函数依赖另外一个fixture函数,此时不能用@pytest.mark.usefixtures()
,不会生效。需要用函数传递的方式才能生效。
#test_fixture_02.py
@pytest.fixture()
def login_weibo():
print("==============登陆微博===============")
@pytest.fixture()
# @pytest.mark.usefixtures("login_weibo") #这种方式不会生效
def get_weibo_data(login_weibo): #这种方式才会生效
"""fixture函数依赖,需要用传递函数的方式"""
print("=============获取微博数据==============")
@pytest.mark.demo
class TestMyCode:
@pytest.mark.usefixtures("get_weibo_data")
def test_fixture_005(self):
"""fixture函数在测试脚本文件中"""
assert 1 == 1
二、conftest
conftest可以理解成一个专门存放fixture的配置文件,conftest的作用范围是当前目录及所属子目录里的相关测试模块
1、一级conftest
- tests
- conftest.py
- test_parametrize.py
2、多级conftest
- tests
- conftest.py
- test_parametrize.py
- baidu
- conftest.py
- test_baidu.py
三、Hook函数
pytest_report_teststatus
#conftest.py
def pytest_report_teststatus(report):
"""用例执行时,返回各个测试阶段的测试结果"""
if report.when == "call":
if report.outcome == "failed":
print("用例失败了,手动改为成功")
report.outcome = "passed"
elif report.outcome == "passed":
print("用例成功")
pytest_terminal_summary
#conftest.py
def pytest_terminal_summary(terminalreporter):
'''用例执行完后,收集测试结果'''
print(terminalreporter.stats)
print("收集用例数:", terminalreporter._numcollected)
print('通过用例数:', len(terminalreporter.stats.get('passed', [])))
print('失败用例数:', len(terminalreporter.stats.get('failed', [])))
print('错误用例数:', len(terminalreporter.stats.get('error', [])))
print('跳过用例数:', len(terminalreporter.stats.get('skipped', [])))