python pytest单元测试
前言:py web开发使用,简单的记录下python pytest单元测试的使用
pytest.fixture
@pytest.fixture
用于定义测试用例中可复用的资源或环境设置。
关于fixture作用范围
Scope | 描述 |
---|---|
function | 默认值。每次调用测试函数时都会创建和销毁资源。适合需要独立环境的测试场景。 |
class | 在整个测试类中共享资源。所有属于该类的测试函数将共享同一个资源实例。 |
module | 在整个模块中共享资源。模块内的所有测试函数将共享同一个资源实例,指一个.py 文件,通常以test_*.py 或*_test.py 命名 |
session | 在整个测试会话中共享资源。所有测试文件中的所有测试函数将共享同一个资源实例。 |
模块与测试类的主要区别
特性 | 模块 (Module) | 测试类 (Test Class) |
---|---|---|
组织方式 | 组织在 .py 文件中 | 组织在类中 |
作用范围 | 整个文件 | 类内部 |
包含内容 | 测试函数、测试类、fixture | 测试方法、类级别的 fixture |
执行顺序 | 按文件中定义顺序 | 按类中定义顺序 |
资源管理 | 支持模块级别的 fixture | 支持类级别的 fixture |
适用场景 | 简单的测试场景 | 需要逻辑分组或共享资源的复杂场景 |
实际使用
在实际环境中,我们一般使用@pytest.fixture
将可复用的资源进行修饰,比如数据库资源句柄,事件循环等
如下图所示,我们通过scope="module"
将其设置作用域为module,那么之后在这个测试用例中相关的数据库句柄始终使用的都是该db
,同样的事件循环event
也是如此。
@pytest.fixture(scope="module") def db(): """模拟数据库会话""" db_user = os.getenv('POSTGRES_USER') db_pass = os.getenv('POSTGRES_PASSWORD') db_host = os.getenv('POSTGRES_HOST') db_port = os.getenv('POSTGRES_PORT') db_name = os.getenv('POSTGRES_DB') # 构建数据库连接字符串 database_url = f'postgresql://{db_user}:{db_pass}@{db_host}:{db_port}/{db_name}' engine = create_engine(database_url, echo=False, pool_size=50, max_overflow=100) SessionLocal = sessionmaker(autoflush=True, bind=engine) session = SessionLocal() try: yield session finally: session.close() @pytest.fixture(scope="class") def event_loop(): """Create an instance of the default event loop for each test case.""" import asyncio loop = asyncio.get_event_loop_policy().new_event_loop() yield loop loop.close() @pytest.mark.asyncio async def test_ingress_data(db): # 查询ingress数据 ingress = db.query(Ingress).filter( Ingress.tl_domain == 'gztyre.com', Ingress.protocol.in_(['http', 'https']), ).all() # 打印数据测试 for info in ingress: print(info.url, info.nuclei)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
2024-02-18 ADScan 域渗透工具
2020-02-18 PE 重定位表
2020-02-18 PE 导入表以及在逆向中的问题