[Pytest][Part 3]检测python package状态

 

目录

实现需求1:

检查python package状态——pkg_resource

hook实现自动检测包状态

conftest.py

hook钩子函数


Part1:

https://blog.csdn.net/x1987200567/article/details/144915315?spm=1001.2014.3001.5501

从这里开始逐个实现Part1中的需求

实现需求1:

测试开始前检查测试需要的python package是否安装完成,若未安装完成,则安装缺失的package

检查python package状态——pkg_resource

python中的pkg_resource库是用来管理python中的包的,这个库提供了检查python安装包的API:

pkg_resources.require()

import pkg_resources
package = "pytest-repeat>=0.9.1"#若已安装对应版本的包,则返回对应的包以及相关联的包信息,否则返回exceptiontry:pkg_resources.require(package)except pkg_resources.DistributionNotFound:print(f"package not found {package}")except pkg_resources.VersionConflict:print(f"package version is wrong {package}")

 当require没有找到相应的package时就会返回不同的exception,那么根据这些不同的exception来install 或者upgrade 对应的包。

import pkg_resources
package = "pytest-repeat>=0.9.1"#若已安装对应版本的包,则返回对应的包以及相关联的包信息,否则返回exceptiontry:pkg_resources.require(package)except pkg_resources.DistributionNotFound:subprocess.check_call([sys.executable, "-m", "pip", "install", package])except pkg_resources.VersionConflict:subprocess.check_call([sys.executable, "-m", "pip", "install", "--upgrade", package])else:print(f"{package} is already meet requirement")

上面执行Install和upgrade的操作时用到了这一行代码

subprocess.check_call([sys.executable, "-m", "pip", "install", package])

subprocess 是python中用于执行cmd命令的一个库,check_call()是其中一个方法。当check_all()执行成功时返回0,失败时返回非0。接收一个list作为参数。

def check_call(*popenargs, **kwargs):"""Run command with arguments.  Wait for command to complete.  Ifthe exit code was zero then return, otherwise raiseCalledProcessError.  The CalledProcessError object will have thereturn code in the returncode attribute.The arguments are the same as for the call function.  Example:check_call(["ls", "-l"])"""

所以实现python package检测的完整实现代码如下:

import subprocess
import sys
import pkg_resourcesdef check_package_status(requirements_file='requirements.txt'):"""use to check if python packages needed in test are all installed , if not , install package:param requirements_file: python package needed in the test:return:"""logger.info("checking required python package status.....")try:with open(requirements_file, 'r') as file:requirements = file.readlines()for requirement in requirements:package = requirement.strip()try:pkg_resources.require(package)except pkg_resources.DistributionNotFound:logger.info(f"{package} is not installed. Installing...")subprocess.check_call([sys.executable, "-m", "pip", "install", package])except pkg_resources.VersionConflict as e:logger.error(f"Version conflict for {package}: {e}. Updating...")subprocess.check_call([sys.executable, "-m", "pip", "install", "--upgrade", package])else:logger.info(f"{package} is already installed.")except Exception as e:logger.exception(f"Error while checking/installing packages: {e}")

hook实现自动检测包状态

上面已经实现了包检测这个功能,那么下面的问题是如何实现每次测试开始之前都自动检测包的状态。pytest中提供的hook钩子函数这个功能可以帮我们快速实现这个需求。

conftest.py

这里放一段官方的介绍,大概意思是conftest.py是一个共享test fixture的文件,所有的test fixture 都定义在conftest.py中。作用范围可以是整个项目,也可以是文件夹内。如果作用域是整个项目,那么需要放在项目的根目录下。

The conftest.py file serves as a means of providing fixtures for an entire directory. Fixtures defined in a conftest.py can be used by any test in that package without needing to import them (pytest will automatically discover them).

You can have multiple nested directories/packages containing your tests, and each directory can have its own conftest.py with its own fixtures, adding on to the ones provided by the conftest.py files in parent directories.

hook钩子函数

hook也是在conftest.py中实现的,实现方式比较简单。pytest_sessionstart()是pytest提供的一个钩子函数,在session被创建之后,收集和执行测试case之前被调用,所以可以执行一些测试前的配置和检查工作。

