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()函数便不会执行;

浙公网安备 33010602011771号