讲师中心 微信公众号
AI工具推荐 视频效率加速

如何解决 Jenkins 中 pytest 参数化测试被跳过的问题

阿瑶同学_5463

阿瑶同学_5463

发布时间:2025-12-31 17:45:18

|

382人浏览过

|

来源于php中文网

原创

如何解决 Jenkins 中 pytest 参数化测试被跳过的问题

pytest 在 jenkins 中执行时因测试收集阶段早于资源准备导致参数化函数返回空列表,进而使测试被跳过;本地或手动运行正常是因为工作区残留文件掩盖了问题。核心在于将动态资产发现逻辑移至 pytest 会话启动阶段。

在使用 @pytest.mark.parametrize 进行动态参数化时,pytest 会在测试收集(collection)阶段立即调用参数生成函数(如 get_asset()),而此时测试环境尚未初始化、fixture 尚未执行,且关键外部资源(如测试资产文件)可能还未就位。该问题在 Jenkins 环境中尤为突出,原因在于:

  • Jenkins 默认启用 workspace cleanup:每次构建前清空工作区,确保环境干净;
  • 但 get_asset() 在 collection 阶段执行:此时 'asset' 目录尚不存在或为空 → get_file_list(...) 返回空迭代器 → parametrize 接收空列表 → pytest 将整个测试标记为 skipped(实际是“无参数可生成”,而非显式跳过);
  • 本地/手动运行看似正常:因历史构建残留了 asset/ 目录及文件,get_asset() 能成功返回路径列表,测试得以生成并执行。

正确做法:推迟资产发现至会话启动阶段

应避免在 parametrize 中直接调用依赖文件系统的函数。推荐使用 pytest_sessionstart 钩子,在 pytest 会话初始化后、测试收集前,预加载资产列表并缓存到全局配置中:

Jenkins
Jenkins

通过 REST API 与 Jenkins CI/CD 服务器交互。适用于触发构建、查询状态、查看控制台输出、管理任务或监控 Jenkins...

下载
# conftest.py
import pytest
from pathlib import Path
from typing import List

def get_file_list(directory: Path) -> List[Path]:
    return [f for f in directory.rglob("*") if f.is_file()]

def get_asset() -> List[Path]:
    asset_dir = Path(__file__).parent / "asset"
    return [asset for asset in get_file_list(asset_dir) if "need_to_skip_asset" not in str(asset)]

def pytest_sessionstart(session):
    """在测试收集前加载资产列表,并存入 config 对象"""
    try:
        assets = get_asset()
        session.config._assets_cache = assets  # 自定义属性缓存
        print(f"[pytest_sessionstart] Loaded {len(assets)} assets.")
    except Exception as e:
        session.config._assets_cache = []
        print(f"[pytest_sessionstart] Warning: Failed to load assets: {e}")

def pytest_generate_tests(metafunc):
    """动态注入参数:仅当测试函数需要 'asset' 参数且缓存存在时生效"""
    if "asset" in metafunc.fixturenames:
        assets = getattr(metafunc.config, "_assets_cache", [])
        if assets:
            metafunc.parametrize("asset", assets, ids=lambda x: x.name)
        else:
            # 可选:抛出错误而非静默跳过,便于 CI 快速失败
            raise RuntimeError("No test assets found. Check 'asset/' directory existence and permissions.")

同时,更新你的测试函数,移除 @pytest.mark.parametrize 的直接调用,改由 pytest_generate_tests 统一管理:

# test_app.py
def test_app_launch_asset(app_binary, asset):
    """Test Application Function"""
    print(f'Application: {app_binary}')
    print(f'Asset: {asset}')

    applib.execute(
        cmd=[str(app_binary), str(asset)],
        timeout=15,
    )

注意事项与最佳实践

  • ? 不要在 conftest.py 顶层或 parametrize 中执行 I/O 操作:collection 阶段无 fixture 上下文,且不可预测环境状态;
  • ? 在 Jenkins 中验证清理行为:添加构建步骤 ls -la asset/ 或 find . -name "asset" -type d -exec ls -la {} \;,确认目录是否真实存在;
  • ⚠️ 权限与路径一致性:确保 Jenkins agent 以正确用户运行,且 CURRENT_MODULE_PATH 在 CI 中解析为预期路径(建议用 Path(__file__).parent 替代);
  • ? 失败即止优于静默跳过:如示例中所示,在 pytest_generate_tests 内对空资产列表抛出 RuntimeError,可让 Jenkins 构建明确失败,避免误判“测试通过”;
  • ? 资产预置更可靠:若资产固定,建议通过 Jenkins Pipeline 的 archiveArtifacts 或 copyArtifact 提前部署,而非依赖运行时发现。

