python之钩子函数及起始函数作用范围【后置固件yield和终结函数addfinalizer区别】

# coding:utf-8
import pytest


# 类和方法

def setup_module():
    print("setup_module:整个.py模块只执行一次")
    print("比如:所有用例开始前只打开一次浏览器")


def teardown_module():
    print("teardown_module:整个.py模块只执行一次")
    print("比如:所有用例结束只最后关闭浏览器")


def setup_function():
    print("setup_function:每个用例开始前都会执行")


def teardown_function():
    print("teardown_function:每个用例结束前都会执行")  # 只是每个函数,非类


def test_one():
    print("正在执行----test_one")
    x = "this"
    assert ('h' in x)


def test_two():
    print("正在执行----test_two")
    x = "hello"
    assert ('h' in x)


class TestCase():

    def setup_class(self):
        print("setup_class:所有用例执行之前")

    def teardown_class(self):
        print("teardown_class:所有用例执行结束后执行")

    def test_three(self):
        print("正在执行----test_three")
        x = "this"
        assert 'h' in x

    def test_four(self):
        print("正在执行----test_four")
        x = "hello"
        assert 'h' in x


@pytest.fixture(autouse=True)
def show_request(request):
    print("\n=======================request start=================================")
    print("request.module==", request.module)
    print("request.function==", request.function)
    print("request.cls==", request.cls)
    print("request.fspath==", request.fspath)
    print("request.fixturenames==",request.fixturenames )
    print("request.fixturename==", request.fixturename)
    print("request.scope==", request.scope)
    print("\n=======================request end=================================")


if __name__ == "__main__":
    pytest.main(["-s", "12.py"])

  

二、【后置固件yield和终结函数addfinalizer区别】

# 文件名是test_firstFile.py
# coding=utf-8
import pytest


@pytest.fixture()
def myfixture():
    print("执行myfixture前半部分")
    yield
    print("执行myfixture的后半部分")


class Test_firstFile():

    def test_one(self, myfixture):
        print("执行test_one")
        assert 1 + 2 == 3

    def test_two(self):
        print("执行test_two")
        assert 1 == 1

    def test_three(self):
        print("执行test_three")
        assert 1 + 1 == 2


if __name__ == "__main__":
    pytest.main(["-s", "12.py"])

 结果:测试代码的执行顺序是 固件中yield前的代码–测试用例中的代码–固件中yield后的;如果测试用例中的代码出现异常或者断言失败,并不会影响他的固件中yield后的代码执行;但是如果固件中的yield之前的代码也就是相当于setup部分的带代码,出现错误或断言失败,那么yield后的代码将不会再执行,当然测试用例中的代码也不会执行。 

# test_Pytest.py文件
# coding=utf-8

import pytest


@pytest.fixture()
def myfixture(request):
    print("执行固件myfixture的前半部分")

    def myteardown():
        print("执行固件myfture的后半部分")

    request.addfinalizer(myteardown)


class Test_Pytest():

    def test_one(self, myfixture):
        print("test_one方法执行")
        assert 1 == 1

    def test_two(self):
        print("test_two方法执行")
        assert "o" in "love"

    def test_three(self):
        print("test_three方法执行")
        assert 3 - 2 == 1


if __name__ == "__main__":
    pytest.main(["-s", "12.py"])

  结果:

12.py 执行固件myfixture的前半部分
test_one方法执行
.执行固件myfture的后半部分
test_two方法执行
.test_three方法执行

  注意:注释掉request.addfinalizer(myteardown)后myteardown()函数便不会执行;


原文地址:https://www.cnblogs.com/mumianhuasayyes/p/15849259.html