如何在Tox内使用Travis-CI测试不同的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
在几个Python版本中运行我的Python单元测试并且运行良好。
我想在Travis-CI中设置一个构建,当我将更改推送到Github时自动运行它,所以我有一个.travis.yml
:
language: python
python:
- "2.7"
- "3.3"
- "3.4"
- "3.5"
install:
- pip install tox
script:
- tox
这在技术上似乎有效,但它在每个版本的Python中从每个版本的Python中冗余地运行我的所有测试。因此,需要5分钟的构建需要45分钟。
我尝试从yaml文件中删除python
列表,因此Travis只会运行一个Python实例,但这会导致我的Python3.5测试失败,因为无法找到3.5解释器。显然,除非你在配置中指定了确切的版本,否则Travis-CI不会安装Python3.5,但是它并没有为其他版本做到这一点... {3}}
我有办法解决这个问题吗?
答案 0 :(得分: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
这将运行相应的testenvs,默认情况下,这是任何声明的env,其中py27或py34作为名称的因子。如果没有环境匹配给定因子,Py27或py34将用作后备。
答案 1 :(得分:17)
为了获得更多控制和灵活性,您可以手动定义矩阵,以便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
如果不明显,矩阵中的每个条目都以一个以连字符(-
)开头的行开头。该行后面的任何项目都是缩进的,是该单个项目的附加行。
例如,除了最后一个条目之外的所有条目都是两行。最后一个条目只有一行,不包含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
除了Python版本2.5-3.6之外,同样适用于pypy
(矩阵的倒数第二个条目)和pypy3
(未显示)。
虽然各种其他答案提供了最终为您提供此结果的快捷方式,但有时它有助于手动定义矩阵。然后,您可以为矩阵中的各个环境定义特定的内容。例如,您可以仅为单个环境定义依赖关系,并避免在每个环境中安装该依赖关系所浪费的时间。
- python: 3.5
env: TOXENV=py35
- env: TOXENV=checkspelling
before_install: install_spellchecker.sh
- env: TOXENV=flake8
在上面的矩阵中,install_spellchecker.sh
脚本仅针对相关环境运行,而不针对其他环境运行。使用了before_install
设置(而不是install
),因为使用install
设置会覆盖全局install
设置。但是,如果这是你想要的(覆盖/替换全局设置),只需在矩阵条目中重新定义它。毫无疑问,也可以为矩阵内的各个环境定义各种其他设置。
手动定义矩阵可以提供很大的灵活性。但是,如果您不需要增加灵活性,其他答案中的各种快捷方式之一将使您的配置文件更简单,以后更容易阅读和编辑。
答案 2 :(得分:7)
Travis为每个测试提供TRAVIS_PYTHON_VERSION
的python版本,但格式为'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 .)
在搜索引擎中搜索此模式,您将找到许多使用它的项目。
这也适用于pypy:
tox -e $(echo py$TRAVIS_PYTHON_VERSION | tr -d . | sed -e 's/pypypy/pypy/')
来源:flask-mongoengine' s https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/slice。
答案 3 :(得分:3)
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
在tox配置中指定跳过缺少的Python版本:
[tox]
skip_missing_interpreters=true