pytest_sessionstart(session)[source]

Called after the Session object has been created and before performing collection and entering the run test loop.

Parameters

session (pytest.Session) – The pytest session object.

Return type

None

 

def check_package_status(requirements_file='requirements.txt'):pass# 测试开始时检查当前的测试配置
@pytest.hookimpl(tryfirst=True)
def pytest_sessionstart(session):check_package_status()

这样就完成了测试开始前对python package的自动检测和安装功能。完整代码为:

import pkg_resources
import subprocess
import sys
import utils.TestLogger as testLoggerlogger = testLogger.TefLogger().get_logger()def check_package_status(requirements_file='requirements.txt'):"""use to check if python packages needed in test are all installed , if not , install package:param requirements_file: python package needed in the test:return:"""logger.info("checking required python package status.....")try:with open(requirements_file, 'r') as file:requirements = file.readlines()for requirement in requirements:package = requirement.strip()try:pkg_resources.require(package)except pkg_resources.DistributionNotFound:logger.info(f"{package} is not installed. Installing...")subprocess.check_call([sys.executable, "-m", "pip", "install", package])except pkg_resources.VersionConflict as e:logger.error(f"Version conflict for {package}: {e}. Updating...")subprocess.check_call([sys.executable, "-m", "pip", "install", "--upgrade", package])else:logger.info(f"{package} is already installed.")except Exception as e:logger.exception(f"Error while checking/installing packages: {e}")# 测试开始前检查当前的测试配置
@pytest.hookimpl(tryfirst=True)
def pytest_sessionstart(session):check_package_status()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/90160.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/90160.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自定义时间范围选择组件使用教程(基于 Vue 3 + Element Plus)

🕓 自定义时间范围选择组件使用教程(基于 Vue 3 Element Plus)✅ 一个灵活实用的时间范围选择器,支持开始时间、结束时间、快捷时间选项、本地双向绑定、插槽扩展等功能。–📘 一、功能介绍 该组件基于 Element Plus …

YOLOv8 模型转换 ONNX 后 C# 调用异常:一个参数引发的跨平台适配难题

一、问题背景:从 Python 训练到 C# 部署的跨平台需求 作为一名 C# 开发者,我在完成 YOLOv8 模型训练(使用 Ultralytics 官方框架,训练数据为自定义目标检测数据集,输入尺寸 640x640,训练轮次 100 轮&#…

Apache Cloudberry 亮相 2025 IvorySQL 生态大会暨 PostgreSQL 高峰论坛

6 月 27 日至 28 日,IvorySQL 2025 生态大会暨 PostgreSQL 高峰论坛在泉城济南顺利召开。本届大会由 IvorySQL 开源数据库社区主办、瀚高基础软件股份有限公司承办,吸引了来自国内外的数据库技术专家、开发者与开源爱好者齐聚一堂,聚焦数据库…

CMake之CMakeLists.txt语法规则

本文主要参考正点原子的应用开发手册,仅作为本人学习笔记使用。 目录 cmake 的使用方法其实还是非常简单的,重点在于编写 CMakeLists.txt,CMakeLists.txt 的语法规则也简单,并没有 Makefile的语法规则那么复杂难以理解&#xff01…

Mysql专题复习

重点内容:1. Mysql架构:客户端 Server层 存储引擎2. 索引数据结构:B树4. 索引优化:覆盖索引、排序、JOIN、分页; COUNT; 索引下推;单/双路排序5. 数据库事务; 锁;隔离级别&#xff…

CLIP的tokenizer详解

