pytest之setup teardown前后置方法和 fixture部分前后置方法
Pytest框架实现的一些前后置(也叫做 固件,或者 夹具)的处理,常用的有三种。
一,setup / teardown, setup_class / teardown_class
为什么需要这些功能呢?
比如:web自动化执行用例之前,统一打开浏览器。在自动化用例执行后,统一关闭浏览器。
setup方法,teardown方法:是在每个测试用例前 和 每个用例后 都会被自动执行的方法。
setup_class方法,teardown_class方法:是在某个模块py文件中所有用例 执行前 / 执行后都会被执行的方法。
注意:和unitest不一样,全是小写
ps:上面4个方法执行的优先级是:
所有用例执行前 先执行setup_class-> 每条用例执行前 先执行setup ->。。。(执行每条testcase)。。。-> 每条用例执行后 执行teardown-> 所有用例执行后 执行teardown_class
具体的我参考了一篇文章,写得很好: https://blog.csdn.net/Faith_Lzt/article/details/125750455
借鉴了这篇文档,写的很详细: https://blog.csdn.net/Faith_Lzt/article/details/125750455
二.使用@pytest.fixture()装饰器 来实现部分用例得前后置
装饰器 @pytest.fixture(scope="",params="",autouse="",ids="",name="")
解释下每个参数得意思:
- scope: 表示的是被@pytest.fixture()标记得方法的作用域,作用域的value有4种,分别是作用域:function函数(默认),class ,module ,package/session
- params:参数化,支持列表[],元组(),字典列表[{},{}],字典元组({},{})
- autouse=True: 自动执行,默认False。为True表示给全部的用例 自动设置 前后置
- ids:当使用params参数时,给每个值设置一个变量名。此参数的 意义不大
- name:表示的是 给被@pytest.fixture标记的方法 取的一个别名 (当取了别名后,那么原来的名字就用户了啦)
ps:
params: 这里装饰器中的params是参数,有s
request.param :这里是属性名,是没有s的。
添加参数params的案例:
params有多少个,引用fixture前后置的 这个方法 就会被执行几次:
import pytest @pytest.fixture(scope="module",params=["张三","李四"]) def my_fixture(request): print("这里是前置的方法,可以实现部分以及全部用例的前置") # yield #yield关键字用来区分前置 和 后置 # print("这里是后置的方法,可以实现部分以及全部用例的后置") return request.param class TestDemo2: def testee01(self): print("this is test_01--") def test_ee02(self,my_fixture): print("test02--") print("--"+str(my_fixture)) def testee03(self): print("test03--") def test_ee04(self): print("test04--") class TestDemo3: def testee_05(self): print("this is testee_01--") if __name__ == "__main__": pytest.main(['-vs', '.\\Demo2_test.py::TestDemo2'])
例如:使用yield去做返回:
import pytest @pytest.fixture(scope="module",params=["张三","李四"]) def my_fixture(request): print("这里是前置的方法,可以实现部分以及全部用例的前置") yield request.param #yield关键字用来区分前置 和 后置 print("这里是后置的方法,可以实现部分以及全部用例的后置") class TestDemo2: def testee01(self): print("this is test_01--") def test_ee02(self,my_fixture): print("test02--") print("--"+str(my_fixture)) def testee03(self): print("test03--") def test_ee04(self): print("test04--") class TestDemo3: def testee_05(self): print("this is testee_01--") if __name__ == "__main__": pytest.main(['-vs', '.\\Demo2_test.py::TestDemo2'])
例如:实现部分用例的前后置:
import pytest @pytest.fixture(scope="function") def my_fixture(): print("这里是前置的方法,可以实现部分以及全部用例的前置") yield #yield关键字用来区分前置 和 后置 print("这里是后置的方法,可以实现部分以及全部用例的后置") class TestDemo2: def testee01(self): print("this is test_01--") def test_ee02(self,my_fixture): print("test02--") def testee03(self,my_fixture): print("test03--") def test_ee04(self): print("test04--") if __name__ == "__main__": pytest.main(['-vs', '.\\Demo2_test.py::TestDemo2'])
例如:使用ids的案例:
import pytest @pytest.fixture(scope="module",params=["张三","李四"],ids=["zhagnsan","lisi"]) def my_fixture(request): print("这里是前置的方法,可以实现部分以及全部用例的前置") yield request.param #yield关键字用来区分前置 和 后置 print("这里是后置的方法,可以实现部分以及全部用例的后置") class TestDemo2: def testee01(self): print("this is test_01--") def test_ee02(self,my_fixture): print("test02--") print("--"+str(my_fixture)) def testee03(self): print("test03--") def test_ee04(self): print("test04--") class TestDemo3: def testee_05(self): print("this is testee_01--") if __name__ == "__main__": pytest.main(['-vs', '.\\Demo2_test.py::TestDemo2'])
例如:实现所有用例的前后置:增加参数autouse=True
import pytest @pytest.fixture(scope="function",autouse=True) def my_fixture(): print("这里是前置的方法,可以实现部分以及全部用例的前置") yield #yield关键字用来区分前置 和 后置 print("这里是后置的方法,可以实现部分以及全部用例的后置") class TestDemo2: def testee01(self): print("this is test_01--") def test_ee02(self): print("test02--") def testee03(self): print("test03--") def test_ee04(self): print("test04--") if __name__ == "__main__": pytest.main(['-vs', '.\\Demo2_test.py::TestDemo2'])
例如:一个模块中有多个类,可以采用模块的作用域:
import pytest @pytest.fixture(scope="module",autouse=True) def my_fixture(): print("这里是前置的方法,可以实现部分以及全部用例的前置") yield #yield关键字用来区分前置 和 后置 print("这里是后置的方法,可以实现部分以及全部用例的后置") class TestDemo2: def testee01(self): print("this is test_01--") def test_ee02(self,my_fixture): print("test02--") def testee03(self): print("test03--") def test_ee04(self): print("test04--") class TestDemo3: def testee_05(self): print("this is testee_01--") if __name__ == "__main__": pytest.main(['-vs', '.\\Demo2_test.py'])
案例: 使用了别名后,原来的参数就用不了啦
import pytest @pytest.fixture(scope="module",params=["张三","李四"],ids=["zhagnsan","lisi"],name="myfix") def my_fixture(request): print("这里是前置的方法,可以实现部分以及全部用例的前置") yield request.param #yield关键字用来区分前置 和 后置 print("这里是后置的方法,可以实现部分以及全部用例的后置") class TestDemo2: def testee01(self): print("this is test_01--") def test_ee02(self,myfix): print("test02--") print("--"+str(myfix)) def testee03(self): print("test03--") def test_ee04(self): print("test04--") class TestDemo3: def testee_05(self): print("this is testee_01--") if __name__ == "__main__": pytest.main(['-vs', '.\\Demo2_test.py::TestDemo2'])
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)