You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置tox.ini使指定Python版本环境自动运行所有条件测试

解决方案:用tox元环境自动触发对应版本的所有测试

我刚好遇到过类似的多项目共用CI脚本的场景,这个需求完全可以实现。核心思路是定义元环境(比如py38、py39),让这些元环境自动调用tox运行对应Python版本下的所有测试子环境,不需要手动指定测试类型名称。

最终配置示例

# 定义所有需要运行的测试环境:Python版本 + 测试类型的组合
envlist = py{38,39,310}-{unit,functional,acceptance}

[testenv]
basepython = python
whitelist_externals = make
commands =
    make clean
    unit: pytest unit
    functional: pytest functional
    acceptance: pytest acceptance

# 定义通用的Python版本元环境,匹配所有py3X格式的环境
[testenv:py3*]
# 跳过构建分发包,因为这个环境只是用来触发其他测试环境
skipsdist = true
# 允许调用外部tox命令
whitelist_externals = tox
# 自动运行当前Python版本下的所有测试子环境,{envname}会替换为当前环境名(比如py38)
commands = tox -e "{envname}-*" {posargs}

配置说明

  1. envlist:列出所有可能的测试环境组合(Python版本 + 测试类型),后续新增测试类型(比如performance),只需要在这里添加-performance即可,CI脚本完全不需要修改。
  2. [testenv]:保留你原来的基础测试配置,按测试类型区分不同的pytest命令。
  3. [testenv:py3]*:这是关键的元环境配置:
    • skipsdist = true:告诉tox这个环境不需要构建项目包,因为它只是一个“调度器”。
    • whitelist_externals = tox:允许这个环境调用外部的tox命令,用来触发子环境。
    • commands = tox -e "{envname}-*" {posargs}:{envname}是tox的内置变量,会自动替换为当前环境名(比如你执行tox -e py38时,它会变成py38),{envname}-*会匹配所有以py38-开头的测试环境(比如py38-unit、py38-functional),{posargs}可以传递额外参数给子环境(比如tox -e py38 -- -x会把-x传给所有子环境的pytest,实现失败即停止)。

执行效果

  • 执行tox:会运行envlist里所有的测试环境(所有Python版本 + 所有测试类型)。
  • 执行tox -e py38:会自动运行py38-unit、py38-functional、py38-acceptance(如果envlist里有)所有测试,完全不需要手动指定测试类型。
  • 新增测试类型时,只需要在envlist里添加对应的因子(比如-performance),下次执行tox -e py38就会自动包含py38-performance的测试,CI脚本完全不用改。

注意事项

  • 如果你的Python版本是其他格式(比如py37、py311),只需要调整envlist和元环境的匹配规则(比如[testenv:py*]匹配所有Python版本环境)。
  • 确保你的tox版本支持内置变量{envname}(tox 3.x及以上版本都支持)。
  • 如果需要传递参数给子环境的tox,直接在命令后加--和参数即可,比如tox -e py38 -- --cov。

内容的提问来源于stack exchange,提问作者anilbey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 23:27:40