当前位置: 首页 > news >正文

Python 高手编程系列八十四:测试环境与依赖兼容性

环境隔离的重要性在本书中已经提到很多次了。通过在应用程序级(虚拟环境)和系
统级(系统虚拟化)上隔离执行环境,你可以确保测试可以在可重复的条件下运行。这样,
你可以避免受因破坏依赖关系导致的罕见且模糊的问题。
正确隔离测试环境的最佳方法是使用支持系统虚拟化的持续集成系统。对于开源项目
有很好的免费解决方案,如 Travis CI(Linux 和 OS X)或 AppVeyor(Windows),但是如
果你需要这样的东西来测试私有的软件,很可能你需要花一些时间,在一些现有的开源 CI
工具(GitLab CI、Jenkins 和 Buildbot)之上,自己构建这样的解决方案。
依赖矩阵测试
大多数情况下,开源 Python 项目的测试矩阵主要关注不同的 Python 版本,很少关注
不同的操作系统。对于纯 Python 并且没有与操作系统互相操作问题的项目,没有必要在不
同的系统上进行测试和构建。但是有一些项目,特别是作为编译的 Python 扩展分发时,应
该在各种目标操作系统上进行测试。对于开源项目,甚至不得不使用几个独立的 CI 系统进
行构建,用来适配 3 种最流行的操作系统(Windows、Linux 和 Mac OS X)。如果你正在寻
找一个很好的例子,你可以看一下这个小 pyrilla 项目(参考 https://github.com/swistakm/
pyrilla),这是一个简单的 C 音频 Python 扩展。它同时使用 Travis CI 和 AppVeyor,目的是
为了提供 Windows 和 Mac OS X 的编译版本以及大范围的 CPython 版本。
但是测试矩阵的维度不会局限在系统和 Python 版本上。提供与其他软件(如缓存、数
据库或系统服务)集成的软件包通常应在各种版本的集成应用程序上进行测试。tox(参考
http://tox.readthedocs.org)是一个好工具,可以使这样的测试更加容易。它提供了一种简单的方法来配置多个测试环境并使用一个 tox 命令运行所有测试。它是一个非常强大和灵活
的工具,并且也很容易使用。展示它的用法的最好的方式是给你一个配置文件的例子,其
实它就是 tox 的核心。这里有一个 tox.ini 文件,它来自 django-userena 项目(参考 https://
github.com/bread-andpepper/django-userena):
[tox]
downloadcache = {toxworkdir}/cache/
envlist =
; py26 support was dropped in django1.7
py26-django{15,16},
; py27 still has the widest django support
py27-django{15,16,17,18,19},
; py32, py33 support was officially introduced in django1.5
; py32, py33 support was dropped in django1.9
py32-django{15,16,17,18},
py33-django{15,16,17,18},
; py34 support was officially introduced in django1.7
py34-django{17,18,19}
; py35 support was officially introduced in django1.8
py35-django{18,19}
[testenv]
usedevelop = True
deps =
django{15,16}: south
django{15,16}: django-guardian<1.4.0
django15: django1.5.12
django16: django
1.6.11
django17: django1.7.11
django18: django
1.8.7
django19: django1.9
coverage: django
1.9
coverage: coverage4.0.3
coverage: coveralls
1.1
basepython =
py35: python3.5
py34: python3.4
py33: python3.3
py32: python3.2
py27: python2.7
py26: python2.6
commands={envpython} userena/runtests/runtests.py userenaumessages
{posargs}
[testenv:coverage]
basepython = python2.7
passenv = TRAVIS TRAVIS_JOB_ID TRAVIS_BRANCH
commands=
coverage run --source=userena userena/runtests/runtests.py
userenaumessages {posargs}
coveralls
这个配置允许你在 5 个不同版本的 Django 和 6 个版本的 Python 上测试 django-userena
项目。并不是每个 Django 版本都可以在每个 Python 版本上工作,tox.ini 文件使得定义
这样的依赖性约束相对容易。在实践中,整个构建矩阵包括 21 个唯一的环境(包括用于代
码覆盖收集的特殊环境)。手动创建每个测试环境需要付出很多努力,即使使用 shell 脚本
也不太容易。
Tox 是很棒,但如果我们想改变测试环境中其他一些不是纯 Python 依赖的元素,它的
使用会变得很复杂。有这样一种情况,当我们需要在不同版本的系统包和支持服务上测试
时。解决这个问题的最好方法是再次使用良好的持续集成系统,这可以使你能够轻松地定
义环境变量的矩阵并在虚拟机上安装系统软件。使用 Travis CI 的一个很好的例子是 ianitor
项目(参考 https://github.com/ClearcodeHQ/ianitor/),在第 9 章,文档化你的项目中已经提
到过它。这是一个简单的实用程序,用于 Consul 服务发现。Consul 项目拥有一个非常活跃
的社区,每年都会发布很多版本。对该服务的各种版本进行测试是很有必要的。这确保
ianitor 项目仍然是该软件的最新版本,并且也不会破坏与以前的 Consul 版本的兼容性。以
下是 Travis CI 的.travis.yml 配置文件的内容,它允许你针对 3 个不同的 Consul 版本和
4 个 Python 解释器版本进行测试如下所示:
language: python
install: pip install tox --use-mirrors
env:
matrix:

consul 0.4.1

  • TOX_ENV=py27 CONSUL_VERSION=0.4.1
  • TOX_ENV=py33 CONSUL_VERSION=0.4.1
  • TOX_ENV=py34 CONSUL_VERSION=0.4.1
  • TOX_ENV=py35 CONSUL_VERSION=0.4.1
  • consul 0.5.2

  • TOX_ENV=py27 CONSUL_VERSION=0.5.2
  • TOX_ENV=py33 CONSUL_VERSION=0.5.2
  • TOX_ENV=py34 CONSUL_VERSION=0.5.2
  • TOX_ENV=py35 CONSUL_VERSION=0.5.2

consul 0.6.4

  • TOX_ENV=py27 CONSUL_VERSION=0.6.4
  • TOX_ENV=py33 CONSUL_VERSION=0.6.4
  • TOX_ENV=py34 CONSUL_VERSION=0.6.4
  • TOX_ENV=py35 CONSUL_VERSION=0.6.4

coverage and style checks

  • TOX_ENV=pep8 CONSUL_VERSION=0.4.1
  • TOX_ENV=coverage CONSUL_VERSION=0.4.1
    before_script:
  • wget https://releases.hashicorp.com/consul/KaTeX parse error: Expected group after '_' at position 25: …ERSION}/ consul_̲{CONSUL_VERSION}_linux_amd64.zip
  • unzip consul_${CONSUL_VERSION}_linux_amd64.zip
  • start-stop-daemon --start --background --execpwd/consul –
    agent -server -data-dir /tmp/consul -bootstrap-expect=1
    script:
  • tox -e $TOX_ENV
    前面的示例为 ianitor 代码提供了 14 个唯一的测试环境(包括 pep8 和 coverage 构
    建)。此配置还使用 tox 在 Travis VM 上创建实际测试虚拟环境。实际上,这是一个非常流
    行的方法,用于 tox 与不同的 CI 系统的整合。通过将更多的测试环境配置迁移到 tox 中,
    你可以降低将自己锁定到单个供应商的风险。诸如安装新服务或定义系统环境变量的事情,
    大多数 Travis CI 竞争对手都支持,因此如果市场上有更好的产品,或者 Travis 改变对开源
    项目的定价模型,你可以很容易地切换到其他的服务提供商。
http://www.gsyq.cn/news/1514460.html

相关文章:

  • 从引脚到PCB:用UC3843设计一个12V/2A开关电源的保姆级实战教程
  • 2026年当下,重庆家长如何联系正规的中考体育培训机构? - 品牌鉴赏官2026
  • 说到常州ECO棉床垫,我踩过的坑你们别踩 - 深圳市民HLL
  • 保姆级教程:用TransCAD 6.0搞定公交线路动态分段与站点定位(附实验数据)
  • 保姆级教程:用Deeplabcut从零标注小鼠行为视频(附完整配置文件修改指南)
  • LLM驱动的人力资源能力建模技术演进与实践
  • 百度网盘提取码智能获取:如何用3秒解决传统搜索的5分钟难题?
  • 2026年青岛发电机出租公司哪家可靠?实测6家服务商表现,附避坑指南 - 优质品牌商家
  • 用FreeRTOS和裸机代码两种方式理解STM32平衡小车PID控制逻辑
  • 2026年高杆桂花苗木基地评价解析:从品种到工程应用的多维观察 - 优质品牌商家
  • 从‘为什么拒贷我’到‘AI医生怎么看片’:可解释性AI(XAI)如何重塑我们与算法的信任关系
  • 电赛备赛笔记:用STM32驱动AD9959信号发生器模块,从接线到出波保姆级教程
  • 自适应系统中的运行时伦理挑战与解决方案
  • 2026年近期,选择诚信的平板除雾器品牌为何成为企业的关键决策? - 品牌鉴赏官2026
  • shell作业
  • 保姆级教程:从零集成华为ScanKit到你的Android项目(含权限、依赖、回调全流程)
  • Win11 专属部署教程,OpenClaw 智能体稳定运行方案【包含安装包】
  • Plain Craft Launcher 2:快速上手指南与完整功能解析
  • 那一刻,智能锡膏管理改变了工厂的命运
  • 别再死记硬背公式了!用Cadence DC仿真,手把手教你搞定180nm工艺下gm/Id的精确设计
  • 西安陕西 央国企事业单位银行券商互联网企业招聘信息整合
  • 保姆级教程:用STM32CubeMX和HAL库驱动MPU6050,实现姿态解算(附DMP库移植避坑指南)
  • 航司采购需求解析LLM调优:基于2026年大模型后训练范式的深度实践
  • 【新手零配置运行】 OpenClaw,桌面智能助手搭建全过程(含安装包)
  • 2026年|降AI率收藏!学长实测10款AI智能降重工具红黑榜:论文降AI避坑(含免费降低AI率办法)
  • 草本头疗到底怎么样?一人一方针对护理
  • 基于主题建模的心理量表简化方法研究
  • 前端焦点管理与键盘导航:从 Tab 顺序到无障碍交互的工程实践
  • 2026年6月大件物流厂家推荐,大件物流/大件运输,大件物流公司口碑推荐 - 品牌推荐师
  • 当法理介入情场:家理律师入驻《爱情保卫战》,重构情感调解的理性坐标 - 外贸老黄