一、bytes_to_unicodedef bytes_to_unicode():"""Returns list of utf-8 byte and a corresponding list of unicode strings.The reversible bpe codes work on unicode strings.This means you need a large # of unicode characters in your vocab if you wa…

【如何判断Linux系统是Ubuntu还是CentOS】

要确定您的操作系统是 Ubuntu 还是 CentOS,可以通过以下方法快速检查: 方法 1:通过终端命令(推荐) 在终端中执行以下命令之一: 查看 /etc/os-release 文件 cat /etc/os-releaseUbuntu 特征:显示…

RISCV Linux 虚拟内存精讲系列二 -- Linux 入口 head.S

通过 Linux 的构建系统,即 Linux 源代码的根目录下的 Makefile,能够找到 vmlinux 的链接文件,从而能够查看其入口代码 head.S:_start, 如下: Linux 构建系统主Makefile: vmlinux.lds: head.S: 找到该入口后&#xff0c…

springAI学习:Advisors

spring AI Advisors类似于拦截器,会对请求的prompt做出特定的修改和增强(比如传入历史沟通记录、搜索信息等等),以达到完善prompt的目的。通过Advisors API,开发人员可以创建更为复杂、可重用、可维护的AI组件。下面介…

MySQL CDC与Kafka整合指南:构建实时数据管道的完整方案

一、引言:现代数据架构的实时化需求 在数字化转型浪潮中,实时数据已成为企业的核心资产。传统批处理ETL(每天T1)已无法满足以下场景需求: 实时风险监控(金融交易)即时个性化推荐(电商…

MATLAB | 绘图复刻(二十一)| 扇形热图+小提琴图

前段时间在小红书刷到了一个很有特色的热力图,由大佬滚筒洗衣机创作,感觉很有意思,尝试 MATLAB 复刻: 作者使用的是 python 代码,赶快去瞅瞅。 复刻效果 正文部分 0.数据准备 数据需要一个用来画热图的矩阵以及一个…

批量PDF转换工具,一键转换Word Excel

软件介绍 今天为大家推荐一款高效的Office文档批量转换工具,能够快速将Word和Excel文件批量转换为PDF格式。 软件特点 这款名为"五五Excel word批量转PDF"的工具体积小巧,不到2M大小,却能实现强大的批量转换功能&#xff0c…

面试150 基本计算器

思路 利用栈(stack)来保存进入括号前的计算状态(包括当前计算结果和符号),以便在括号结束后正确恢复计算上下文。代码通过遍历字符串,识别数字、加号、减号和括号。遇到数字时构造完整数值;遇到…

源哈希(sh)解析

源哈希(Source Hashing)是一种负载均衡算法,它根据请求的源 IP 地址(或其他标识符)生成哈希值,然后根据这个哈希值将请求分配到特定的后端服务实例。这种方法常用于确保来自同一客户端的请求始终被路由到同…

axios的使用以及封装

前言: 在现代前端开发中,网络请求是不可避免的核心功能之一。无论是获取后端数据、提交表单信息,还是与第三方 API 交互,高效且可靠的 HTTP 请求库至关重要。axios 作为一款基于 Promise 的 HTTP 客户端,凭借其简洁的 …

github上部署自己的静态项目

前置知识1、要在github部署项目要提交打包后的静态文件(html,css,js)到仓库里2、我们看下github所提供给我们的部署方式有啥,如下所见;要么是/root文件夹(就说仓库里全是打包后的产物:html,css,js要全部放到…

能源管理综合平台——分布式能源项目一站式监控

综合性的能源企业管理面临着项目多、分布散、信息孤岛等问题,分布式的多项目能源在线监控管理平台是一种集成了多个能源项目的数据采集、监控、分析和管理的系统。平台集成GIS能力,能够展示项目的整体分布态势,对不同地点、不同类型的能源项目…

修改阿里云vps为自定义用户登录

win系统上找到控制面板-->用户账户-->更改账户类型点击更改账户类型,此时我们看到vps的默认管理员账户Administrator。为了防止vps被别人使用默认账户Administrator攻击,我们添加一个用户账户,点击添加用户账户。 用户名建议奇葩点&…

Linux: perf: debug问题一例,cpu使用率上升大约2%;多线程如何细化cpu及perf数据分析

文章目录 前提面临的问题内核级别函数的差别继续debug总结根据pid前提 一个进程安置在一个CPU上,新功能上线之后,固定量的业务打起来,占用的CPU是42%。之前没有新功能的情况下,CPU占用是40%。差了大约2%。而且这个进程里的线程数非常多,有50多个线程。从差距看变化不大,…

计算阶梯电费

实现一个 Python 程序,根据使用的电量(从控制台中让用户输入)计算需要交的电费,电量分为两个阶梯,小于 200 度和大于 200 度,如果电量小于等于 200 度,电价就是 0.5 元/度,如果电量大…