Cer*_*rin 24 python unit-testing travis-ci tox python-unittest
如何在Travis-CI中使用Tox测试不同的Python版本?
我有一个tox.ini:
[tox]
envlist = py{27,33,34,35}
recreate = True
[testenv]
basepython =
py27: python2.7
py33: python3.3
py34: python3.4
py35: python3.5
deps =
-r{toxinidir}/pip-requirements.txt
-r{toxinidir}/pip-requirements-test.txt
commands = py.test
Run Code Online (Sandbox Code Playgroud)
它运行我的Python单元测试在几个Python版本,并完美地工作.
我想在Travis-CI中设置一个构建,当我将更改推送到Github时自动运行它,所以我有一个.travis.yml:
language: python
python:
- "2.7"
- "3.3"
- "3.4"
- "3.5"
install:
- pip install tox
script:
- tox
Run Code Online (Sandbox Code Playgroud)
这在技术上似乎有效,但它在每个Python版本中冗余地运行我的所有测试......来自每个版本的Python.因此,需要5分钟的构建需要45分钟.
我尝试python从我的yaml文件中删除列表,因此Travis只运行一个Python实例,但这导致我的Python3.5测试失败,因为找不到3.5解释器.显然,这是一个已知的限制,因为Travis-CI不会安装Python3.5,除非您在配置中指定了确切的版本......但它不会为其他版本执行此操作.
有没有办法解决这个问题?
小智 27
为此,我会考虑使用tox-travis.这是一个插件,允许使用Travis CI的多个python版本和Tox的完全可配置性.为此,您将配置.travis.yml文件以使用Python进行测试:
sudo: false
language: python
python:
- "2.7"
- "3.4"
install: pip install tox-travis
script: tox
Run Code Online (Sandbox Code Playgroud)
这将运行适当的testenvs,默认情况下,任何声明的env都使用py27或py34作为名称的因子.如果没有环境匹配给定因子,Py27或py34将用作后备.
Way*_*lan 20
为了获得更多控制和灵活性,您可以手动定义矩阵,以便Python版本和tox环境匹配:
language: python
matrix:
include:
- python: 2.7
env: TOXENV=py27
- python: 3.3
env: TOXENV=py33
- python: 3.4
env: TOXENV=py34
- python: 3.5
env: TOXENV=py35
- python: pypy
env: TOXENV=pypy
- env: TOXENV=flake8
install:
- pip install tox
script:
- tox
Run Code Online (Sandbox Code Playgroud)
如果不明显,矩阵中的每个条目都以一个以连字符(-)开头的行开始.该行后面的任何项目都是缩进的,是该单个项目的附加行.
例如,除了最后一个条目之外的所有条目都是两行.最后一个条目只有一行,不包含python设置; 因此,它只使用默认的Python版本(根据Travis文档的Python 2.7).当然,特定的Python版本对于该测试并不重要.如果你想对Python 2和3(每次一次)运行这样的测试,那么建议默认使用Travis安装的版本(2.7和3.4),这样测试就可以更快地完成,因为它们不需要首先安装非标准的Python版本.例如:
- python: 2.7
env: TOXENV=flake8
- python: 3.4
env: TOXENV=flake8
Run Code Online (Sandbox Code Playgroud)
除了Python版本2.5-3.6之外,它同样适用于pypy(矩阵的倒数第二个条目)和pypy3(未显示).
虽然各种其他答案提供了最终为您提供此结果的快捷方式,但有时它有助于手动定义矩阵.然后,您可以为矩阵中的各个环境定义特定的内容.例如,您可以仅为单个环境定义依赖关系,并避免在每个环境中安装该依赖关系所浪费的时间.
- python: 3.5
env: TOXENV=py35
- env: TOXENV=checkspelling
before_install: install_spellchecker.sh
- env: TOXENV=flake8
Run Code Online (Sandbox Code Playgroud)
在上面的矩阵中,install_spellchecker.sh脚本仅针对相关环境运行,而不针对其他环境运行.使用该before_install设置(而不是install),因为使用该install设置将覆盖全局install设置.但是,如果这是你想要的(覆盖/替换全局设置),只需在矩阵条目中重新定义它.毫无疑问,也可以为矩阵内的各个环境定义各种其他设置.
手动定义矩阵可以提供很大的灵活性.但是,如果您不需要增加灵活性,其他答案中的各种快捷方式之一将使您的配置文件更简单,以后更容易阅读和编辑.
Travis为每个测试提供python版本TRAVIS_PYTHON_VERSION,但是在表单中'3.4',同时tox期望'py34'.
如果您不想依赖外部lib(tox-travis)进行翻译,可以手动执行:
language: python
python:
- "2.7"
- "3.3"
- "3.4"
- "3.5"
install:
- pip install tox
script:
- tox -e $(echo py$TRAVIS_PYTHON_VERSION | tr -d .)
Run Code Online (Sandbox Code Playgroud)
在搜索引擎中搜索此模式,您将找到许多使用它的项目.
这也适用于pypy:
tox -e $(echo py$TRAVIS_PYTHON_VERSION | tr -d . | sed -e 's/pypypy/pypy/')
Run Code Online (Sandbox Code Playgroud)
资料来源:flask-mongoengine的.travis.yml.
TOXENV环境变量可用于通过指定的矩阵为每个版本的 Python 选择测试子集:
language: python
python:
- "2.7"
- "3.4"
- "3.5"
env:
matrix:
- TOXENV=py27-django-19
- TOXENV=py27-django-110
- TOXENV=py27-django-111
- TOXENV=py34-django-19
- TOXENV=py34-django-110
- TOXENV=py34-django-111
- TOXENV=py35-django-19
- TOXENV=py35-django-110
- TOXENV=py35-django-111
install:
- pip install tox
script:
- tox -e $TOXENV
Run Code Online (Sandbox Code Playgroud)
在 tox 配置中指定跳过缺少的 Python 版本:
[tox]
skip_missing_interpreters=true
Run Code Online (Sandbox Code Playgroud)