Python 测试运行器 Nox 详解
===================================
Nox 是灵活的 Python 测试运行器,通过 noxfile.py 定义多个测试会话,
自动为每个会话创建独立的虚拟环境,适用于多版本测试。
一、安装与基本概念
------------------
# 安装 Nox
# pip install nox
# 验证安装
nox --version
# Nox 的核心概念:
# · Session(会话):一个测试任务,在独立虚拟环境中运行
# · noxfile.py:定义所有会话的配置文件
# · 每个会话可以指定不同的 Python 版本和依赖
# 列出所有可用的会话
nox --list
二、noxfile.py 基础
-------------------
# 基本的 noxfile.py 文件
"""
import nox
# 指定会话使用的 Python 版本
@nox.session(python=["3.9", "3.10", "3.11"])
def tests(session):
# 安装依赖
session.install("pytest", "pytest-cov")
# 安装项目本身
session.install(".")
# 运行命令
session.run("pytest", "tests/", "--cov=src")
@nox.session
def lint(session):
# 代码检查会话
session.install("ruff")
session.run("ruff", "check", "src/")
@nox.session
def type_check(session):
# 类型检查会话
session.install("mypy")
session.install(".")
session.run("mypy", "src/")
"""
# 运行所有会话
nox
# 运行特定会话
nox -s tests
# 运行多个会话
nox -s tests lint
三、高级会话配置
----------------
# 参数化会话与精细控制
"""
import nox
# 使用参数化标签
@nox.session(tags=["core"])
@nox.parametrize("django", ["3.2", "4.0", "4.1"])
def tests(session, django):
# 安装特定版本的 Django
session.install(f"django=={django}")
session.install("pytest", "pytest-django")
session.install(".")
session.run("pytest", "tests/")
@nox.session(python="3.11", venv_backend="conda")
def conda_tests(session):
# 使用 Conda 创建虚拟环境
session.install("numpy", "scipy")
session.run("pytest", "tests/")
"""
# 查看参数化会话
nox --list
# 按标签运行会话
nox --tags core
四、虚拟环境管理
----------------
# Nox 为每个会话自动创建和管理虚拟环境
# 配置虚拟环境后端
"""
import nox
# 可选的 venv_backend 值:
# · "virtualenv" (默认)
# · "conda"
# · "venv"
@nox.session(venv_backend="virtualenv")
def example(session):
# 默认后端,需要安装 virtualenv
session.install("pytest")
@nox.session(venv_backend="venv")
def stdlib_venv(session):
# 使用 Python 标准库 venv
session.install("pytest")
"""
# 复用虚拟环境(加快重复运行速度)
nox -s tests --reuse-existing-virtualenvs
# 强制重新创建虚拟环境
nox -s tests --force-venv
五、会话高级功能
----------------
# 更多装饰器参数和辅助方法
"""
import nox
# 不指定 Python 版本(使用当前环境)
@nox.session(python=False)
def build_docs(session):
# 不创建虚拟环境,使用系统 Python
session.run("sphinx-build", "-b", "html", "docs/", "docs/_build")
@nox.session
def coverage(session):
# 安装依赖
session.install("pytest", "pytest-cov", "coverage")
session.install(".")
# 运行测试并生成覆盖率报告
session.run(
"pytest", "tests/",
"--cov=src",
"--cov-report=html",
"--cov-report=term-missing",
)
# 多个命令连续执行
session.run("coverage", "report", "--fail-under=80")
@nox.session
def integration(session):
# 集成测试会话
session.install("-r", "requirements-dev.txt")
session.install(".")
# 设置环境变量
session.env["DATABASE_URL"] = "sqlite:///test.db"
session.env["DEBUG"] = "true"
session.run("pytest", "tests/integration/", "-v")
"""
六、reuse_venv 与缓存
---------------------
# 控制虚拟环境缓存行为
"""
import nox
# 默认情况下每次运行都会重新创建虚拟环境
# 通过命令行参数控制:
# nox -s tests --reuse-existing-virtualenvs
# 在 noxfile 中设置默认行为
nox.options.reuse_existing_virtualenvs = True
# 或通过环境变量控制
# export NOX_REUSE_VENV=1
@nox.session
def fast_tests(session):
# 安装依赖
session.install("pytest")
session.install(".")
session.run("pytest", "tests/unit/", "-x")
"""
七、与 CI/CD 集成
------------------
# GitHub Actions 配置示例
"""
name: Tests
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.9", "3.10", "3.11"]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- run: pip install nox
- run: nox -s tests --python ${{ matrix.python-version }}
"""
# 只运行未通过的会话
nox -s tests --error-on-missing-interpreters
# 并行运行会话
nox -s tests lint type_check --parallel
# Nox 让多版本测试变得简单可靠,每个会话的隔离性
# 确保测试环境纯净,是 CI 管道的得力助手。
Python测试运行器Nox
张小明
前端开发工程师
PotPlayer字幕翻译插件终极指南:三步实现实时双语字幕
PotPlayer字幕翻译插件终极指南:三步实现实时双语字幕 【免费下载链接】PotPlayer_Subtitle_Translate_Baidu PotPlayer 字幕在线翻译插件 - 百度平台 项目地址: https://gitcode.com/gh_mirrors/po/PotPlayer_Subtitle_Translate_Baidu 还在为观看外语视频时…
AI 编码 Agent 技术深度解析:从 SWE-bench 到代码智能体的自主软件工程架构
AI 编码 Agent 技术深度解析:从 SWE-bench 到代码智能体的自主软件工程架构 目录 摘要 一、AI 编码 Agent 的技术演进脉络 二、SWE-bench:编码 Agent 的"图灵测试" 三、SWE-Agent:Agent-Computer Interface 的开创性设计 四、OpenHands 与 CodeAct:统一代码行动…
评估网络监控工具时必须关注的7个核心问题
网络停机对企业造成的损失往往是巨大的,不仅影响财务表现,更可能破坏业务连续性和企业声誉。研究数据显示,单分钟网络停机成本平均高达9000美元,这还未计入服务协议(SLA)违约金等隐性损失。这一现实凸显了网…
DWG 格式兼容转换的实战应用与价值落地
在工程设计领域,DWG 格式几乎是事实上的标准,但它带来的协作烦恼却从未停止。你是否经历过这样的场景:精心绘制的图纸发给合作伙伴后,对方打开却发现线条错位、字体乱码,甚至直接无法识别?或者当团队需要从…
#三清侠# 最近发现一个超有安全感的“新侠客”[特殊字符]
【定义】“三清侠”:能在生活中,做到“三清三关”(清阳台、清厨房、清走道;关火源、关气源、关电源)的人,能主动消除消防隐患的人。你是不是那个出门前会绕屋检查一圈的人? 看到楼道堆杂物会顺手…
Mac mini缺货涨价,无头MacBook重出江湖成AI新宠!养虾还有啥靠谱选择?
无头MacBook的兴衰大概在四五年前,二手市场上流行过一阵子名为「无头MacBook」的产品。具体而言,它是屏幕坏掉的MacBook,去掉上半部分后,作为一款带键盘和触控板的mini主机售卖。相较于正常的MacBook,其价格便宜很多。…