通过将资源准备逻辑上移到 pytest_sessionstart,你确保了所有后续测试收集和执行均基于一致、就绪的上下文——这既是 pytest 插件开发的最佳实践,也是 CI/CD 环境中稳定运行自动化测试的关键保障。

热门AI工具

更多
火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

相关专题

更多
PHP 命令行脚本与自动化任务开发
PHP 命令行脚本与自动化任务开发

本专题系统讲解 PHP 在命令行环境(CLI)下的开发与应用,内容涵盖 PHP CLI 基础、参数解析、文件与目录操作、日志输出、异常处理,以及与 Linux 定时任务(Cron)的结合使用。通过实战示例,帮助开发者掌握使用 PHP 构建 自动化脚本、批处理工具与后台任务程序 的能力。

426

2025.12.13

Figma AI自动化智能数据填充与交互生成实战
Figma AI自动化智能数据填充与交互生成实战

告别机械重复,详细演示如何用 AI 填充业务真实数据,并自动为页面添加交互连线,将静态设计稿快速转变为动态原型。

245

2026.05.13

Conan创建软件包配方指南
Conan创建软件包配方指南

本专题介绍通过conanfile.py创建软件包的方法,讲解包名、版本、依赖和构建设置等基础信息,以及source、build、package、package_info等常用方法的作用及编写思路。

0

2026.09.22

Conan二进制包配置指南
Conan二进制包配置指南

本专题介绍Conan根据操作系统、编译器、架构和构建类型生成二进制包的方法,讲解Profile、Settings、Options及Package ID的作用,帮助管理不同平台和编译环境下的包版本。

0

2026.09.22

Conan私有仓库搭建教程
Conan私有仓库搭建教程

本专题系统的讲解Conan私有仓库的搭建流程,涵盖仓库服务部署、存储目录配置、用户认证、权限划分和远程地址添加,并介绍内部C++依赖包的上传、下载及版本维护方法。

0

2026.09.22

loomy官网入口地址合集
loomy官网入口地址合集

本专题汇总了 Loomy 桌面 AI 助理的官方入口地址合集及使用指南。提供 macOS 与 Windows 客户端下载 。Loomy 是讯飞推出的桌面级 AI 工作搭子,支持文件整理、数据分析、网页操作及通过飞书/钉钉远程操控电脑,助你高效完成本地办公任务 。

0

2026.09.22

NumPy常见函数使用方法
NumPy常见函数使用方法

本专题整理 NumPy 常见函数使用方法相关教程,覆盖函数大全、参数用法、数组运算、统计聚合、排序处理、where 条件筛选、linspace 创建数列等常用场景,帮助读者快速掌握 NumPy 函数调用思路和实际数据处理技巧。

0

2026.09.22

NumPy性能优化版本更新与常见报错排查
NumPy性能优化版本更新与常见报错排查

本专题整理 NumPy 性能优化、版本更新与常见报错排查相关教程,覆盖向量化计算、广播性能、内存布局、NumPy 2.0 升级、版本兼容冲突、安装导入报错、dtype 溢出、矩阵运算异常和 broadcasting 报错修复,帮助读者系统掌握 NumPy 性能调优与问题定位方法。

20

2026.09.22

Vibeknow在线使用入口合集
Vibeknow在线使用入口合集

本专题汇总了Vibeknow在线创作视频的官方入口及网页版使用教程,涵盖PPT、PDF、Word等文档一键转讲解视频的核心操作,并整理了免费版水印规则与手机端浏览器访问指南,助你快速将知识内容视频化。

20

2026.09.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
uni-app从入门到实战教程
uni-app从入门到实战教程

共0课时 | 0人学习

uni-app x harmony开发指南
uni-app x harmony开发指南

共0课时 | 0人学习

uni-app鸿蒙运行和发行
uni-app鸿蒙运行和发行

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn