资讯动态

pytest 相关使用

发布时间:2026/8/15 17:52:02 来源:尧图企业网站定制
测试夹具这个装饰器 pytest.fixture(scopeclass, autouseTrue) 是 Python 测试框架 pytest 中非常强大的组合主要用于定义测试夹具Fixture。pytest.fixture: 基础定义scopeclass: 作用域生命周期autouseTrue: 自动执行1. 核心含义拆解scopeclass (类级作用域)含义: 这个 fixture 在整个测试类的生命周期中只执行一次。执行时机:Setup (前置): 在该类中的第一个测试方法运行之前执行。Teardown (后置): 在该类中的最后一个测试方法运行完毕后执行如果有 yield 语句。对比: 默认的 scopefunction 是每个测试方法运行前都会执行一次。autouseTrue (自动调用)含义: 你不需要在测试方法如 def test_xxx(self)的参数中显式请求这个 fixture也不需要用 pytest.mark.usefixtures 装饰。效果: 只要测试类被执行这个 fixture 就会自动生效。2. 总结它的整体作用当你在一个方法上加上 pytest.fixture(scopeclass, autouseTrue) 时意味着“在运行这个类里面的任何测试之前请自动帮我执行这段代码等这个类里所有测试都跑完了再帮我清理环境。而且这一切都不需要我在测试函数里手动调用。”3.fixture内容一般在conftest.py (共享机制) 中·这是一个特殊的文件。定义在 conftest.py 里的 fixture无需 import 就可以在同级及子目录下的所有测试文件中直接使用。4. 应用场景这种配置通常用于资源昂贵且需要类级别共享的初始化操作例如数据库连接: 为一个测试类开启一个数据库连接所有测试方法共用这个连接最后关闭。浏览器启动 (Selenium/Playwright): 打开一次浏览器在这个类里做多个页面的操作测试最后关闭浏览器。加载大型配置文件/数据集: 读取一次大文件供类中所有方法读取。跳过执行用例根据前面在初始化类或每一条用例中的变量值进行跳过操作背景目前项目由多个有一部分用例的某一个或几个项目需要执行其他项目不需要执行所以需要设置跳过执行的功能。 如果在执行前就确认执行的是哪个项目就非常简单用最基础的skip方法即可看最后一份代码但我采用的动态获取原理是在conftest中从某些值中动态判断车型种类并赋值变量所以需要第一种方法。最终可实现方法如下aimport pytest from loguru import logger class Test_A: #setup_class 类中初始化一次此处可省略但是由于实际中我的框架必须要用到夹具所以先保留 pytest.fixture(scope class, autouse True) def setup_class(self, ): logger.info( 测试开始 ) def setup_method(self): # def setup_method(selfobj): 每条用例前执行 self.vec_obj robo # 实际是 obj.ipd.vec_obj # self.if_robo self.vec_obj robo def test_camera_drive(self): if self.vec_obj robo : pytest.skip(运行时条件不满足跳过测试) assert True def test_ccccccccc(self): if self.if_robo: assert True else: pytest.skip(运行时条件不满足跳过测试) if __name__ __main__: pytest.main([-v, -s, __file__])b 在 setup_class中也可以但是不能使用 pytest.fixture(scope class, autouse True) 不然就不生效了import pytest from loguru import logger class Test_A: #setup_class 类中初始化一次 def setup_class(self): # def setup_class(selfobj): 每条用例前执行 self.vec_obj robo # 实际是 obj.ipd.vec_obj # self.if_robo self.vec_obj robo def test_camera_drive(self): if self.vec_obj robo : pytest.skip(运行时条件不满足跳过测试) assert True def test_ccccccccc(self): if self.if_robo: assert True else: pytest.skip(运行时条件不满足跳过测试) if __name__ __main__: pytest.main([-v, -s, __file__])跳过用例执行的基础用法介绍import pytest import sys pytest.mark.skip(reason此功能在V2.0版本才实现暂不执行) # 无条件跳过 def test_a(): assert False # 根据Python版本跳过 pytest.mark.skipif(sys.version_info (3, 8), reason需要Python 3.8或更高版本) def test_b(): assert True # 根据自定义条件跳过例如环境变量或配置 is_production True pytest.mark.skipif(is_production, reason生产环境下不运行此破坏性测试) def test_c(): assert 12 if __name__ __main__: pytest.main([-v, -s, __file__])

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价