已有requirements、setup.py的Python/Django包如何使用tox做多版本测试
问题1:使用tox针对多版本进行兼容性测试的方法
- 首先安装tox:
pip install tox - 在项目根目录新建
tox.ini配置文件,示例配置如下:
[tox] # 这里可以根据你需要覆盖的Python、Django、DRF版本自定义envlist envlist = py{36,37,38,39}-django{22,30,31,32}-drf{310,311,312} skipsdist = true [testenv] deps = # 先加载开发依赖 -rrequirements_dev.txt # 按环境变量注入对应版本的核心依赖,会覆盖requirements.txt里的版本定义 django22: Django~=2.2.0 django30: Django~=3.0.0 django31: Django~=3.1.0 django32: Django~=3.2.0 drf310: djangorestframework~=3.10.0 drf311: djangorestframework~=3.11.0 drf312: djangorestframework~=3.12.0 # 如果有私有PyPI源的依赖,在这里加--extra-index-url 你的私有源地址即可 commands = # 替换为你实际执行测试的命令 python -m pytest tests/
- 配置完成后直接执行
tox命令,即可自动为每个版本环境安装对应依赖并运行测试,输出各环境的兼容结果。
问题2:完成测试后install_requires的版本指定规则
你可以继续沿用读取requirements.txt赋值的模式,只需要将requirements.txt中的依赖版本按以下规则调整即可:
- 核心依赖(如Django、DRF)根据测试出的兼容范围设置,比如测试确认兼容Django2.2~3.2所有LTS版本,就写
Django>=2.2,<3.3,不要锁死单个版本避免和用户其他依赖冲突 - 有特定功能绑定的依赖(如django-restql)如果测试发现只有0.13.x版本兼容,就写
django-restql~=0.13.1,限定在兼容的小版本范围内 - 通用工具依赖(如requests、Pillow)只要测试确认最低兼容版本即可,比如
requests>=2.24.0、Pillow>=8.2,不做多余的版本限制 - 私有源依赖保持原写法即可,不需要额外调整
问题3:install_requires和requirements.txt的合理定义方式
两者的职责要做明确拆分:
- install_requires(对应你现在的requirements.txt内容):只存放项目运行必须的最小依赖集合,版本为兼容范围,不包含任何开发、测试相关的依赖,保证用户安装你的包时只会安装必要的依赖,不会出现冗余包或版本冲突
- requirements.txt:和install_requires内容保持一致即可,如果需要固定版本用于部署场景,可以单独生成
requirements-lock.txt,用pip freeze导出所有依赖的精确版本,专门给部署用 - requirements_dev.txt:只存放开发、测试阶段需要的依赖(如格式化工具、测试框架、覆盖率工具等),通过
-r requirements.txt继承运行依赖即可,不要混入运行依赖放到install_requires中
内容的提问来源于stack exchange,提问作者Gonzalo
相关产品推荐
相关产品推荐

