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', [])))
posted @ 2021-10-28 17:05  xyztank  阅读(200)  评论(0编辑  收藏  举报