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